Às vezes eu entendo mal a sintaxe de um comando:
# mysql -d test
mysql: unknown option '-d'
# echo $?
2
Tento novamente e acerto:
# mysql --database test
Welcome to the MySQL monitor.
mysql >
...
Como evito que o primeiro comando, com código de erro diferente de 0, entre no histórico?
bash
command-history
Adam Matan
fonte
fonte
A única maneira que eu posso pensar de fazer isso seria usar
history -d
no$PROMPT_COMMAND
. O problema dessa ou de qualquer abordagem é que é impossível saber se um comando saiu com um erro ou foi concluído com êxito com um código de saída diferente de zero.fonte
É bom ter o último comentário incorreto para corrigi-lo, mas logo depois isso se torna um lixo potencialmente confuso.
Minha abordagem é em duas etapas: armazene os comandos que falham quando o fazem e os remova algum tempo depois.
Armazene comandos que falham quando o fazem:
trap command signals
executacommand
quando um designals
é "aumentado".$(command)
, executa ocommand
e captura sua saída.Quando o comando falha, esse trecho de código captura o número do histórico do último comando salvo no histórico e o armazena na variável para exclusão futura.
Simples, mas funciona incorretamente com
HISTCONTROL
eHISTIGNORE
- quando o comando não é salvo no histórico devido a uma das variáveis, o número do último comando salvo no histórico é o comando anterior; portanto, se um comando incorreto não for salvo no histórico, o comando anterior será excluído.Versão ligeiramente mais complicada, que funciona corretamente nesse caso:
Remova os comandos armazenados algum tempo depois:
Explicação:
Ao sair do Bash, para cada número de histórico exclusivo remova a entrada do histórico correspondente
e limpe
FAILED_COMMANDS
para não remover comandos que herdaram números de histórico de comandos já excluídos.Se você tem certeza de que
FAILED_COMMANDS
estará livre de duplicatas, pode iterar facilmente (por exemplo,escrever
for i in $FAILED_COMMANDS
). Se, no entanto, você espera que não seja classificado do maior para o menor (nesse caso, sempre é), substituauniq
porsort -rnu
.Os números do histórico
FAILED_COMMANDS
devem ser únicos e classificados do maior para o menor, porque quando você exclui a entrada, os números dos próximos comandos são alterados - ie. quando você emitirhistory -d 2
, a 3ª entrada se tornará a 2ª, a 4ª se tornará a 3ª etc.Por esse motivo, ao usar esse código, você não pode chamar manualmente
history -d <n>
onde
n
é menor ou igual ao maior número armazenado emFAILED_COMMANDS
e esperar que o código funcione corretamente.
É provavelmente uma boa idéia para ligar
exit_handler
aEXIT
, mas você também pode chamá-lo a qualquer hora mais cedo.fonte