Bash: Expansão do histórico dentro de aspas simples após uma aspa dupla dentro da mesma linha

2

Eu dei uma olhada mais de perto neste fenômeno depois que eu tropecei em duas outras questões hoje. Eu tentei tudo isso com o padrão set -H (expansão do histórico ativado).

Para testar um script, muitas vezes faço coisas como echo ing de uma string de várias linhas e canalizo através de um script, mas em alguns casos ele gera um erro:

$ echo "foo
bar" | sed '/foo/!d'
bash: !d': event not found
> 

O ! parece ativar a expansão do histórico, embora esteja entre aspas simples. O problema parece ser a ocorrência das aspas duplas na mesma linha, porque

$echo $'foo\nbar' | sed '/foo/!d'

funciona tão bem quanto

$echo "foo
bar" |
> sed '/foo/!d'

Minha suspeita: A expansão de histórico é aplicada de forma linear, portanto, o ' após um único " é considerado como escapado, portanto, o seguinte ! não é ignorado.

Agora, minha pergunta: isso é um bug ou um comportamento esperado? Reproduzido com bash versões 4.2.30 e 4.4.12.

    
por Philippos 07.09.2017 / 14:23

1 resposta

2

Eu relatei isso para [email protected] e recebi esta resposta :

History expansion is explicitly line-oriented, and always has been. There's not a clean way to make it aware of the shell's current quoting state (mostly since it's a library independent of the shell). Maybe there's a way to use one of the existing callback functions to do it.

Isso soa como " isso não é um bug, porque não podemos fazer nada melhor com a implementação atual ".

Acho que vou sugerir um patch para a página man , pelo menos, então essa limitação será documentada no futuro.

Próxima razão para mudar para zsh

    
por 11.09.2017 / 13:14