Yanıtlar:
Geçmiş numarasının artırılıp artırılmadığını kontrol edin. İptal edilen bir bilgi istemi veya kullanıcının henüz bastığı bir bilgi istemi Entergeçmiş numarasını artırmaz.
Geçmiş numarası değişkente kullanılabilir HISTCMD
, ancak bu burada kullanılamaz PROMPT_COMMAND
(çünkü istediğiniz şey aslında önceki komutun geçmiş numarasıdır; PROMPT_COMMAND
kendini yürüten komutun geçmiş numarası yoktur). Sayıyı çıktısından alabilirsiniz fc
.
prompt_command () {
HISTCMD_previous=$(fc -l -1); HISTCMD_previous=${HISTCMD_previous%%$'[\t ]'*}
if [[ -z $HISTCMD_before_last ]]; then
# initial prompt
elif [[ $HISTCMD_before_last = "$HISTCMD_previous" ]]; then
# cancelled prompt
else
# a command was run
fi
HISTCMD_before_last=$HISTCMD_previous
}
PROMPT_COMMAND='prompt_command'
Geçmişte ( HISTCONTROL=ignoredups
veya HISTCONTROL=erasedups
) yinelenenleri ezmeyi etkinleştirdiyseniz , bu işlem iki özdeş komutu art arda çalıştırdıktan sonra yanlışlıkla boş bir komut bildireceğini unutmayın.
${HISTCMD_previous%%$'[\t ]'*}
bit eksikti $'…'
ve `,
sekme veya boşluk yerine t` veya boşluk sonra kesilmiş , ancak bash bir sekme yazdırır.
Bir çözüm var, ancak bazı gereksinimleri var:
$HISTCONTROL
TÜM komutları, ayrıca kopyaları ve boşlukları kaydetmek için ayarlamanız gerekir . Öyleyse ayarlayın:
HISTCONTROL=
Şimdi çağrılacak bir fonksiyon tanımlayın $PROMPT_COMMAND
:
isnewline () {
# read the last history number
prompt_command__isnewline__last="$prompt_command__isnewline__curr"
# get the current history number
prompt_command__isnewline__curr="$(history 1 | grep -oP '^\ +\K[0-9]+')"
[ "$prompt_command__isnewline__curr" = "$prompt_command__isnewline__last" ] && \
echo "User hit return"
}
Şimdi, $PROMPT_COMMAND
değişkeni ayarlayın :
PROMPT_COMMAND="isnewline"
Çıktıya bakın:
user@host:~$ true
user@host:~$ <return>
User hit return
user@host:~$ <space><return>
user@host:~$
last
, bir çağrısından diğerine çağrılır isnewline
(yalnızca prompt_command__isnewline__last
çakışmalardan kaçınmak için daha az genel bir ad seçin ).
HISTCONTROL="" function last_was_blank { local last_command="$(history 1)" if [[ "$last_was_blank_PREVIOUS_LINE" = "$last_command" ]] ; then echo "true" else echo "false" fi export last_was_blank_PREVIOUS_LINE="$last_command" } PROMPT_COMMAND=last_was_blank
Ben, bunu yapmak için bir yol bilmiyorum haddi zatında . Ama aynı etkiyi kullanarak
trap some_command_or_function hata ayıklama
Bu, some_command_or_function
bir komutu her çalıştırdığınızda çağrılmasına neden olur . Zor olan şey, sadece vurursanız çağrılmayacaktır Enter- bir PROMPT_COMMAND tanımlı değilseniz, bu durumda vurmak EnterPROMPT_COMMAND'ı çağırır ve bu da tuzağı tetikler.
Belki de istediğiniz sonucu elde etmenin en basit yolu bir PROMPT_COMMAND kullanmak yerine bir hata ayıklama tuzağı işlevi tanımlamaktır. Ama söyleyemem, çünkü hangi sonucu istediğini bilmiyorum. Sadece vurduğunuzda bir Enterşey olmasını ve bir komut yazarken farklı / ek bir şey olmasını istiyorsanız, (AFAIK) bir hata ayıklama tuzağı ve bir PROMPT_COMMAND kullanmanız gerekir. Bkz bu cevabı ve bu bir iki mekanizma birlikte güzel oynamak yapmak için bir yol.
(Yorum eklememe izin verilmiş olsaydım, bu kabul edilen cevaba bir yorum olurdu ...) @schlimmen, HISTTIMEFORMAT
benzer bir şeye ayarlayabilir HISTTIMEFORMAT='%F %T '
ve sonra kaydedip karşılaştırabilirsiniz history 1
. Çünkü silme işlemlerinde en azından (muhtemelen tekrarlanan) son komutun zaman damgası her seferinde değişir --- ve HISSTIMEFORMAT
uygun şekilde ayarlandığında, history 1
zaman damgasını görüntüler (aksine fc
) ve böylece tekrarlanan komutlar arasında bile farklılık gösterir.