当subprocess更改磁盘上的文件时,Bash循环失败

这段代码已经失败了好几天了,而且我的智慧已经结束了。 也许有人可以帮忙。

我已经编写了一个应该通过托pipeLinux系统循环的bash脚本。 它调用另一个bash脚本获得8个字段的logging:

local cmd="/usr/local/sbin/zlsexpirations -s -l $nodeList" local expList # list of nodes and expiration days expList=`$cmd` # run the command 

所以variables'expList'有logging。 然后它应该遍历所有将它们传递给函数zSetOneSystem()的logging,以一次处理一个系统。 这是主循环(expList周围的双引号需要传递一个logging,而不只是一个令牌):

 local nextLine while read nextLine; do zVerbose "calling zSetOneSystem $nextLine" zSetOneSystem $nextLine done < <(echo "$expList") 

这是我第一次尝试循环:

 echo "$expList" | while read nextLine; do zVerbose "calling zSetOneSystem $nextLine" zSetOneSystem $nextLine done 

上面的循环都有这样的行为:

  1. 如果传递-n标志(无操作),则循环运行良好以完成。
  2. 如果该标志没有被传递,则循环运行,处理一个系统(这将导致文件在磁盘上被更改),但是循环只是停止。

当我追踪它时,'read nextLine'失败。 循环之后我打印出'expList',所有logging仍然存在。 子stream程如何以这种方式影响父母? 我已经缩小到了zSetOneSystem()中嵌套更深的两个bash脚本调用。 如果我注意到这两个,循环成功。 如果我对两个bash脚本中的任何一个取消注释,则循环将按照所述进行失败。 奇怪。

任何帮助将不胜感激。

谢谢。

您将input传递给标准input(文件描述符0)上的while循环。 从标准input读取的循环的任何命令都将消耗该stream ,使内容不能再次read 。 这是将标准input传递给有效的多个命令的常见问题。 解决此问题的最简单方法是使用循环内的命令不太可能使用的文件描述符,例如:

 while read -u "$fd" line do commands… done {fd}< <(input command(s))