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

cha*_*mps 9 bash shell

我试图在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'
Run Code Online (Sandbox Code Playgroud)

代码片段 -

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

Jon*_*ler 9

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

#!/bin/sh
Run Code Online (Sandbox Code Playgroud)

或者您正在使用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
Run Code Online (Sandbox Code Playgroud)

甚至简单地说:

#!/bin/bash

comm -12 <(sort -u /home/xyz/a.csv1) <(sort -u /home/abc/tempfile) | wc -l
Run Code Online (Sandbox Code Playgroud)

这将获得与回声后跟随捕获相同的效果.测试时,使用bash -x script.shbash script.sh.


解读无法解读的评论

在无法解读(现已删除)的评论中,信息似乎包括:

BASH =/bin/sh
BASHOPTS = cmdhist:extquote:force_fignore:hostcomplete:interactive_comments:progcomp:promptvars:sourcepath
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 =/bin/bash
SHELLOPTS = braceexpand:hashall:interactive-comments:posix
SHLVL = 2

请注意BASH=/bin/shSHELLOPTS=braceexpand:hashall:interactive-comments:posix.这些中的任何一个或两个都可能是问题的主要部分.

  • 是的,当使用bash -x script.sh时,它再次成功运行 (2认同)