Posso column
usar a tabulação como separador de campos:
$ printf "a\tb\tc\n" | column -s $'\t' -t
a b c
Mas usar separador nulo não parece funcionar:
$ printf "a\0b\0c\n" | column -s $'\0' -t
column: line too long
Para confirmar, os separadores nulos estão realmente lá:
$ printf "a\0b\0c\n" | xxd
00000000: 6100 6200 630a a.b.c.
O que pode estar errado aqui?
Nenhum comando executado pode ter um NUL em seus argumentos, pois na
execve()
chamada do sistema , os argumentos da linha de comando são strings delimitadas por NUL.$'\0'
Funciona somente no shell zsh e em argumentos para comandos ou funções internasexecve()
(onde não está envolvido).Em outros shells que suportam esse
$'...'
operador de citação do ksh93, o que está depois de a\0
(ou\u0000
,\x0
,x{0}
,\c@
ou\C-@
quais são outras representações possíveis de NUL dependendo do shell) dentro dele é simplesmente descartado ($'a\0b'$'c\0d'
é o mesmo queac
)¹ ². Em qualquer caso,external-command $'something\0'
é o mesmo queexternal-command something
eexternal-command $'\0'
o mesmo queexternal-command ''
em todos os shells.Para passar um NUL para um comando, é preciso fazer de outra forma, usando alguma forma de convenção. Por exemplo, isso poderia ser
\0
literalmente (como no argumento format de ou ) ouawk -v nul='\0'
( como para URIs), veja também que é interpretado como NUL pelo bash, zsh ou versões recentes do ksh93 ou do GNU .printf
%00
''
read -d
cut -d
O
column
encontrado emutil-linux
(com base no comando BSD correspondente) não suporta nada disso e, como a maioria dos utilitários tradicionais (e ao contrário da maioria dos utilitários GNU), nem mesmo suporta NULs em sua entrada, pois trabalha com strings delimitadas por NUL (strings C) internamente.O
b c
se foi.Para contornar isso, você pode alterar o byte 0 para 1 byte (ou qualquer outro valor de byte não encontrado na entrada) antes de passar
column
e alterar novamente depois:¹
$'...'
foi adicionado à edição de 2024 da especificação POSIX dash
linguagem e ambos os comportamentos são permitidos.²
fish
ees
são dois shells (não semelhantes a POSIX) que suportam essas\ooo
sequências de escape octais (também\xhh
paraes
) fora das aspas e se comportam de forma semelhante, exceto que versões recenteses
emitem umbad backslash escape
erro para\0
ou\x0
.