Bash에서 히스토리를 검색하고 결과를 실행할 수 있습니까?
유형 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
명령을 실행합니다. 내장 된 히스토리에는 많은 기능이 있습니다. 자세한 내용은 bash
및 history
매뉴얼 페이지를 참조하십시오.
!
지정자를 사용할 때 상대 음수 오프셋을 지정할 수도 있습니다. 위의 히스토리 목록을 사용하여 vim
name__을 다시 실행하려면 다음을 수행 할 수 있습니다.
$! -2
기본적으로 bash에게 "두 명령 전에"실행 한 명령을 실행하도록 지시합니다. 히스토리 목록에서 이전 명령을 실행하려면 !!
(!-1
의 줄임말)를 사용하면됩니다.
!
지정자는 실행할 명령을 숫자로 제한하지 않습니다. hayalci 는 bash
name__이 (!
를 사용하여) 시작하는 텍스트 또는 !?
를 사용하여 명령 자체의 텍스트를 기반으로 명령을 실행하도록 지시 할 수 있음을 보여주었습니다. 다시 위의 예제 히스토리 목록을 사용하여 clear
name__을 다시 실행하려면 다음과 같이 입력하면됩니다.
$! cl
언론 Enter. 그리고 vim
name__은 어떻습니까? 그것은 다음과 같이 간단합니다.
$!? some
hayalci 응답에서 가장 중요한 점은 shopt
내장 함수에 대한 호출입니다.
$ shopt -s histverify
이렇게하면 히스토리 검증이 가능해 지므로 !
, !!
및 !?
지정자와 일치하는 명령은 맹목적으로 실행되지 않고 대신 명령 행에 채워 지므로 명령을 실행하기 전에 악의가 없도록 할 수 있습니다. 루트 사용자로 명령을 실행할 때 더욱 중요합니다. 이 옵션은 .bashrc
시작 파일에서 설정할 수 있으므로 로그인 할 때마다 설정됩니다.
이미 지적했듯이이 모든 정보는 bash
맨 페이지 에서 수집 할 수 있습니다. !, !!, 그리고!를 위해서? designators, Section 9.3 History Expansion 을 살펴보십시오.
대안으로 crtl+R, 당신은 입력하여 역사를 검색 할 수 있습니다
!text
이렇게하면 가장 최근 명령 시작 부분 과 'text'가 기록에서 검색됩니다.
그러나 당신이 잘못된 명령의 실행을 막기 위해 .bashrc에 넣는 것이 좋습니다.
shopt -s histverify
이것은 bash에게 any 히스토리 조치 (예 : !!:s/prev_text/after_text
)가 끝나면 프롬프트 행에 결과 행을 넣도록 지시합니다. 그런 다음 명령을 검토하거나 편집 한 다음 Enter 키를 누릅니다.
당신은 또한 할 수 :
history | grep "stuff"
그것은 뭔가를 반환합니다.
num stuff
입력 할 수 있습니다.
!num
역방향 검색 기록보다 역방향 검색을 사용하는 것을 선호합니다. 전자는 검색 키를 먼저 누른 다음 검색 문자열을 입력하는 것과 달리 명령의 몇 가지 문자 를 입력 한 다음 검색 키를 누릅니다.
기본적으로 내 시스템에서 M-p와 M-n은 유사한 기능에 바인딩되지만 화살표 키 바인딩을 선호합니다.
bind '"\e[A":history-search-backward'
bind '"\e[B":history-search-forward'
나는 정말로 별명이있어. 정말 "history | grep"이지만 "grep -E -v"명령으로 이전 "h 명령"항목을 필터링합니다.
alias h="history | grep -E -v '^ *[0-9]+ *h ' | grep "
같은 사용
h aliases
2003 less .bash_aliases
훌륭한 글, 션! 나는 이것을 코멘트에 넣었지만, 나는 수줍음이 많았다. :-)
또 다른 관련 유용한 기술은 Word를 변경하는 동안 이전 명령을 실행할 수있는 기능입니다. 디렉토리 이름을 입력했거나 파일 이름을 변경하려고한다고 가정 해보십시오.
$ 내 이름은 밥이다. 내 이름은 밥이다. $ ^ bob ^ jordan 내 이름은 요르단이다. 내 이름은 요르단이다.
명령이 실행되기 전에 명령이 확장, 대체 및 출력됨에 따라 잘못된 명령이 실행되면 bash에서 무엇을하고 있는지 알 수 있습니다.
Ctrl-r을 사용하여 내역을 탐색하는 작업은 귀찮은 작업이므로, hh 를 고려해보십시오.
https://github.com/dvorka/hstr
명령을 실행하는 것을 포함하여 탐색을 훨씬 간단하고 직선적이며 효율적으로 만듭니다.
Bash 명령 프롬프트에서 control-R을 입력하고 원하는 명령의 몇 문자를 입력하면 bash의 readline 기능이 해당 명령에 대한 명령 기록을 검색합니다.
검색을 시작하면 control-R을 다시 입력하여 다음 일치 명령으로 건너 뛸 수 있습니다.
vi
키 바인딩 (set -o vi
또는 set editing-mode vi
에 $HOME/.inputrc
포함)을 사용하도록 쉘을 구성한 경우 <Esc>/some-command<Return>
로 검색하고 n
(다음) 또는 Shift-n
(이전)에 도달하면 명령 줄 기록을 순환합니다.
CTRL+R @ John1024가 제안한 것처럼 잘 작동하지만, 최근의 명령 중 많은 부분이 비슷하고 빠르게 스캔 할 수있는 방법이 필요하다면 다소 지루합니다. 또 다른 방법은 history
:
$ history | grep keyword
나는 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-J
및 C-K
로 이동 한 다음 Enter
과 함께 명령을 실행할 수 있습니다.--height
: 표시된 줄 수를 설정하십시오.--tac
: 목록 되돌리기 (내역에 대해 더 논리적 인)--tiebreak=index
: fzf가 결과를 업데이트 할 때 기록 순서 유지