Düzeltmek için son yanlış yorum yapmak iyidir, ancak bundan kısa bir süre sonra, çöp karıştırabilir.
Benim yaklaşımım iki aşamalı: komutları, başarısız olduklarında saklayın ve bir süre sonra kaldırın.
Yaptıklarında başarısız olan komutları saklayın:
error_handler() {
FAILED_COMMANDS="$(history | tail -1l | cut -c -5) $FAILED_COMMANDS"
}
trap error_handler ERR
trap command signals
command
biri signals
"yükseltildiğinde" yürütür .
$(command)
, yürütür command
ve çıktısını yakalar.
Komut başarısız olduğunda, bu kod snippet'i tarihe kaydedilen son komutun geçmiş sayısını yakalar ve ileride silinmek üzere değişkente saklar.
Basit, ancak yanlış çalışıyor HISTCONTROL
ve HISTIGNORE
- değişkenlerden biri nedeniyle komut geçmişe kaydedilmediğinde, tarihe kaydedilen son komutun geçmiş numarası önceki komutun biridir; dolayısıyla, yanlış komut geçmişe kaydedilmezse, önceki komut silinir.
Bu durumda doğru çalışan biraz daha karmaşık sürüm:
debug_handler() {
LAST_COMMAND=$BASH_COMMAND;
}
error_handler() {
local LAST_HISTORY_ENTRY=$(history | tail -1l)
# if last command is in history (HISTCONTROL, HISTIGNORE)...
if [ "$LAST_COMMAND" == "$(cut -d ' ' -f 2- <<< $LAST_HISTORY_ENTRY)" ]
then
# ...prepend it's history number into FAILED_COMMANDS,
# marking the command for deletion.
FAILED_COMMANDS="$(cut -d ' ' -f 1 <<< $LAST_HISTORY_ENTRY) $FAILED_COMMANDS"
fi
}
trap error_handler ERR
trap debug_handler DEBUG
Bir süre sonra depolanan komutları kaldırın:
exit_handler() {
for i in $(echo $FAILED_COMMANDS | tr ' ' '\n' | uniq)
do
history -d $i
done
FAILED_COMMANDS=
}
trap exit_handler EXIT
Açıklama:
Bash'ten çıkarken, her benzersiz geçmiş numarası için karşılık gelen geçmiş girişini kaldırın,
daha sonra FAILED_COMMANDS
silinmiş komutlardan geçmiş numaralarını devralan komutları kaldırmamak için temizleyin .
Eminseniz o FAILED_COMMANDS
kopyalardan ücretsiz olacak yapabilirsiniz bitti basit yinelerler
(yani. Yazma for i in $FAILED_COMMANDS
). Ancak, bunu (bu durumda her zaman olduğu) en büyük en küçüğüne sıralanır edilecek bekliyorsanız, yerini uniq
ile sort -rnu
.
İçindeki geçmiş sayıları FAILED_COMMANDS
benzersiz olmalı ve en büyüğünden en küçüğe sıralanmalıdır, çünkü girişi sildiğinizde, sonraki komutların numaraları kaydırılır - yani. yayınladığınızda history -d 2
3. giriş 2. olur, 4. giriş 3. olur vb.
Bu nedenle, bu kodu kullanırken, depolanan en büyük sayıya eşit veya daha küçük olan history -d <n>
yerlerin
FAILED_COMMANDS
manuel olarak arayamaz
ve kodun düzgün çalışmasını bekleyemezsiniz.
Muhtemelen kanca iyi bir fikirdir exit_handler
de EXIT
, ama aynı zamanda her zaman daha erken diyebiliriz.