遇到一个奇怪的问题

sh/bash/dash/ksh/zsh等Shell脚本
回复
头像
jiandan23
帖子: 86
注册时间: 2010-12-17 22:31
系统: Mint 19.2

遇到一个奇怪的问题

#1

帖子 jiandan23 » 2016-12-12 14:01

我有一个脚本:
[root@mgt ~]# cat -n a.sh
1 echo begin
2 para_compute arg1 arg2
3 echo end
(第2行para_compute是第三方的一个并行计算程序。)

我遇到的问题是:
1. 如果执行bash a.sh,则整个脚本可以顺利执行完,没有报错,最后返回值为0.
2. 如果执行bash < a.sh,则脚本在运行完第2行的para_compute程序之后,就直接退出了,不再往下执行,同样没有报错,返回值为0.

然后我做了两个测试:
1. 将第2行改为 para_compute arg1 arg2 && echo ok,然后运行bash < a.sh,同样只能运行到第2行,且能输出ok,说明para_compute的计算没有问题(para_compute的输出日志也显示该并行程序是能顺利计算完毕的)
2. 将第2行改为eval para_compute arg1 arg2,然后运行bash < a.sh,该脚本能全部运行完。

问题:
为什么bash a.sh可以运行完,而bash < a.sh却不可以,为什么加上eval para_compute ...之后就又可以运行完了?
头像
lilydjwg
论坛版主
帖子: 4249
注册时间: 2009-04-11 23:46
系统: Arch Linux
联系:

Re: 遇到一个奇怪的问题

#2

帖子 lilydjwg » 2016-12-13 22:32

你的 para_compute 对标准输入做了某种处理(比如如果不是终端,那么读取数据)。

改成 compute arg1 arg2 </dev/null 试试?

还不行就上 strace。
头像
jiandan23
帖子: 86
注册时间: 2010-12-17 22:31
系统: Mint 19.2

Re: 遇到一个奇怪的问题

#3

帖子 jiandan23 » 2016-12-14 15:15

试了一下,改成 compute arg1 arg2 </dev/null,就可以了,多谢!
但我还有两点不明白的地方:
1) compute命令应该是bash的子进程,它为什么能影响到父进程对文件的读写?照道理来说,子进程会继承父进程的文件描述符,但那应该只是拷贝吧,难道父子进程会共享同一个文件描述符吗?
2)为什么加上eval,也能解决这个问题?eval对文件描述符会造成什么影响吗?

希望高人指点一下。
头像
lilydjwg
论坛版主
帖子: 4249
注册时间: 2009-04-11 23:46
系统: Arch Linux
联系:

Re: 遇到一个奇怪的问题

#4

帖子 lilydjwg » 2016-12-14 16:14

子进程继承的是文件描述符,意思就是共享了文件描述符。
eval 的事情不清楚。
回复