0

我正在尝试在将“if”设置为变量的 bash 脚本中获取 dd 命令。变量可能是 /dev/zero 或者可能像 <(yes $'\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
4

2 回答 2

1

Bash 不会解析你的变量的内容并直接将它传递给 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}"
于 2012-07-12T15:49:43.123 回答
0

好的..我想我需要在 dd 前面添加一个“eval”。

所以:

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

作品!我猜它在进行变量替换或类似的事情后会重新解析。

我从这里得到了提示

有趣的是我eval昨天尝试使用但我无法让它工作。我一定是在某处遗漏了一些引用或转义..

于 2012-07-12T18:40:31.950 回答