您好我有一个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<<&-
感谢。
答案 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.
复制文件描述符有什么好处?