如果指定了无效的跳过值,如何使 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

你可以除以零。

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"。事实上,不是dd返回 false,而是 shell - 这确实意味着它dd从未被调用,但wc当然是。它也可能值得在子 shell 中运行,因为否则非交互式 shell 可能会退出。

这也是一个基本bs=1示例 - 在大多数情况下您可能必须考虑块大小或使用 GNU跳过字节旗帜。

相关内容