Estou tentando fazer alguns truques com dd. Eu pensei que seria possível armazenar alguns valores hexadecimais em uma variável chamada "cabeçalho" para canalizá-lo em dd.
Meu primeiro passo sem uma variável foi este:
$ echo -ne "\x36\xc9\xda\x00\xb4" |dd of=hex
$ hd hex
00000000 36 c9 da 00 b4 |6....|
00000005
Depois disso, tentei o seguinte:
$ header=$(echo -ne "\x36\xc9\xda\x00\xb4")
$ echo -n $header | hd
00000000 36 c9 da b4 |6...|
00000004
Como você pode ver, perdi meu \x00
valor na $header
variável. Alguém tem uma explicação para esse comportamento? Isto está me enlouquecendo.
linux
bash
shell-script
dd
Frank
fonte
fonte
bash: warning: command substitution: ignored null byte in input
.header="$(echo -ne "\x36\xc9\xda\x00\xb4")"; echo -n "$header" | hd
mesmo resultado.header="\x36\xc9\xda\x00\xb4"; echo -n "$header" | hd
, mas não é a mesma coisa que está armazenando a forma legível por humanos.Respostas:
Você não pode armazenar um byte nulo em uma sequência porque o Bash usa sequências no estilo C, que reservam o byte nulo para terminadores. Portanto, você precisa reescrever seu script para simplesmente canalizar a sequência que contém o byte nulo, sem que o Bash precise armazená-lo no meio. Por exemplo, você pode fazer isso:
Observe, a propósito, que você não precisa
echo
; você pode usar o Bash'sprintf
para muitas outras tarefas simples.Ou, em vez de encadear, você pode usar um arquivo temporário:
Obviamente, isso tem o problema de o arquivo
/tmp/mysequence
já existir. E agora você precisa continuar criando arquivos temporários e salvando seus caminhos em strings.Ou você pode evitar isso usando a substituição de processo:
O
<(command)
operador cria um pipe nomeado no sistema de arquivos, que receberá a saída decommand
.hd
receberá como primeiro argumento o caminho para esse canal - que ele abrirá e lerá quase como qualquer arquivo. Você pode ler mais sobre isso aqui: /unix//a/17117/136742 .fonte
zsh
farão isso, mas apenas no modo nōn-POSIX.) Na verdade, olhei para ele porque estava me perguntando se valia a pena implementá-lo emmksh
…sh
emulação\0
não está no valor padrão de$IFS
.echo "$(printf 'a\0b')"
ainda funciona bem nash
emulação emzsh
.Você pode usar o
zsh
que é o único shell que pode armazenar o caractere NUL em suas variáveis. Por acaso, esse caractere está no valor padrão de$IFS
inzsh
.Ou:
Ou
Ou
No entanto, observe que você não pode passar uma variável como argumento ou variável de ambiente para um comando que é executado, pois os argumentos e as variáveis de ambiente são sequências delimitadas por NUL passadas para a
execve()
chamada do sistema (uma limitação da API do sistema, não do shell ) Nozsh
entanto, você pode passar NUL bytes como argumentos para funções ou comandos internos.fonte
zsh
sintaxe em sua pergunta.echo -n $header
significa passar o conteúdo da$header
variável como último argumento paraecho -n
ézsh
(oufish
ourc
oues
) sintaxe, nãobash
sintaxe. Embash
, isso tem um significado muito diferente . Geralmente,zsh
é comoksh
(bash
o shell GNU, sendo mais ou menos parte do clone doksh
shell de fato do Unix), mas com a maioria das idiossincrasias de design do shell Bourne corrigidas (e muitos recursos extras e muitos mais fácil de usar / menos surpreendente).echo $(printf 'ab\0cd') | od -vAn -tx1c
imprime `61 62 20 63 64 0a`, que é um espaço em que um NUL deve existir.