2016-11-04 125 views
0

我想下面的脚本中从两个不同的文件合并列:粘贴命令

#!/bin/sh 
# 
# 

echo "1 1 1" > tmp1 
echo "2 2 2" >> tmp1 
echo "3 3 3" >> tmp1 

echo "a,b,c" > tmp2 
echo "a,b,c" >> tmp2 
echo "a,b,c" >> tmp2 

paste -d':' <(cut -d" " -f1 tmp1) <(cut -d"," -f 1-2 tmp2) 

上述脚本工作正常,当我运行

bash test.sh 

但是,它确实当我运行

sh test.sh 

,我得到了以下错误消息不起作用

test.sh: line 13: syntax error near unexpected token `(' 
test.sh: line 13: `paste -d':' <(cut -d" " -f1 tmp1) <(cut -d"," -f 1-2 tmp2)' 

有人可以解释这种行为的原因是什么?有没有解决它?谢谢。

+0

['sh'](https://en.wikipedia.org/wiki/Bourne_shell)和['bash'](https://en.wikipedia.org/wiki/Bash_(Unix_shell))是单独的程序(尽管在某些系统中'sh'由于兼容性原因被指向'bash')。实际上没有理由使用'sh'。 – dimo414

+0

@ dimo414当然,除非你正在编写一个能在任何符合POSIX标准的系统上工作的脚本,不管它是否安装了'bash'。 – chepner

+0

@chepner因此“有效”:)但如果你的意图是编写一个Bash脚本,而不是试图支持每个可以调用的仅支持POSIX的环境,那么符合sh的顺序是一个不必要的麻烦。 – dimo414

回答

1

在您的系统上,sh大概未设置为bashdash可能是?)。

进程替换<()bash -ism(实际上来自ksh),它不由POSIX定义,因此不可移植。

所以,你正在使用(sh)的外壳不具有<()实现,因而对(语法错误(如<表示输入重定向,实际上正在表明第(错误)。

0

您可以实现此便携使用的文件描述符

while 
    IFS=" " read -r x rest <&3 
    IFS="," read -r y z rest <&4 
do 
    echo "$x:$y:$z" 
done 3<tmp1 4<tmp2 
1:a:b 
2:a:b 
3:a:b 

与前围

0

<()测试提供了一个语法替代手动管理命名管道。

trap 'rm p1 p2' EXIT 
mkfifo p1 p2 
cut -d " " -f1 tmp1 > p1 & 
cut -d " " -f 1-2 tmp2 > p2 & 

paste -d':' p1 p2