it-swarm-korea.com

bash 히스토리를 검색하고 명령을 다시 실행하려면 어떻게해야합니까?

Bash에서 히스토리를 검색하고 결과를 실행할 수 있습니까?

292
Richard Hoskins

유형 CtrlR 명령 행에서 이전 명령을 입력하십시오. 결과가 계속 나타나면 CtrlR 다른 경기를보기. 원하는 명령이 나타나면 간단히 Enter

그 동안 CtrlR 명령이 (reverse-search-history)에 바인드되도록하려면 기본값입니다. CtrlT 다음과 같이 구성 할 수 있습니다.

 바인드 ' "\ C-t": reverse-search-history'

다른 readline 바인드 가능 명령의 전체 호스트도 사용할 수 있습니다. bash맨 페이지 를 살펴보십시오.

Bash는 대화식 명령 기록을 검색하고 액세스 할 수있는 많은 기능을 갖추고 있습니다. 가장 기본적인 것은 history내장입니다. 그냥 입력 :

 $ 역사 

다음과 같이 숫자 색인과 함께 명령 목록을 인쇄합니다.

[기록 .____] $ 역사 
 1 명 
 2면 - 날 
 3 vim ~/somefile.txt 
 4 기록 
 $ 

그런 다음 숫자 인덱스를 사용하여 이러한 명령을 실행할 수 있습니다. Mitch 가 지적한 것처럼 단일 !로 인덱스를 붙입니다.

 $! 1 

clear명령을 실행합니다. 내장 된 히스토리에는 많은 기능이 있습니다. 자세한 내용은 bashhistory매뉴얼 페이지를 참조하십시오.

! 지정자를 사용할 때 상대 음수 오프셋을 지정할 수도 있습니다. 위의 히스토리 목록을 사용하여 vimname__을 다시 실행하려면 다음을 수행 할 수 있습니다.

 $! -2 

기본적으로 bash에게 "두 명령 전에"실행 한 명령을 실행하도록 지시합니다. 히스토리 목록에서 이전 명령을 실행하려면 !! (!-1의 줄임말)를 사용하면됩니다.

! 지정자는 실행할 명령을 숫자로 제한하지 않습니다. hayalcibashname__이 (!를 사용하여) 시작하는 텍스트 또는 !?를 사용하여 명령 자체의 텍스트를 기반으로 명령을 실행하도록 지시 할 수 있음을 보여주었습니다. 다시 위의 예제 히스토리 목록을 사용하여 clearname__을 다시 실행하려면 다음과 같이 입력하면됩니다.

 $! cl 

언론 Enter. 그리고 vimname__은 어떻습니까? 그것은 다음과 같이 간단합니다.

 $!? some 

hayalci 응답에서 가장 중요한 점은 shopt내장 함수에 대한 호출입니다.

 $ shopt -s histverify 

이렇게하면 히스토리 검증이 가능해 지므로 !, !!!? 지정자와 일치하는 명령은 맹목적으로 실행되지 않고 대신 명령 행에 채워 지므로 명령을 실행하기 전에 악의가 없도록 할 수 있습니다. 루트 사용자로 명령을 실행할 때 더욱 중요합니다. 이 옵션은 .bashrc 시작 파일에서 설정할 수 있으므로 로그인 할 때마다 설정됩니다.

이미 지적했듯이이 모든 정보는 bash맨 페이지 에서 수집 할 수 있습니다. !, !!, 그리고!를 위해서? designators, Section 9.3 History Expansion 을 살펴보십시오.

421
Sean Bright

대안으로 crtl+R, 당신은 입력하여 역사를 검색 할 수 있습니다

!text

이렇게하면 가장 최근 명령 시작 부분 과 'text'가 기록에서 검색됩니다.

그러나 당신이 잘못된 명령의 실행을 막기 위해 .bashrc에 넣는 것이 좋습니다.

shopt -s histverify

이것은 bash에게 any 히스토리 조치 (예 : !!:s/prev_text/after_text)가 끝나면 프롬프트 행에 결과 행을 넣도록 지시합니다. 그런 다음 명령을 검토하거나 편집 한 다음 Enter 키를 누릅니다.

36
hayalci

당신은 또한 할 수 :

history | grep "stuff"

그것은 뭔가를 반환합니다.

num stuff

입력 할 수 있습니다.

!num
30
Mitch

역방향 검색 기록보다 역방향 검색을 사용하는 것을 선호합니다. 전자는 검색 키를 먼저 누른 다음 검색 문자열을 입력하는 것과 달리 명령의 몇 가지 문자 를 입력 한 다음 검색 키를 누릅니다.

기본적으로 내 시스템에서 M-p와 M-n은 유사한 기능에 바인딩되지만 화살표 키 바인딩을 선호합니다.

bind '"\e[A":history-search-backward'
bind '"\e[B":history-search-forward'
14
Keith

나는 정말로 별명이있어. 정말 "history | grep"이지만 "grep -E -v"명령으로 이전 "h 명령"항목을 필터링합니다.

alias h="history | grep -E -v '^ *[0-9]+ *h ' | grep "

같은 사용

h aliases
2003  less .bash_aliases
13
CurtH

훌륭한 글, 션! 나는 이것을 코멘트에 넣었지만, 나는 수줍음이 많았다. :-)

또 다른 관련 유용한 기술은 Word를 변경하는 동안 이전 명령을 실행할 수있는 기능입니다. 디렉토리 이름을 입력했거나 파일 이름을 변경하려고한다고 가정 해보십시오.

$ 내 이름은 밥이다. 
 내 이름은 밥이다. 
 $ ^ bob ^ jordan 
 내 이름은 요르단이다. 
 내 이름은 요르단이다.

명령이 실행되기 전에 명령이 확장, 대체 및 출력됨에 따라 잘못된 명령이 실행되면 bash에서 무엇을하고 있는지 알 수 있습니다.

12
Jordan

Ctrl-r을 사용하여 내역을 탐색하는 작업은 귀찮은 작업이므로, hh 를 고려해보십시오.

https://github.com/dvorka/hstr

명령을 실행하는 것을 포함하여 탐색을 훨씬 간단하고 직선적이며 효율적으로 만듭니다.

enter image description here

5
Martin Dvorak

Bash 명령 프롬프트에서 control-R을 입력하고 원하는 명령의 몇 문자를 입력하면 bash의 readline 기능이 해당 명령에 대한 명령 기록을 검색합니다.

검색을 시작하면 control-R을 다시 입력하여 다음 일치 명령으로 건너 뛸 수 있습니다.

3
John1024

vi 키 바인딩 (set -o vi 또는 set editing-mode vi$HOME/.inputrc 포함)을 사용하도록 쉘을 구성한 경우 <Esc>/some-command<Return>로 검색하고 n (다음) 또는 Shift-n (이전)에 도달하면 명령 줄 기록을 순환합니다.

3
Fernando Basso

CTRL+R @ John1024가 제안한 것처럼 잘 작동하지만, 최근의 명령 중 많은 부분이 비슷하고 빠르게 스캔 할 수있는 방법이 필요하다면 다소 지루합니다. 또 다른 방법은 history :

$ history | grep keyword
2
Mureinik

나는 HSTR을 좋아하지만 때로는 설치할 수 없을 것 같다. 그래서 나는 그것의 행동을 모방 한 fzf 를 사용하여 별명을 썼습니다 ( "history execute"에 대한 hx).

alias hx='eval $(history | sed "s/^ *[0-9]* *//g" | fzf --tac --tiebreak=index --height=10)'
  • history : 음, 역사를 얻으십시오.
  • sed : 목록에서 숫자 열 제거 (POSIX)
  • fzf : 여기에 마법이 있습니다. 목록을 대화식으로 퍼지 검색하거나 C-JC-K로 이동 한 다음 Enter과 함께 명령을 실행할 수 있습니다.
  • --height : 표시된 줄 수를 설정하십시오.
  • --tac : 목록 되돌리기 (내역에 대해 더 논리적 인)
  • --tiebreak=index : fzf가 결과를 업데이트 할 때 기록 순서 유지
0
Biggybi