하루에 한 번씩 bash에서 기록 항목을 검색할 때 문제가 발생합니다. 항목을 조작하면 기록 항목이 삭제되는 경우도 있고 그렇지 않은 경우도 있습니다.
이런 일이 발생하는 경우는 다음과 같습니다.
$ls foo
ls: No such file or directory
# (ctrl-r)ls foo(tab)
$ ls foo
# (ctrl-a)(ctrl-k)
$
# (ctrl-r)ls foo
# (no matches)
여기서 무슨 일이 일어나고 있는지에 대한 설명은 무엇입니까?
답변1
내 생각에 이 동작의 이유는 Bash가 이전 히스토리 라인의 수정을 처리하는 방식 때문이라고 생각합니다. previous-history
( C- p) 또는 reverse-search-history
( - ) C와 같은 명령의 기능은 r다음과 같습니다.얻다이전 기록 항목:
previous-history (C-p)
Fetch the previous command from the history list, moving back in the list.
이전 기록 항목이가져온입력하는 것처럼 인쇄됩니다. 이제 수정만 하고 실행하지 않거나(예제에서와 같이) 수정하고 실행할 수 있습니다. 실행하면 다음을 호출합니다 accept-line
.
accept-line (Newline or Return)
Accept the line regardless of where the cursor is. If this line is
non-empty, add it to the history list according to the setting of
the HISTCONTROL and HISTIGNORE variables. If this line is a
modified history line, then restore the history line to its
original state.
누르면 Return수정된 라인이 기록에 저장되고 원래 라인은 변경되지 않습니다. 하지만 가져온 행을 누르지 않고 수정하면 어떻게 되는지 생각해 봅시다. Return수정은 되었지만 실행되지는 않으므로 accept-line
호출되지 않습니다. 원래의 역사적 노선은수정됨.
실제로 이를 확인하려면 다음 줄을 추가 ~/.inputrc
하고 새 하위 셸을 시작하세요.
set mark-modified-lines On
이제 예제와 동일한 작업을 수행해 보겠습니다.
$ echo April # 0) press Return - `accept-line` is called
# 1. press C-r and type `April' and Tab - you will see this again because
# `echo April' is in history:
$ echo April
# 2. now kill this line using C-k or C-u. C-r `April' doesn't work anymore
# because there is no `echo April' in the history
# 3. DON'T PRESS RETURN HERE! Press Up arrow first a couple of times and
# press Return to invoke a different command, it can be anything you had
# in your history but just no Return here
# 4. now, see `history', somewhere there you will see the empty string. It
# may look a bit different depending on your HISTTIMEFORMAT but note
# there is an asterisk next to the history line number and a command is
# missing. It's missing because it has been modified and saved in 2).
$ history
(...)
483* 2015-04-12 02:36:19
질문의 두 번째 주석에서 알 수 있듯이 2)에서 Return 키를 누르면 지점 0)에 입력된 원래 명령이 수정되지 않고 C- 로 호출할 수 있습니다 r.
좋아요, 언뜻 보기에는 혼란스럽고 이해하기 어려울 수 있다는 것을 알고 있습니다. 궁금한 점이 있으시면 다시 오셔서 더 명확하게 설명하도록 노력하겠습니다.