直接执行shell脚本和通过管道执行shell脚本的区别

直接执行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" :

我的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" : 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
与直接执行相比,直接执行后会自动退出,也会自动退出I
ctrl+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终止。它还能做什么?如果您想在之后与开放会话进行交互,则需要(例如)。