dd具有多个输出到脚本

use*_*926 0 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
Run Code Online (Sandbox Code Playgroud)

我的问题是,这在终端中有效,但在脚本中无效.这是一个与我尝试执行的语法相同的脚本...

#!/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
Run Code Online (Sandbox Code Playgroud)

我收到以下错误...

~$ sh duplicate5.sh
> duplicate5.sh: 2: duplicate5.sh: Syntax error: "(" unexpected
Run Code Online (Sandbox Code Playgroud)

我不明白为什么它在我的美元提示下工作但不在脚本中.

Jon*_*ler 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
Run Code Online (Sandbox Code Playgroud)

但是在这里使用dd处理替换似乎是多余的:

cat ~/learndir/source.txt |
tee ~/learndir/un.txt ~/learndir/deux.txt ~/learndir/trois.txt ~/learndir/quatre.txt \
    > ~/learndir/cinque.txt
Run Code Online (Sandbox Code Playgroud)

甚至:

tee < ~/learndir/source.txt \
    ~/learndir/un.txt ~/learndir/deux.txt ~/learndir/trois.txt ~/learndir/quatre.txt \
    > ~/learndir/cinque.txt
Run Code Online (Sandbox Code Playgroud)

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

tee < ~/learndir/source.txt > ~/learndir/cinque.txt \
    ~/learndir/un.txt ~/learndir/deux.txt ~/learndir/trois.txt ~/learndir/quatre.txt
Run Code Online (Sandbox Code Playgroud)

要么:

tee ~/learndir/un.txt ~/learndir/deux.txt ~/learndir/trois.txt ~/learndir/quatre.txt \
    < ~/learndir/source.txt > ~/learndir/cinque.txt
Run Code Online (Sandbox Code Playgroud)

等等.