Como fazer o dd falhar se o valor de salto inválido for especificado?

3

Quando invoco dd com um valor inválido para skip , ele imprime uma mensagem de erro e não faz nada, mas não retorna com um valor diferente de 0 , por exemplo,

$ 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

Esse comportamento é irritante quando dd é usado em scripts e eu gostaria de evitar a comunicação de processo ou análise de saída diferente da maneira bem estabelecida de confiar nos códigos de retorno. Como fazer dd os apropriados?

    
por Karl Richter 19.10.2014 / 21:14

1 resposta

1

você pode dividir por zero.

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

Que seja avaliado como "$SKIP/1" ou "$SKIP/0" . Na verdade, não é dd que retorna falso, mas o shell - o que significa que dd nunca é invocado, mas wc é claro. Também pode valer a pena ser executado em um subshell porque um shell não interativo provavelmente sairá do contrário.

Este também é um exemplo básico de bs=1 - você provavelmente teria que fatorar por tamanho de bloco na maioria dos casos ou usar o sinalizador skip-bytes do GNU.

    
por 19.10.2014 / 21:52