簡體   English   中英

為什么進程替換在 shell 腳本中不起作用?

[英]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 模式下)時,進程替換不可用:

  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:progco‌mp: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/shSHELLOPTS=braceexpand:hashall:interactive-comments:posix 這兩者之一或兩者都可能是問題的主要部分。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM