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


12

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

명령 히스토리가 변경되었다는 것은 사용중인 쉘의 (미스) 기능 일 것입니다. 에서 ksh예를 들어, 역사 항목을 편집 할 수 있습니다 및 항목의 "이전 버전"을 삭제하지 않고 그들을 호출; 호출 된 모든 명령을 사용할 수 있습니다.
Janis

"변경됨"이란 의미는 다음과 같습니다. 화살표로 도달 한 후 이전 명령으로 변경 한 경우, 화살표로 위아래로 이동하면 이전 명령은 원래의 방식으로 표시되지 않지만 수정 된 방식으로 표시됩니다. 그것. 물론 명령을 수행하는 "enter"를 입력하면 이전 명령은 처음과 동일합니다. 그러나 이것은 내가 피하려고 시도한 것이며 명령을 초기 값으로 "재설정"하는 방법을 찾고 있습니다.
fedorqui

1
또한이 경우에는 ksh행동이 여기에서 다릅니다. 또한 내역 편집 옵션은 선택한 편집 모드에 따라 다릅니다. 에서 ksh의 VI 모드, 예를 들어, 이전 항목을 덮어 쓰지 않습니다, 나는 또한처럼, 실행 취소 명령을 실행할 수 vi로, 'U'.
Janis

음, 이것은 매우 유망한 소리입니다. 나는 현재 Bash에서 일하고 있으며 현재로 변경하는 것을 고려하고 있지 ksh않지만 그러한 것이 존재한다는 것을 아는 것이 좋습니다.
fedorqui

쉘이 닫힐 때 bash가 히스토리 파일에 기록하기 전에 bash가 최근 명령 히스토리를 저장하는 위치를 알고 싶습니다. 이것이 가능한지 판단하는 데 도움이 될 수 있습니다. 아무도? 나는 그것이 쉘 변수 중 하나에 있다고 생각했지만 지금은 매뉴얼을 다룰 시간이 없습니다.
iyrin

답변:


10

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


5

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

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가 찾고있는 "실행 취소"솔루션보다 "하지 말 것"에 더 가깝더라도 밀접한 관련이있는 것처럼 보이기 만하면됩니다.


자세한 정보에 감사드립니다. 내가 찾고있는 것과 정확히 일치하기 때문에 Gilles의 대답을 수락하는 반면, 여기서 다시 실행하려는 명령에 대해 많은 것을 알고 있다고 가정합니다. 항상 그런 것은 아닙니다.
fedorqui

예, 동의합니다. 실행 취소 기능이 이전에 명령을 입력 한 것으로 확장되면 좋을 것입니다.
iyrin
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.