Por que o histórico do Bash não registra esse comando?

6

O comando printf "#!/bin/bash\n" > t gera um erro ( bash: !/bin/bash\n": event not found ), mas pressionar a tecla para cima não chama o comando para que eu possa modificá-lo. Por que é que?

(O que eu estava tentando aqui pode ser realizado com printf "%s\n" '#!/bin/bash' >t Estou tentando aprender Bash e realmente quero entender por que o bash history não captura o comando printf anterior.)

    
por William Everett 29.10.2013 / 14:54

2 respostas

14

O caractere ! aciona a expansão do histórico, como você descobriu. Essa etapa ocorre antes que um comando seja salvo no histórico, para que possa ser salvo no histórico com a expansão já concluída. Quando ocorre um erro na expansão do histórico, o bash interrompe o processamento do comando e nunca é salvo no histórico.

A expansão de histórico permite que comandos anteriores ou partes de comandos anteriores sejam substituídos no comando atual. Se isso foi feito antes de salvar o comando no histórico, isso pode significar algo diferente a cada vez que é executado, porque os comandos anteriores são diferentes em cada instância. Consulte o link

Para referência, o comportamento de zsh é diferente. Ele salvará o comando, mas com a expansão do histórico ausente.

    
por 29.10.2013 / 15:11
4
 bash: !": event not found

Isso porque, nas configurações padrão de um shell interativo, o Bash executa a expansão do histórico no estilo csh usando o ponto de exclamação. Isso não é um problema em scripts de shell; somente em shells interativos.

A solução mais fácil é desativar a opção histexpand: isso pode ser feito com set +H ou set +o histexpand .

Você pode ler mais sobre este aqui no site do Bash Pitfalls .

    
por 29.10.2013 / 15:11