当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 4 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : 遇到一个奇怪的问题
帖子发表于 : 2016-12-12 14:01 

注册: 2010-12-17 22:31
帖子: 38
送出感谢: 2
接收感谢: 0 次
我有一个脚本:
[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 ...之后就又可以运行完了?


页首
 用户资料  
 
2 楼 
 文章标题 : Re: 遇到一个奇怪的问题
帖子发表于 : 2016-12-13 22:32 
头像

注册: 2009-04-11 23:46
帖子: 4130
系统: Arch Linux
送出感谢: 11
接收感谢: 124
你的 para_compute 对标准输入做了某种处理(比如如果不是终端,那么读取数据)。

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

还不行就上 strace。


_________________
我的博客 https://blog.lilydjwg.me/
提问的智慧
Arch Linux 中文论坛

我的vimrc: https://git.io/vimrc


页首
 用户资料  
 
3 楼 
 文章标题 : Re: 遇到一个奇怪的问题
帖子发表于 : 2016-12-14 15:15 

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

希望高人指点一下。


页首
 用户资料  
 
4 楼 
 文章标题 : Re: 遇到一个奇怪的问题
帖子发表于 : 2016-12-14 16:14 
头像

注册: 2009-04-11 23:46
帖子: 4130
系统: Arch Linux
送出感谢: 11
接收感谢: 124
子进程继承的是文件描述符,意思就是共享了文件描述符。
eval 的事情不清楚。


_________________
我的博客 https://blog.lilydjwg.me/
提问的智慧
Arch Linux 中文论坛

我的vimrc: https://git.io/vimrc


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 4 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 0 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译