当我使用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跳过字节旗帜。