Representando / citando o NUL na linha de comando

5

Pode AbashB\n ser usado na linha de comando?

Plano de fundo

Para testar casos de canto no GNU Parallel, fiquei curioso para saber se todos os caracteres foram citados corretamente na linha de comando. A maioria deles é:

perl -e 'print pack ("c*",1..255,10)' | parallel -k echo | md5sum
d03484ca75b3e38be411198d66bf4611  -
perl -e 'print pack ("c*",1..255,10)' | md5sum
d03484ca75b3e38be411198d66bf4611  -

Mas echo parece ser complicado (aqui ilustrado com %code% ):

perl -e 'print pack ("c*",65,0,66,10)' | wc -c
4 (A
perl -e 'print pack ("c*",1..255,10)' | parallel -k echo | md5sum
d03484ca75b3e38be411198d66bf4611  -
perl -e 'print pack ("c*",1..255,10)' | md5sum
d03484ca75b3e38be411198d66bf4611  -
B\n) perl -e 'print pack ("c*",65,0,66,10)' | parallel echo | wc -c 2 (A\n) perl -e 'print pack ("c*",65,0,66,10)' | parallel --dry-run echo | wc -c 9 (echo A
perl -e 'print pack ("c*",65,0,66,10)' | wc -c
4 (A%pre%B\n)
perl -e 'print pack ("c*",65,0,66,10)' | parallel echo | wc -c
2 (A\n)
perl -e 'print pack ("c*",65,0,66,10)' | parallel --dry-run echo | wc -c
9 (echo A%pre%B\n)
perl -e 'print "echo ",pack ("c*",65,0,66,10)' | bash | wc -c
3 (AB\n)
B\n) perl -e 'print "echo ",pack ("c*",65,0,66,10)' | bash | wc -c 3 (AB\n)

Eu posso justificar o segundo exemplo: %code% pode ser interpretado como EOS, mas também deve ser o caso no exemplo 4. O exemplo 3 enfatiza que o GNU Parallel não vê %code% como EOS, mas passa para %code% .

Você pode explicar o que está acontecendo - especialmente o caso 4 me confunde.

E mais importante:

Existe uma maneira de citar %code% na linha de comando para que, por exemplo, %code% vai ver?

    
por Ole Tange 11.10.2014 / 21:22

1 resposta

6

Ao executar um comando, a lista de argumentos é uma lista de ponteiros para seqüências terminadas em NUL passadas para a chamada de sistema execve() (assim como as variáveis de ambiente que é a outra lista de sequências terminadas em NUL passadas para execve() ).

Como resultado, argumentos e variáveis de ambiente dos comandos executados não podem conter o caractere NUL.

Exceção a isso são built-ins e funções no shell zsh , cujos argumentos podem conter qualquer coisa (aqueles que são internos, portanto a chamada do sistema execve() não está envolvida).

Você pode passar dados com caracteres NUL via stdin (ou qualquer outro descritor de arquivo) ou em qualquer tipo de arquivo. Ou algum comando entende alguma forma de codificação.

Por exemplo, as implementações em echo do UNIX entendem -e (os dois caracteres de barra invertida e zero) como significando o caractere NUL. Algumas outras implementações só fazem isso quando passam o sinalizador echo .

Então:

echo '
echo -e '
echo $'
/bin/echo $'
$ printf 'e
echo '
echo -e '
echo $'
/bin/echo $'
$ printf 'e%pre%cho a%pre%b\n' | bash |& sed -n l
ab$
$ printf 'e%pre%cho a%pre%b\n' | ksh |& sed -n l
ksh: syntax error at line 1: 'zero byte' unexpected$
$ printf 'e%pre%cho a%pre%b\n' | zsh |& sed -n l
zsh: command not found: e$
$ printf 'e%pre%cho a%pre%b\n' | rc |& sed -n l
line 1: warning: null character ignored$
line 1: warning: null character ignored$
ab$
'
'
'
'
cho a%pre%b\n' | bash |& sed -n l ab$ $ printf 'e%pre%cho a%pre%b\n' | ksh |& sed -n l ksh: syntax error at line 1: 'zero byte' unexpected$ $ printf 'e%pre%cho a%pre%b\n' | zsh |& sed -n l zsh: command not found: e$ $ printf 'e%pre%cho a%pre%b\n' | rc |& sed -n l line 1: warning: null character ignored$ line 1: warning: null character ignored$ ab$
'
'
'
'

ou:

%pre%

Pode fazer com que zsh imprima o caractere NUL seguido pelo caractere LF.

com echo ,

%pre%

passa o caractere NUL para o /bin/echo embutido.

%pre%

Não funcionaria porque %code% é executado , portanto, seu argumento não pode conter o caractere NUL.

Quanto ao seu ponto 4 pergunta. É só que o bash ignora os caracteres NUL. Algumas outras conchas se comportam de maneira diferente.

%pre%     
por 11.10.2014 / 21:34