쉘 히스토리를 검색하는 가장 좋은 방법


78

grep보다 내 히스토리 파일에서 명령을 검색하는 더 좋은 방법이 있습니까? 나는 명령이 무엇으로 시작되는지 전혀 알지 못하지만, 역사가 얼마나 오래되었는지는 모른다.

업데이트 : 이전에는 zsh에 국한되었지만 겹치는 답변으로 인해 여기에있는 쉘 (또는 모드 (vi / emacs))에 대해 자유롭게 대답하십시오.

답변:


73

Ctrl디스크립터가 말했듯R 이 + 가 가장 좋습니다 . 또는로 시작하는 최신 명령을 실행하는 또는를 포함하는 최신 명령을 실행하는을 사용할 수도 있습니다 .!stringstring!?string?string

(나는이 질문과 관련이있는 유일한 물건이라고 생각하지만 난에 역사의 명령을 더 많은 적용 이 답변 )


4
'ctrl + r'을 어떻게 보이게합니까?
xenoterracide

13
@xen <kbd>Ctrl+R</kbd>. 답변 소스
Michael Mrozek

나는 SE 엔진이 어떤 HTML 감사를 받아 들인지 몰랐다.
xenoterracide

kbd 키워드가 "ctrl"과 "+"를 올바르게 해석한다는 것을 몰랐습니다! 각 키에 개별적으로 태그를 달았습니다. 감사!
Olivier Dulac

2
@OlivierDulac 슬프게도 그렇지 않습니다. 이것이 바로 키 형식을 지정하는 방법입니다. 누군가 나중에 내 대답을 편집 하여 별도의 키를 만들었습니다
Michael Mrozek

30

Bash를 사용할 때 Control- R를 입력 한 다음 입력을 시작하십시오. 입력 Control- R일부 텍스트를 입력 한 후 반복적으로 일치하는 명령 행으로 돌아갑니다.


18

이것이 도움이되는지 확실하지 않지만 사용 하고 싶습니다 ctrl- r명령 입력을 시작하십시오. 그것은 당신의 역사를 통해 첫 번째 경기를 제시해야합니다. 단지 히트 경기를 통해 전환하려면 ctrl- r다시.


2
죄송합니다. zsh를 잊어 버렸습니다. 이 키 바인딩을 ~ / .zshrc에 추가해야 할 수도 있습니다. bindkey '^
R'history

17

다음을 추가하면 ~/.inputrc

"\e[5~": history-search-backward
"\e[6~": history-search-forward

Bash를 다시 시작하면 입력을 시작한 다음 및을 사용 Page Up하여 Page Down방금 입력 한 것과 동일한 접두사로 시작하는 행 기록을 앞뒤로 이동할 수 있습니다.

( \e[A및 키 를 사용하는 것이 좋을 수도 있습니다. \e[B그러면 새 키를 바인딩하는 대신 일반 UpDown동작 이 대체 됩니다.)


이 명령을 Alt + Upand 에 매핑하는 것을 선호합니다 Alt + Down. 키보드 에뮬레이션에 따라 터미널 에뮬레이션은 이러한 조합에 하나를 매핑 할 수있는 사용 \E[A\E[A(리눅스 키 바인딩과 함께 예를 들어, KDE Konsole을) 또는 \E[1;3A\E[1;3B(X 무료 4 바인딩과 함께 예를 들어 XFCE 터미널 또는 KDE Konsole을).
Christian Herenz

9

이미 언급 한 Ctrl- R에 의해 호출 된 대화식 프롬프트 가 가장 편리한 방법입니다. 또한이 매핑하는 인기 UpDown현재 명령 줄에서 접두사에 대한 기록을 검색하는 화살표 키를, 그러나이 일부 필요 받는 변경 ~/.inputrc파일을 .

대화식이 아닌 고전적인 솔루션은 셸 기록 확장을 사용하는 것입니다. 타자

!foo

로 시작하는 마지막 명령을 실행 foo하고

!?foo

를 포함하는 마지막 명령을 실행합니다 foo. 히스토리 확장에 대한 자세한 정보는 쉘이 Bash이거나 호환되는 것으로 가정하면 Bash 참조 매뉴얼 에서 찾을 수 있습니다 .


6

당신이 추가하면 stty -ixon사용자에게 ~/.bashrc파일 다음 Ctrl- s에 반대 방향으로 갈 것입니다 Ctrl- r.


C-s이 목적 으로 사용 하고 싶었지만 터미널이 멈췄습니다 . 조심해! (글쎄, 나는 아직 어떤 것을 고용하지 않았으며 stty ixon, 이것이 무엇인지 확실하지 않다.)
imz-Ivan Zakharyaschev

3
@imz : C-q" 고정 해제 " IT와 C-s느린 직렬 연결을 사용할 때 수동으로 (일시 정지) 출력의 흐름을 방해 한 번 유용했다 일반적인 소프트웨어 흐름 제어 문자입니다. 이제 대부분의 경우 출력이 너무 빨라서 누를 때보고 싶은 내용 C-s이 이미 스크롤되었습니다. stty -ixon소프트웨어 흐름 제어를 끕니다.
Dennis Williamson

환상적인! 나는 이런 역사에서 앞으로 나아갈 수있는 방법을 찾기 위해 몇 년 동안 검색했다.
marlar

3

입력 !ls하면 bash는 히스토리를 살펴보고 "ls"로 시작하는 최신 명령을 실행합니다.


2

zsh에 따라 다를 수 있습니다. 연구에서 이 대답 내가 발견 vi-history-search-backward 한으로 검색 할 수 있습니다 /(내가 있었다 언급하지 않았다) VI 모드에서 당신은 다음 사용할 수 있습니다 nN(누른 후 각각 앞뒤로 검색을 enter).


2

이것이 언급되지 않은 것에 놀랐습니다. 그러나 이것을 수행하여 bash 또는 ksh에서 vi 모드를 선택할 수 있습니다 :

set -o vi

... 또는 이것을 ~/.inputrcbash와 같은 프로그램에서 사용되는 GNU readline 의 내용으로 사용하십시오.

set editing-mode vi

그리고 그 후, 당신이 사용할 수있는 Esc입력 명령 모드를 사용할 k역사를 되돌아 가고, 그리고 j앞으로 이동합니다. 검색을 사용 /하여 정상적으로 ?검색하고 반대로 검색 할 수도 있습니다 .

을 사용하면 ~/.inputrcGNU bash뿐만 아니라 CLISP와 같은 GNU readline 및 MySQL 명령 셸 및 CPAN 셸과 같은 프로그램을 사용하는 모든 작업에서 작동합니다.


2

역방향 검색을 사용할 때 앞으로 전환하려면 (Ctrl-R 명령 사용) :

  1. .bashrc 파일을여십시오 :
    sudo gedit ~/.bashrc

  2. 이 줄을 추가하십시오 (문자 "f"는 아직 시스템에서 사용하지 않는 다른 것으로 바뀔 수 있습니다)

    bind '"\C-f": forward-search-history' 
  3. 파일을 닫고의 .bashrc를 업데이트 (또는 다른 터미널을 엽니) 명령으로 :
    source ~/.bashrc또는. ~/.bashrc

이제 SHORTCUT을 사용하여 역사에서 앞으로 나아갈 수 있습니다 : Ctrl + f

우분투 18.04 LTS 작업


1

나는 대부분 다음 두 가지를 사용합니다.
그러나 둘 다 시작 문자를 검색합니다.

  1. tcsh : 명령의 문자를 몇 개 입력 한 다음 Esc+ p키를 누르면 이전 명령이 표시되고 다시 누르면 다른 명령이 표시됩니다.
  2. ksh : fc -e - <SPACE> <first few char for your previous >이것을 사용 하면 해당 순서와 일치하는 마지막 명령이 실행됩니다.

내 ksh 및 tcsh의 Bash에서 Ctrl+ 와 같은 것을 찾을 수 없었습니다 R.


3
Ctrl + r은 ksh에서 Bash와 약간 다르게 작동합니다. Ctrl + r을 누른 다음 찾고있는 문자열을 입력하고 Enter를 누르십시오 . 같은 것을 검색하려면 Ctrl + r을 누르고 문자열을 다시 입력하지 않고 입력하십시오. 그건 set -o emacs그렇고, 모드에 있습니다.
Dennis Williamson

@Dennis : +1 :-)
Hemant

1

사용하는 방법이있다 Ctrl- Rtcsh에서 . 에 다음을 추가하십시오 ~/.cshrc.

bindkey "^r" i-search-back (캐럿 부호와 문자 r입니다)

그것은 나를 위해 가장 큰 시간 절약입니다.


1

@ephemient와 비슷한 대답이지만 .bashrc에 넣을 수 있습니다

bind '"\e[A": history-search-backward'
bind '"\e[B": history-search-foward'

문구의 일부를 입력 한 다음 위 / 아래 화살표를 사용하여 가장 일치하는 최신 옵션을 찾아보십시오. 이것이 matlab의 기본 동작입니다.

대부분의 사람들에게 설정을 새로운 시스템으로 이식하고 싶다면, 당신은 단지 ~/.bashrc당신이 그것을 잡아야한다는 것을 기억하는 것이 더 쉽습니다~/.inputrc


0

예, 적어도 zsh를 사용하는 경우 존재합니다. 명령 입력을 시작한 다음 M-p( ESC p) 을 누르면 입력 한 내용과 일치하는 이전 명령이 표시됩니다. 다시 누르면 다음 경기를 찾습니다.


이 답변은 더 많은 설명으로 할 수 있습니다.
phunehehe
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.