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

时间:2015-07-12 19:26:37

标签: linux shell awk

我正在尝试在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

1 个答案:

答案 0 :(得分:8)

目前还不完全清楚,但是你在脚本顶部有一个不正确的shebang线的可能性非常高:

#!/bin/sh

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

  
      
  1. 无法使用流程替换。
  2.   

你需要写:

#!/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

解读无法解读的评论

在难以理解(现已删除)的comment中,信息似乎包括:

  

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] =“发布”[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。这些中的任何一个或两个都可能是问题的主要部分。