Bash의 PROMPT_COMMAND 내에서 사용자가 명령을 입력하지 않고 "return"을 눌렀는지 알 수 있는 방법이 있습니까?
답변1
이력번호가 증가하는지 확인하세요. 취소된 프롬프트나 사용자가 방금 누른 프롬프트는 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
해결 방법이 있지만 몇 가지 요구 사항이 있습니다.
$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:~$
답변3
나는 이것을 할 어떤 방법도 모른다그 자체. 하지만 다음을 사용하면 동일한 효과를 얻을 수 있습니다.
덫일부 명령 또는 기능디버그
이로 인해some_command_or_function
명령이 실행될 때마다 호출됩니다. 까다로운 점은 단지 클릭하면 호출되지 않는다는 것입니다. PROMPT_COMMAND를 정의하지 않는 한 호출되지 않습니다 Enter. 이 경우 클릭은 EnterPROMPT_COMMAND를 호출하여 트랩을 트리거합니다.
아마도 원하는 결과를 얻는 가장 쉬운 방법은 PROMPT_COMMAND를 사용하는 대신 디버그 트랩 함수를 정의하는 것입니다. 하지만 당신이 원하는 결과가 무엇인지 모르기 때문에 말할 수 없습니다. 클릭할 때 어떤 일이 발생 Enter하고 명령을 입력할 때 다른/추가 일이 발생하도록 하려면 (AFAIK) 디버그 트랩과 PROMPT_COMMAND를 사용해야 합니다. 바라보다이 답변그리고 이것 이 두 가지 메커니즘이 함께 잘 작동하도록 하는 방법을 찾고 있습니다.
답변4
(댓글을 추가할 수 있었다면 허용된 답변에 대한 댓글이 될 것입니다...) @schlimmen, HISTTIMEFORMAT
비슷한 것으로 설정 HISTTIMEFORMAT='%F %T '
한 다음 저장하고 비교할 수 있습니다 history 1
. 이는 삭제를 사용하면 최소한 (반복될 수 있는) 마지막 명령의 타임스탬프가 매번 변경되기 때문입니다. HISSTIMEFORMAT
적절한 설정을 사용하면 history 1
타임스탬프가 표시되므로( 와는 다름 fc
) 반복되는 명령 간에도 달라집니다.