bash语法错误“exec 11<<& - ”

时间:2014-10-27 14:28:26

标签: bash

您好我有一个bash脚本会抛出错误:

scriptx.sh:第276行:意外令牌附近的语法错误`&'

错误发生在此代码段的最后一行:

find * -type f > $loopfile
exec 11<$loopfile
while read file; do
  # Here some process....
  :
done
exec 11<<&-

目的是什么:

exec 11<$loopfile
exec 11<<&-

感谢。

2 个答案:

答案 0 :(得分:2)

bash手册页中的两个部分与此相关。

  

重定向输入

     

重定向输入会导致名称来自扩展的文件   打开用于读取文件描述符n的单词,或者   标准输入(文件描述符0),如果未指定n。

   The general format for redirecting input is:

          [n]<word

  

复制文件描述符

     

重定向运算符

   [n]<&word
     

用于复制输入文件描述符。如果单词扩展为一个或   更多的数字,由n表示的文件描述符被作为的副本   那个文件描述符。如果单词中的数字未指定文件   描述符打开输入,发生重定向错误。如果单词评估   到 - ,文件描述符n关闭。如果未指定n,则   使用标准输入(文件描述符0)。

因此第一行exec 11<$loopfile打开文件描述符11以打开读取输入,输入设置为来自$loopfile

第二行exec 11<<&-然后关闭(由第一行打开)描述符11 ...或者更确切地说,这不是因为chepner注意到我在初始阅读时掩盖了语法错误。正确的行应为exec 11<&-以关闭fd。

要回答OP自我回答中提出的后续问题,除非这个脚本在某个地方使用fd 11,这些行似乎没有任何意义。我通常会认为这将由read在该循环中使用,但需要-u 11(并且可以使用while read file; do ... done <$loopfile轻松完成)。

答案 1 :(得分:0)

抛出错误是因为关闭文件描述符只需要一个重定向操作符11<&-,脚本有两个:11<<&-

关于如何使用它的代码示例:

exec 11<$loopfile  # File descriptor 11 is made copy of $loopfile
while read -u 11 file; do
   : # process
done
exec 11<&-          # File descriptor 11 is closed.

复制文件描述符有什么好处?