Saída de substituição de processo em duplicatas do bash ^ Caracteres A

6

Eu escrevi recentemente um script onde eu queria modificar um arquivo com sed antes de passá-lo como um parâmetro para outro comando:

$ some-command <(sed $'s\x01foo\x01bar\x01g' some-file)

Isso falhou com o erro:

sed: -e expression #1, char 8: unknown option to 's'

Após algumas experiências, descobri que o bash estava duplicando o caractere ^A ( \x01 ) antes de chamar o sed:

$ cat -v <(echo $'\x01')
^A^A

Isso não acontece com os caracteres ^ B (ou outros).

$ cat -v <(echo $'\x02')
^B

Onde esse comportamento é documentado? É um resultado de alguma configuração padrão, onde ^ A é usado para funcionalidades obscuras?

Estou vendo isso em quatro versões diferentes do bash que eu tenho acesso: 4.1.2, 4.2.25, 4.2.46 (linux) e 4.3.42 (cygwin)

    
por Adrian Pronk 08.01.2018 / 21:40

2 respostas

2

Sim, o \x01 é duplicado quando usado dentro da expansão de parâmetros:

$ cat -v <(echo $'\x01')
^A^A

E isso acontece nas versões do bash após 2.05:

$ ./script
zsh/sh          : ^A
b203sh          : ^A
b204sh          : ^A
b205sh          : ^A
b30sh           : ^A^A
b32sh           : ^A^A
b41sh           : ^A^A
b42sh           : ^A^A
b43sh           : ^A^A
b44sh           : ^A^A
ksh93           : ^A
attsh           : ^A
zsh/ksh         : ^A
zsh             : ^A

Isso não acontece em um pipe:

$ echo $'\x01' | cat -v
^A

Solução alternativa:

Então, talvez você possa reescrever seu código para:

$ echo $'\x01' | some-command

Ou:

$ some-command <(sed $'s\x02foo\x02bar\x02g' some-file)
    
por 08.01.2018 / 22:27
1

Isso foi relatado como um bug em fevereiro passado e novamente em setembro passado. Há uma nota sobre uma correção na árvore do git Bash no último discussão.

Isso acontece com ^A / ^?1 e com DEL / 7 / $'...' , mas parece exigir "$(printf "...")" dentro da substituição do processo, portanto, é possível contornar isso usando %code% :

Não ok:

$ od -c  <( echo -n  $'\x01_\x7f' ) 
0000000 001 001   _ 001 177
0000005

Ok:

$ od -c  <( echo -n  "$(printf '\x01_\x7f')" )
0000000 001   _ 177
0000003
    
por 08.01.2018 / 23:02

Tags