Quando a saída vai para um dispositivo terminal, a maioria das ls
implementações se comportam como se a opção -q
tivesse sido passada para elas.
Com -q
, ls
renderiza todos os caracteres não imprimíveis como ?
Aqui, possivelmente, o caractere não imprimível pode ser um caractere de retorno de carro (também conhecido como CR, também conhecido como \r
). Isso poderia acontecer, por exemplo, se você executasse xargs touch < file.txt
e file.txt
continha uma lista de nomes de arquivos, mas estivesse usando delimitadores de linha MS-DOS CR-LF (e sua implementação xargs
como GNU xargs
, mas ao contrário de busybox xargs
não reconhece CR como um separador).
Também pode ser literalmente um caractere ?
, pode até ser um ?
seguido por espaço ou outros caracteres invisíveis (mas imprimíveis ).
Para confirmar qual caractere é, você pode canalizar essa saída para LC_ALL=C sed -n l
.
ls -l | LC_ALL=C sed -n l
Em seguida, a saída ls
será um canal (e, portanto, não será mais um dispositivo terminal), portanto, não ativará -q
. Os caracteres não imprimíveis serão impressos como estão. sed -n l
renderizará caracteres CR como \r
e outros caracteres não imprimíveis usando representações imprimíveis apropriadas. Ele também adiciona um $
no final da linha para que você possa identificar caracteres de espaço à direita.
Com a implementação GNU de ls
, você também pode usar algumas das opções --quoting-style=<STYLE>
, como:
LC_ALL=C ls --quoting-style=shell-escape -l
Ou
LC_ALL=C ls -Ql
curto para:
LC_ALL=C ls --quoting-style=c -l