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
(os dois caracteres de barra invertida e zero) como significando o caractere NUL. Algumas outras implementações só fazem isso quando passam o sinalizador -e
echo
.
Então:
echo 'echo -e 'echo $'/bin/echo $'$ printf 'eecho '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
,
passa o caractere NUL para o /bin/echo
embutido.
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%