Bash问题与变量中的进程替换

时间:2012-07-11 21:32:10

标签: bash process substitution

我正在尝试在bash脚本中获取dd命令,并将“if”设置为变量。 变量可以是/ dev / 0或者可以是复杂的 <(是$'\'01'| tr -d“\ n”)

我似乎可以让后者工作。

write_file=/dev/zero
dd if=$write_file bs=2048 seek=1 of=/dev/sda count=524288

有效。

write_file="<(yes $'\01' | tr -d "\n")"
dd if=$write_file bs=2048 seek=1 of=/dev/sda count=524288

这不起作用。我得到了

dd: invalid option -- 'd'
Try `dd --help' for more information.

但如果我直接

dd if=<(yes $'\01' | tr -d "\n") bs=2048 seek=1 of=/dev/sda count=524288
脚本中的

工作正常。

我确信有一些需要完成的转义,但我不会在bash专家附近找出如何做到这一点!

更新:尝试以下建议

write_file="<(yes $'\01' | tr -d \"\n\")"
dd if="$write_file" bs=2048 seek=1 of=/dev/sda count=524288

得到了

dd: opening `<(yes $\'\\01\' | tr -d "\\n")': No such file or directory

2 个答案:

答案 0 :(得分:0)

Bash不会解析变量的内容并将其直接传递给dd,dd不知道如何处理它。 您可以强制Bash使用“eval”解析变量:

 write_file="<(yes $'\01' | tr -d \"\n\")"
 command="dd if=$write_file bs=2048 seek=1 of=/dev/sda count=524288"
 eval "${command}"

答案 1 :(得分:0)

好吧..我想我需要在dd前面“eval”。

这样:

write_file="<(yes $'\x5a' | tr -d \"\n\")"
eval dd if=$write_file bs=2048 seek=1 of=/dev/sda count=5242

作品!我猜它在进行变量替换之后会重新解析。

我从here

得到了提示

有趣的是我昨天尝试使用eval,但我无法让它发挥作用。我一定是错过了某些引用或逃避某个地方..