UNIX 시스템에서는 위쪽 및 아래쪽 화살표를 눌러 이전 명령을 탐색할 수 있습니다. 이것은 매우 편리합니다.
때로는 다시 사용하고 싶은 명령을 발견하지만 약간의 변경이 필요합니다. 그렇게 변경하면 체크인하지 않는 한 원래 명령을 되돌릴 수 없습니다 history
.
키 입력으로 액세스한 기록에서 명령 변경 사항을 "실행 취소"하는 방법이 있습니까?
#
현재 해결 방법은 명령 앞에 를 추가하는 것입니다. 이렇게 하면 현재 명령이 주석으로 실행되므로 아무 일도 일어나지 않습니다. 그런 다음 키 입력 탐색 명령을 다시 사용할 수 있습니다. 문제는 내가 사용하고 있는 명령이 아마도 목록의 훨씬 아래에 있을 것이므로 다시 200번 위로 올라가는 것은 약간 어긋난다는 것입니다. Control + R도 해결책이 아닙니다. 왜냐하면 제가 정확히 무엇을 찾고 있는지 기억이 나지 않기 때문입니다.
예
다음 "50개 명령 전"을 입력했습니다.
ls -l /etc/httpd/conf/
이제 해당 줄로 이동하여 다음으로 변경합니다.
ls -l /etc/init.d/
그런데 엔터키가 눌리지 않았습니다. 이제 다시 말씀드리고 싶습니다 ls -l /etc/httpd/conf/
.
내 환경
$ echo $SHELL
/bin/bash
$ echo $TERM
xterm
답변1
기록 항목을 편집했지만 아직 누르지 않은 경우 Enter원래 항목으로 돌아가려면 더 이상 변경 사항이 없을 때까지 Ctrl+ _( 명령)를 반복해서 누릅니다. undo
원래 항목으로 돌아갑니다.
답변2
원래 명령으로 되돌리기행을 여러 번 변경한 경우:
revert-line (M-r)
Undo all changes made to this line. This is like
executing the undo command enough times to get back to the beginning.
M
메타 키입니다. 즉alt</kbd+r for me.
무료이지만 유용한 정보
때를가지다이전에 OP와 같은 명령을 실행한 후에는 명령이 실행된 이후로 아무것도 "실행 취소"할 수 없습니다.GNU 읽기 라인도서관이고에 쓰지 않았다$HISTFILE
쉘이 종료될 때까지. 내가 이것을 언급하는 이유는 기대하는 grep
바를 수행할 수 없고 $HISTFILE
쉘을 종료하는 것이 이상적이지 않을 수 있기 때문입니다.
따라서 이전 readline 명령을 모두 뒤로 스크롤하는 것을 방지하는 데 도움이 되는 몇 가지 옵션이 있습니다.
아직 몇 가지 명령을 기억하고 있다면, ctrl+를 누르고 r기억하는 내용을 입력하세요.이전 명령 검색이 문자열을 포함합니다. ctrl+를 다시 누르면 r다음 최신 역방향 검색이 표시됩니다.
예를 들어, 찾고 있는 이전 명령을 찾으려면 ls -l
then ctrl+를 여러 번 입력하세요. r과거로 스크롤하면 ctrl+s는 현재 위치에서 앞으로 검색합니다.
bash fc
내장 명령이전 readline 명령과 함께 색인 번호를 나열하는 것이 도움이 됩니다.
fc -l -100
readline의 이전 100개 명령이 나열됩니다.
또한 OP가 이전 명령을 찾고 있다는 것을 알고 있는 경우 ls -l
출력을 다음 grep
으로 파이프할 수 있습니다.fc -l -100 | grep 'ls -l'
ls -l
그러면 인덱스 번호 앞에 이전 명령 목록이 출력됩니다 . 출력은 다음과 같습니다.
2065 ls -l
이제 인덱스 번호가 !n
어디에 있는지 이벤트 표시기를 사용할 수 있습니다 . n
이 예에서는 실행 !2065
이 ls -l
.
나중에는 도움이 되지 않지만 이전 명령을 수정할 때 최근 명령 기록을 보존하려는 사람은 기록을 덮어쓰지 않고 이전 명령을 수정하는 몇 가지 대체 방법을 HISTORY EXPANSION
살펴봐야 합니다 man bash
.
이 Event Designators
섹션에서는 최근에 사용한 명령에서 문자열을 쉽게 편집하는 방법을 보여줍니다.
^string1^string2^
Quick substitution. Repeat the previous command, replacing string1 with string2. Equivalent to
``!!:s/string1/string2/'' (see Modifiers below).
예:
$ echo foo
foo
$ ^foo^bar
echo bar
bar
이제 최근 명령이 표시됩니다:
echo foo
echo bar
sed
위의 예 에서는 이벤트 표시기에서 교체 문자열을 사용하는 방법도 설명합니다 .
!-n Refer to the current command minus n.
따라서 기록에 3개의 명령이 있으면 echo foo
다음을 사용합니다.
!-3:s/foo/bar
명령이 실행될 때 이벤트 표시기가 기록에 나타납니다(이 경우에는 ) echo bar
. 그것 은 역사 에 그 자체 로 나타나지 않을 것입 니다 !-3:s/foo/bar
.
OP가 찾고 있는 "실행 취소" 솔루션보다 "하지 마세요"에 더 가깝더라도 밀접하게 관련되어 있는 것처럼 보이기 때문에 이것을 던지십시오.
답변3
행 변수 읽기revert-all-at-newline
Bash 4.0/Readline 6.0부터 사용 가능하며 거의 예상대로 작동합니다.
설정된 경우 임의의 행(다른 명령일 수도 있고 빈 행일 수도 있음)에서 Enter를 누르면 편집되었지만 실행되지 않은 모든 기록 항목이 복원됩니다(질문의 예에 표시된 대로).
이는 다음과 같이 설정할 수 있습니다.
set revert-all-at-newline on
존재하다 ~/.inputrc
.
또는
bind 'set revert-all-at-newline on'
존재하다 ~/.bashrc
.