無効なスキップ値が指定された場合にddが失敗するようにする方法は?

無効なスキップ値が指定された場合にddが失敗するようにする方法は?

dd無効な値で呼び出すとエラーメッセージが表示され、何もしませんが、次skipの値は返されません。0

$ cd /tmp
$ mkdir xy
$ cd xy
$ truncate -s 2M test.img
$ dd if=test.img of=test-2.img skip=3M
dd: 'test.img': cannot skip to specified offset
0+0 records in
0+0 records out
0 bytes (0 B) copied, 0,000141862 s, 0,0 kB/s
$ echo $?
0

この動作は、スクリプトで使用すると面倒で、dd戻りコードに依存するよく確立された方法とは異なるプロセス通信や出力の解析を避けたいと思います。dd正しいものを作る方法?

答え1

0 に分けることができます。

G=$(($((M=$((K=1024))*$K))*$K))
IF=./source_file SKIP=$((3*$M))
dd "if=$IF" "skip=$(($SKIP/($SKIP<$(wc -c <"$IF"))))"

計算結果は"$SKIP/1"またはです"$SKIP/0"。実際、ddfalseを返すのではなく、シェルはこれを行います。これはdd呼び出されなかったことを意味しますが、wcもちろん呼び出されます。サブシェルで実行することも価値があるかもしれません。そうしないと、非対話型シェルが終了する可能性があるためです。

これも基本的なbs=1例です。ほとんどの場合、ブロックサイズを考慮するか、GNUを使用する必要があります。バイトをスキップバナー。

関連情報