我正在编写一个名为myShellScript.sh
的shell脚本,其中包含以下文本:
echo *** Print out this line ****
diff <(./myProgram) <(./otherProgram)
但是,当我运行sh myShellScript.sh
时,我收到以下错误:
-bash-4.2$ sh myShellScript.sh
myShellScript.sh **** Print out this line **** myShellScript.sh
myShellScript.sh: line 2: syntax error near unexpected token `('
myShellScript.sh: line 2: `diff <(./myProgram) <(./otherProgram)'
答案 0 :(得分:5)
<(...)
运算符的流程替换是bash
功能。您收到该错误消息是因为您的脚本正在执行其他操作(例如dash
),或者bash
的旧版本,或bash
在POSIX兼容模式下运行禁用进程替换的非POSIX功能(谢谢,@chepner!)
如果您想使用功能齐全的bash执行脚本,您有两个选择:
使用bash
运行脚本:
bash myShellScript.sh
将脚本的第一行设置为#!/bin/bash
(或系统中bash
的路径),并运行如下脚本:
./myShellScript.sh
答案 1 :(得分:3)
您需要使用bash执行脚本,而不是sh。
您正在使用进程替换,这不是标准的POSIX shell功能。 sh
是与POSIX兼容的shell,因此它不支持像进程替换这样的语言扩展。如果以sh
调用Bash,则Bash将启用POSIX兼容性。
因此,您应该使用bash
执行需要Bash特定功能的脚本。
答案 2 :(得分:1)
您显然似乎在使用bash
,但对于阅读此内容且需要使用不支持进程替换的shell的任何人,您可以使用以下内容:
# Instead of diff <(./myProgram) <(./otherProgram)
# A pair of named pipes to avoid using disk space
# for the output of myProgram and otherProgram
mkfifo myProgram.output
mkfifo otherProgram.output
./myProgram > myProgram.output &
./otherProgram > otherProgram.output &
diff myProgram.output otherProgram.output
rm myProgram.output otherProgram.output
这几乎与bash
在某些平台上执行进程替换的方式完全相同。