명령 기록의 변경 사항을 취소하는 방법은 무엇입니까?

명령 기록의 변경 사항을 취소하는 방법은 무엇입니까?

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 -lthen ctrl+를 여러 번 입력하세요. r과거로 스크롤하면 ctrl+s는 현재 위치에서 앞으로 검색합니다.

bash fc내장 명령이전 readline 명령과 함께 색인 번호를 나열하는 것이 도움이 됩니다.

fc -l -100readline의 이전 100개 명령이 나열됩니다.

또한 OP가 이전 명령을 찾고 있다는 것을 알고 있는 경우 ls -l출력을 다음 grep으로 파이프할 수 있습니다.fc -l -100 | grep 'ls -l'

ls -l그러면 인덱스 번호 앞에 이전 명령 목록이 출력됩니다 . 출력은 다음과 같습니다.
2065 ls -l

이제 인덱스 번호가 !n어디에 있는지 이벤트 표시기를 사용할 수 있습니다 . n이 예에서는 실행 !2065ls -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-newlineBash 4.0/Readline 6.0부터 사용 가능하며 거의 예상대로 작동합니다.

설정된 경우 임의의 행(다른 명령일 수도 있고 빈 행일 수도 있음)에서 Enter를 누르면 편집되었지만 실행되지 않은 모든 기록 항목이 복원됩니다(질문의 예에 표시된 대로).

이는 다음과 같이 설정할 수 있습니다.

set revert-all-at-newline on

존재하다 ~/.inputrc.

또는

bind 'set revert-all-at-newline on'

존재하다 ~/.bashrc.

관련 정보