在shell脚本中粘贴命令

时间:2016-11-04 16:24:59

标签: bash shell sh paste

我尝试在以下脚本中合并来自两个不同文件的列:

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

有人可以解释这种行为的原因是什么?有修复吗? THX。

3 个答案:

答案 0 :(得分:1)

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

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

所以你正在使用的shell(sh)没有<()实现,因此(上的语法错误(如<表示输入重定向所以错误实际上显示的是第一个()。

答案 1 :(得分: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

使用短划线

进行测试

答案 2 :(得分: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