답변:
히스토리 번호가 증가했는지 확인하십시오. 취소 된 프롬프트 또는 사용자가 방금 누른 프롬프트 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
) 에서 중복 스쿼시를 설정 한 경우 두 개의 동일한 명령을 연속적으로 실행 한 후 빈 명령이 잘못보고됩니다.
${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
명령을 실행할 때마다가 호출됩니다. 까다로운 점은 EnterPROMPT_COMMAND가 정의되어 있지 않는 한 방금 눌렀을 때 호출되지 않습니다 Enter.
원하는 결과를 얻는 가장 간단한 방법은 PROMPT_COMMAND를 사용하는 대신 디버그 트랩 함수를 정의하는 것입니다. 그러나 나는 당신이 원하는 결과를 모르기 때문에 말할 수 없습니다. 방금 눌렀을 때 Enter어떤 일이 발생하고 명령을 입력 할 때 다른 / 추가적인 일이 발생하려면 (AFAIK) 디버그 트랩과 PROMPT_COMMAND를 사용해야합니다. 참조 이 답변 하고 이 한 두 가지 메커니즘을 멋지게 함께 플레이 할 수있는 방법에 대한합니다.