直接执行shell脚本和通过管道执行shell脚本的区别
我的shell脚本名为mongogin.sh,如下所示:直接执行shell脚本和通过管道执行shell脚本的区别,shell,Shell,我的shell脚本名为mongogin.sh,如下所示: #!/bin/sh mongo use demo show tables cat mongoLogin.sh | sh xxx@xxxMacBook-Pro:~/Downloads$cat mongoLogin.sh | sh MongoDB shell version v4.0.3 connecting to: mongodb://127.0.0.1:27017 Implicit session: session { "id" :
#!/bin/sh
mongo
use demo
show tables
cat mongoLogin.sh | sh
xxx@xxxMacBook-Pro:~/Downloads$cat mongoLogin.sh | sh
MongoDB shell version v4.0.3
connecting to: mongodb://127.0.0.1:27017
Implicit session: session { "id" : UUID("43c55950-f9e2-49ca-a458-
611f8c71eae4") }
MongoDB server version: 4.0.3
switched to db demo
test
bye
上面的功能是登录mongo并显示名为demo的数据库表如果我通过以下方式直接执行:
sh mongoLogin.sh
它起作用了。但是,如果我按以下方式执行:
#!/bin/sh
mongo
use demo
show tables
cat mongoLogin.sh | sh
xxx@xxxMacBook-Pro:~/Downloads$cat mongoLogin.sh | sh
MongoDB shell version v4.0.3
connecting to: mongodb://127.0.0.1:27017
Implicit session: session { "id" : UUID("43c55950-f9e2-49ca-a458-
611f8c71eae4") }
MongoDB server version: 4.0.3
switched to db demo
test
bye
与直接执行相比,直接执行后会自动退出,也会自动退出Ictrl+c
。管道后面的sh
命令似乎将创建一个新的子流程,并且由于某种原因,该子流程将完成。是否有某种方法可以通过管道执行脚本来实现相同的结果 更新: 当直接执行时,似乎只有第一个命令生效,因为下面的命令是mongo操作而不是shell命令。当我通过管道执行它时,所有命令都会生效,但它会自动退出 通过管道执行的输出如下:
#!/bin/sh
mongo
use demo
show tables
cat mongoLogin.sh | sh
xxx@xxxMacBook-Pro:~/Downloads$cat mongoLogin.sh | sh
MongoDB shell version v4.0.3
connecting to: mongodb://127.0.0.1:27017
Implicit session: session { "id" : UUID("43c55950-f9e2-49ca-a458-
611f8c71eae4") }
MongoDB server version: 4.0.3
switched to db demo
test
bye
这两种变体都不起作用,因为
use-demo
不是有效的shell命令
我没有使用mongo,但是如果命令接受来自stdin的输入,您可以尝试
mongo <<OGNOM
use demo
show tables
OGNOM
mongo这两个变体都不起作用,因为use-demo
不是有效的shell命令
我没有使用mongo,但是如果命令接受来自stdin的输入,您可以尝试
mongo <<OGNOM
use demo
show tables
OGNOM
mongo似乎使用demo
在通过管道执行脚本时生效。我已经添加了它的输出。在您的示例中,您只是将“脚本”的行(最好不要将其视为脚本,而只是将其视为一组输入行)输入到sh
的stdin中。一旦sh
看到mongo
行,它就会启动mongo,现在所有stdin都会转到mongo。这意味着use
行被输入mongo。@user1934428是的,我非常同意你的看法。但现在的问题是它会自动退出,这不是我所期望的。当输入文件结束时,会发送一个EOF,这会导致mongo终止。它还能做什么?如果您想在之后与打开的会话进行交互,您需要这样的东西(例如)。似乎使用demo
在通过管道执行脚本时生效。我已经添加了它的输出。在您的示例中,您只是将“脚本”的行(最好不要将其视为脚本,而只是将其视为一组输入行)输入到sh
的stdin中。一旦sh
看到mongo
行,它就会启动mongo,现在所有stdin都会转到mongo。这意味着use
行被输入mongo。@user1934428是的,我非常同意你的看法。但现在的问题是它会自动退出,这不是我所期望的。当输入文件结束时,会发送一个EOF,这会导致mongo终止。它还能做什么?如果您想在之后与开放会话进行交互,则需要(例如)。