Imprimindo o caractere nulo
Em muitos shells recentes você pode escrever caracteres nulos com formato de aspas simples em dólar $'
, formato hexadecimal \x00
'\u0000
, formato unicode \U00000000
ou '
, ou apenas como você tentou com octal: echo
'-e
. O ponto é que o comando tem que entender o que fazer com caracteres de escape com barra invertida. Por exemplo, no caso de printf
, geralmente é necessário adicionar a opção %b
e, no caso de echo -ne ''
, isso seria printf '%b'
.
Vamos verificar se funciona:
$ echo -ne '$ printf '%b' '$ printf '%b' a'$ printf '%b' a'$ printf '%b' a''b | wc -c
2
'b | wc -c
3
'b
ab
'
$
'
$
Portanto, não produz nada, assim como echo -ne
, semelhante
$ printf '%b' a'$ printf '%b' a'$ touch $'$ touch $(printf '%b' '$ touch "$(printf '%b' a'$ echo -ne '$ printf '%b' '$ printf '%b' a'$ printf '%b' a'$ printf '%b' a''b | wc -c
2
'b | wc -c
3
'b
ab
'
$
'
$
'b)"
$ ls
a # in zsh
ab # in bash
')
touch: missing file operand
Try 'touch --help' for more information.
$ mkdir $(printf '%b' '$ printf '%b' a'$ printf '%b' a'$ touch $'$ touch $(printf '%b' '$ touch "$(printf '%b' a'%pre%'b)"
$ ls
a # in zsh
ab # in bash
')
touch: missing file operand
Try 'touch --help' for more information.
$ mkdir $(printf '%b' '%pre%')
mkdir: missing operand
Try 'mkdir --help' for more information.
'
touch: cannot touch ‘’: No such file or directory
$ mkdir $'%pre%'
mkdir: cannot create directory ‘’: No such file or directory
# let's try another approach - using printf in command substitution:
$ touch "$(printf '%b' '%pre%')"
touch: cannot touch ‘’: No such file or directory
$ mkdir "$(printf '%b' '%pre%')"
mkdir: cannot create directory ‘’: No such file or directory
'b | xargs -0 echo
a b
'b | xargs echo
xargs: Warning: a NUL character occurred in the input. It cannot be
passed through in the argument list. Did you mean to use the --null option?
a
')
mkdir: missing operand
Try 'mkdir --help' for more information.
'
touch: cannot touch ‘’: No such file or directory
$ mkdir $'%pre%'
mkdir: cannot create directory ‘’: No such file or directory
# let's try another approach - using printf in command substitution:
$ touch "$(printf '%b' '%pre%')"
touch: cannot touch ‘’: No such file or directory
$ mkdir "$(printf '%b' '%pre%')"
mkdir: cannot create directory ‘’: No such file or directory
'b | xargs -0 echo
a b
'b | xargs echo
xargs: Warning: a NUL character occurred in the input. It cannot be
passed through in the argument list. Did you mean to use the --null option?
a
Vamos adicionar alguns caracteres por aí (vou ficar com a''b
a partir de agora como mais robusto, mas o efeito similar é com xargs
):
Apenas dois caracteres foram impressos, onde foi null ?
%pre% Vamos comparar com a
:
Por último mais verifique se realmente imprimimos caracter nulo antes de tentar criar o arquivo, vamos passar o valor impresso para o comando que vai lançar o erro, como xargs -0
:
Observe como apenas touch ''
foi impresso no final. É claro que touch
funciona bem:
Criando o arquivo com null?
Agora vamos tentar criar um arquivo com caractere nulo:
%pre% O resultado é exatamente o mesmo que em mkdir
, parece que null é ignorado todos juntos. E se pularmos aspas duplas em torno da substituição de comandos?
Esta é a mesma situação que $'%code%'
/ %code% sem argumentos. Ainda outro resultado é se nós cercarmos null com texto:
Também é possível tentar redirecionar a saída padrão para %code% , mas tudo o que se obtém é um tipo diferente de erro.