意思是:语法错误,附近出现了意外的符号 `<`。

11
StudentAnwser=()
inputScriptFile=001.sh

while IFS= read -r line;
do
    StudentAnwser+=( "$line" )
done < <( sh $inputScriptFile test.txt )

它返回一个错误

foo.sh: line 22: syntax error near unexpected token `<'
foo.sh: line 22: `  done < <( sh $inputScriptFile test.txt )'

那有什么问题呢?我是按照其他问题的解决方案来读取结果行的。


5
你的脚本第一行是否有 #!/bin/bash?如果没有,请编辑你的问题并包含第一行内容。祝好运。 - shellter
5
不,这是bash的有效语法(但如@shellter所说,对于sh无效)。< <( ... )<<( ... )不同(事实上,后者是错误的)。 - Amadan
“不适用于sh”与你程序的第一行是“不适用于#!/bin/bash”是不同的。如果在脚本中涉及Windows,则使用dos2unix myScript。还有,你是否使用了 chmod 755 myScript?(我已经没有更多想法了)。祝你好运。 - shellter
@shellter 我已经尝试过sh、bash,甚至是csh,但都没有起作用。 - Billy Chan
我也想不出来,因为我可以在终端中复制粘贴并完美运行,但不能在sh / bash / csh脚本文件中运行。 - Billy Chan
显示剩余2条评论
2个回答

25
您遇到错误的原因是 进程替换 (即 <(some command) 部分) 不是在 sh 中标准特性 (POSIX 定义),这意味着它可能在某些操作系统上工作,但在其他操作系统或相同操作系统的不同配置中可能无法正常运行。
您明确表示脚本顶部有 #!/bin/bash,但我猜想您仍然通过 sh foo.sh 运行脚本,因此 #!/bin/bash 将被忽略,脚本将由 sh 解释。
我假设您的默认 shell 是 bash (运行 echo $SHELL),因此,如果您将脚本粘贴到终端并执行,则所有问题都将消失。
==== 更新 ====
如果我的假设正确,则可能的解决方案如下:
保留 #!/bin/bash,使您的脚本通过 chmod +x foo.sh 成为可执行文件。然后通过 ./foo.sh 直接运行它。

1
我放弃使用 sh 或 bash 了。我直接使用 ./foo.sh。 - Billy Chan
@BillyChan:是的,没有一个shell程序员会使用sh foo.sh,我们依赖于"she-bang"行将所有需要的"代码"放在一个文件中。我很高兴Lin能够猜出你在做什么。祝大家好运!P.S.这在S.O.上经常出现..你从哪里得到使用sh foo.sh的想法?它应该被视为"最后的手段"技术(IHMO)而被删除。 - shellter
直接运行 sh 等命令并没有什么问题;只是相比于将脚本设为可执行文件并在 shebang 中指定 shell,需要多打一些字。当然,如果该脚本旨在由另一个期望可执行文件的程序运行,则必须将其设为可执行文件。 - chepner

10
发现另一个解决方案:进程替换不是符合POSIX的功能,并且根据您的系统和shell,可能需要启用它。
在循环之前在脚本中使用以下行:
set +o posix

启用它。也许您的系统根本不支持它,那么这是没有帮助的。


这解决了在将我的bash脚本作为AWS Lambda函数(在Amazon Linux 2上的自定义运行时,x86_64架构)运行时遇到的相同问题。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接