dd具有多个输出到脚本

时间:2014-06-15 21:13:54

标签: bash dd

我想制作一个文件的多个副本,我能够像这样做......

dd if=~/learndir/source.txt | tee >(dd of=~/learndir/un.txt) | tee >(dd of=~/learndir/deux.txt) | tee >(dd of=~/learndir/trois.txt) | tee >(dd of=~/learndir/quatre.txt) | dd of=~/learndir/cinque.txt

我的问题是这可以在终端中使用,但不能在脚本中使用。这是一个与我尝试执行的语法相同的脚本...

#!/bin/sh

dd if=~/learndir/source.txt | tee >(dd of=~/learndir/un.txt) | tee
>(dd of=~/learndir/deux.txt) | tee >(dd of=~/learndir/trois.txt) | tee >(dd of=~/learndir/quatre.txt) | dd of=~/learndir/cinque.txt

我收到以下错误...

~$ sh duplicate5.sh
> duplicate5.sh: 2: duplicate5.sh: Syntax error: "(" unexpected

我不明白为什么它可以在我的美元提示下工作,但不能在脚本中工作。

1 个答案:

答案 0 :(得分:5)

您的shell为/bin/bash/bin/bash的行为与/bin/sh不同。在脚本中使用#!/bin/bash,它应该没问题。此外,脚本中有一个坏的换行符。

顺便说一下,tee的单个副本可以在一次调用中写入多个文件:

dd if=~/learndir/source.txt |
tee >(dd of=~/learndir/un.txt) \
    >(dd of=~/learndir/deux.txt) \
    >(dd of=~/learndir/trois.txt) \
    >(dd of=~/learndir/quatre.txt) |
dd of=~/learndir/cinque.txt

但是在这里使用ddprocess substitution似乎是多余的:

cat ~/learndir/source.txt |
tee ~/learndir/un.txt ~/learndir/deux.txt ~/learndir/trois.txt ~/learndir/quatre.txt \
    > ~/learndir/cinque.txt

甚至:

tee < ~/learndir/source.txt \
    ~/learndir/un.txt ~/learndir/deux.txt ~/learndir/trois.txt ~/learndir/quatre.txt \
    > ~/learndir/cinque.txt

I / O重定向可以在此脚本中以任意顺序出现,因此这也有效:

tee < ~/learndir/source.txt > ~/learndir/cinque.txt \
    ~/learndir/un.txt ~/learndir/deux.txt ~/learndir/trois.txt ~/learndir/quatre.txt

或者:

tee ~/learndir/un.txt ~/learndir/deux.txt ~/learndir/trois.txt ~/learndir/quatre.txt \
    < ~/learndir/source.txt > ~/learndir/cinque.txt