为什么在shell脚本中使用<()会导致语法错误?

时间:2014-09-12 19:54:33

标签: linux bash shell

我正在编写一个名为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)'

3 个答案:

答案 0 :(得分:5)

<(...)运算符的流程替换是bash功能。您收到该错误消息是因为您的脚本正在执行其他操作(例如dash),或者bash的旧版本,或bash在POSIX兼容模式下运行禁用进程替换的非POSIX功能(谢谢,@chepner!)

如果您想使用功能齐全的bash执行脚本,您有两个选择:

  1. 使用bash运行脚本:

    bash myShellScript.sh 
    
  2. 将脚本的第一行设置为#!/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在某些平台上执行进程替换的方式完全相同。