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 に直接渡します。「eval」を使用して、Bash に強制的に変数を解析させることができます。

 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 に答える