명령 기록에서 변경 사항을 취소하는 방법은 무엇입니까? 싶은 명령을 찾았지만 약간의

UNIX 시스템에서는 위쪽 및 아래쪽 화살표를 눌러 이전 명령을 탐색 할 수 있습니다. 이것은 매우 편리합니다.

때로는 올라가서 다시 사용하고 싶은 명령을 찾았지만 약간의 변형이 있습니다. 이러한 변경을 수행하면에서 체크인하지 않으면 원래 명령을 다시 가져올 수 없습니다 history.

키를 통해 액세스 한 히스토리에서 명령 변경 사항을 “실행 취소”할 수있는 방법이 있습니까?

현재 해결 방법은 #명령 앞에 a 를 추가하는 것입니다. 이런 식으로 현재 명령이 주석으로 수행되므로 아무 일도 일어나지 않습니다. 그런 다음 키를 사용하여 명령을 다시 찾아 볼 수 있습니다. 문제는 내가 사용하고있는 명령이 목록에서 멀리 떨어져 있기 때문에 다시 200 번 올라가는 것이 약간이라는 것입니다. 내가 찾고있는 것을 정확하게 기억하지 못할 수 있기 때문에 Control + R도 해결책이 아닙니다.

다음 “50 명령 전”을 입력했습니다 :

ls -l /etc/httpd/conf/

이제 그 줄로 올라가서

ls -l /etc/init.d/

Enter 키를 누르지 않았습니다. 이제 ls -l /etc/httpd/conf/다시 가고 싶습니다 .

내 환경

$ echo $SHELL
/bin/bash
$ echo $TERM
xterm



답변

만큼 당신이 역사 항목을 편집하지만 누르지 한으로 Enter아직, 원래의 항목을 반복하여 눌러로 돌아갑니다 Ctrl+ _더 – undo명령 – 그것은 더 이상 변화하지 않을 때까지. 원래 항목으로 돌아 왔습니다.


답변

행을 여러 번 변경 한 경우 원래 명령으로 되 돌리십시오 .

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메타 키 altr입니다.


무료이지만 도움이되는 정보

OP가 이전에 수행 한 것과 같은 명령 실행 했을 때 (발생), 명령은 GNU Readline 라이브러리에 의해 처리되고 기억되며 쉘이 종료 될 때까지 기록되지$HISTFILE 않기 때문에 “실행 취소”할 것이 없습니다 . 내가 언급 한 이유는 당신 이 기대할 수 grep있는 $HISTFILE것과 같을 수 없으며 쉘을 종료하는 것이 이상적이지 않기 때문입니다.

다음은 이전의 모든 readline 명령을 스크롤하지 않아도되는 몇 가지 옵션입니다.

명령 중 일부를 기억하는 경우ctrl +를 누르고 해당 문자열이 포함 된 이전 명령r검색 하기 위해 기억하는 내용을 입력하십시오 . ctrl+를 r다시 누르면 가장 최근에 다음 검색이 표시됩니다.

예를 들어, 이전에 찾은 명령을 찾는 데 걸리는 횟수만큼 ls -lthen ctrl+ r를 입력 하십시오. 지나서 스크롤하면 ctrl+ s가 현재 위치에서 앞으로 검색합니다.

fc명령 내장 배쉬는 이전의 readline 명령과 함께 인덱스 번호를 나열하는 것이 도움이된다.

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

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

이전 ls -l명령 목록과 색인 번호 가 출력되어야합니다 . 결과는 다음과 같습니다.
2065 ls -l

이제 이벤트 지정자 사용할 수있는 인덱스 번호입니다. 이 예에서 실행 은으로 확장됩니다 .!nn!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가 찾고있는 “실행 취소”솔루션보다 “하지 말 것”에 더 가깝더라도 밀접한 관련이있는 것처럼 보이기 만하면됩니다.


답변