如何在使用sh而不是bash运行的脚本中使用进程replace?

我正在尝试在shell脚本中通信命令,但得到一个错误:

a.sh: command substitution: line 1: syntax error near unexpected token `(' a.sh: command substitution: line 1: `comm -12 <( sort /home/xyz/a.csv1 | uniq) <( sort /home/abc/tempfile | uniq) | wc -l' 

代码片段

 temp=`comm -12 <( sort /home/xyz/a.csv1 | uniq) <( sort /home/abc/tempfile | uniq) | wc -l` echo $temp 

目前还不完全清楚,但是您的脚本的顶部有一个不正确的shebang行的机会非常高:

 #!/bin/sh 

或者在测试时使用sh script.sh而不是bash script.sh ,或者在环境中设置了SHELL=/bin/sh或类似的东西。 您的失败是在进程替换代码。 当Bash以sh (以POSIX模式 )运行时,则进程替换不可用:

  1. 过程替换不可用。

你需要写:

 #!/bin/bash temp=$(comm -12 <(sort -u /home/xyz/a.csv1) <(sort -u /home/abc/tempfile) | wc -l) echo $temp 

甚至简单地说:

 #!/bin/bash comm -12 <(sort -u /home/xyz/a.csv1) <(sort -u /home/abc/tempfile) | wc -l 

这将实现与回波之后的捕捉相同的效果。 测试时,使用bash -x script.shbash script.sh


破译无法解读的评论

在一个难以辨认的(现在被删除的) 评论中 ,这些信息似乎包括:

BASH = / bin / sh的
BASHOPTS = cmdhist:extquote:force_fignore:hostcomplete:interactive_comments:progcomp:promptvars:源路径
BASH_ALIASES =()
BASH_ARGC =()
BASH_ARGV =()
BASH_CMDS =()
BASH_LINENO =([0] = “0”)
BASH_SOURCE =([0] = “a.sh”)
BASH_VERSINFO =([0] =“4”[1] =“1”[2] =“2”[3] =“1”[4] =“release”[5] =“x86_64-redhat-linux-gnu “)
BASH_VERSION = '4.1.2(1)-release'
CVS_RSH = SSH
SHELL = /斌/庆典
SHELLOPTS = braceexpand:hashall:交互式评论:POSIX
SHLVL = 2

请注意, BASH=/bin/shSHELLOPTS=braceexpand:hashall:interactive-comments:posix 。 其中之一或两者都可能是问题的主要部分。