回答:
履歴番号が増加していないか確認してください。キャンセルされたプロンプトまたはユーザーが押したばかりのプロンプトはEnter、履歴番号をインクリメントしません。
履歴番号は変数HISTCMD
で使用できますが、では使用できませんPROMPT_COMMAND
(必要なのは実際には前のコマンドPROMPT_COMMAND
の履歴番号なので、それ自体を実行するコマンドには履歴番号がないためです)。の出力から番号を取得できます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'
履歴(HISTCONTROL=ignoredups
またはHISTCONTROL=erasedups
)で重複のスカッシュをオンにした場合、2つの同じコマンドを続けて実行した後、空のコマンドが誤って報告されます。
${HISTCMD_previous%%$'[\t ]'*}
ビットが欠落していて$'…'
、`,
タブまたはスペースの後ではなくt`またはスペースの後に切り捨てられましたが、bashはタブを印刷します。
回避策はありますが、いくつかの要件があります。
$HISTCONTROL
すべてのコマンドを保存するように設定する必要があります。また、重複とスペースも保存します。だから設定:
HISTCONTROL=
次に、呼び出す関数を次のように定義します$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"
}
次に、$PROMPT_COMMAND
変数を設定します。
PROMPT_COMMAND="isnewline"
出力を確認します。
user@host:~$ true
user@host:~$ <return>
User hit return
user@host:~$ <space><return>
user@host:~$
last
は、の呼び出しからisnewline
次の呼び出しまで保持されます(prompt_command__isnewline__last
衝突を避けるために、より一般的でない名前のみを選択してください)。
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
それ自体、それを行う方法がわかりません。しかし、以下を使用することで同じ効果を得ることができます
トラップsome_command_or_functionデバッグ
これにより、some_command_or_function
コマンドを実行するたびにが呼び出されます。トリッキーなのは、ヒットしただけでは呼び出されEnterないことです。PROMPT_COMMANDが定義されていない限り、ヒットするとPROMPT_COMMAND Enterが呼び出され、それによってトラップがトリガーされます。
おそらく、希望する結果を得る最も簡単な方法は、PROMPT_COMMANDを使用する代わりにデバッグトラップ関数を定義することです。しかし、あなたが望んでいる結果がわからないので、私にはわかりません。を押しただけで何かが発生しEnter、コマンドを入力したときに別の/追加の何かが発生したい場合は、(AFAIK)デバッグトラップとPROMPT_COMMANDを使用する必要があります。 2つのメカニズムをうまく連携させる方法については、この回答と これを参照してください。