[英]Why does process substitution not work in a shell script?
我正在嘗試在 shell 腳本中使用 comm 命令,但出現錯誤:
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 模式下)時,進程替換不可用:
- 進程替換不可用。
你需要寫:
#!/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.sh
或bash 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]="release" [5]="x86_64-redhat-linux-gnu ”)
BASH_VERSION='4.1.2(1)-release'
CVS_RSH=ssh
外殼=/bin/bash
SHELLOPTS=braceexpand:hashall:interactive-comments:posix
SHLVL=2
請注意BASH=/bin/sh
和SHELLOPTS=braceexpand:hashall:interactive-comments:posix
。 這兩者之一或兩者都可能是問題的主要部分。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.