bash 기록을 검색하고 명령을 다시 실행하려면 어떻게해야합니까?


답변:


428

입력 Ctrl R명령 행에서 이전 명령을 입력 시작합니다. 결과가 나타나면 계속해서 Ctrl R다른 경기를 봅니다. 원하는 명령이 나타나면 간단히Enter

Ctrl R기본값은 while 이지만 명령 ( reverse-search-history)을 바인딩 Ctrl T하려면 다음을 사용하여 구성 할 수 있습니다.

' "\ Ct"바인딩 : 역 검색 기록'

사용 가능한 다른 readline 바인드 가능 명령이 많이 있습니다. bash매뉴얼 페이지를 살펴보십시오 .

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

$ 역사

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

$ 역사
1 클리어
2 ls -al
3 vim ~ / somefile.txt
4 역사
$

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

$! 1

clear명령을 실행합니다 . 히스토리 내장에는 많은 기능이 있으며 bash, historyman 페이지 에서 더 많은 것을 볼 수 있습니다 .

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

$! -2

기본적으로 bash가 "두 명령 전에"실행 한 명령을 실행하도록 지시합니다. 기록 목록에서 이전 명령을 실행하려면, 우리는 그냥 사용할 수 있습니다 !!(단지 속기이다 !-1).

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

$! cl

를 누릅니다 Enter. 그리고 vim어때요? 다음과 같이 간단합니다.

$!? 일부

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

$ shopt -s histverify

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

이미 지적했듯이이 모든 정보는 bash맨 페이지 에서 수집 할 수 있습니다 . !, !! 및!? 지정자는 섹션 9.3 이력 확장을 살펴보십시오 .


39
+1 모든 시스템에서 12 년 이상 Linux를 사용해 왔습니다. 나는 그것이 존재한다는 것을 몰랐다. 내가 어떻게 그리워했는지
Aiden Bell

1
많은 시스템에서 위쪽 화살표를 눌러도 동일합니다.
mas

누군가 '!', '!!', '!?', '역사를 통합해야한다면 | grep '과'ctrl-r '을 종합적인 대답으로 선택하겠습니다.
Richard Hoskins

shoptbash_profile이 아닌 bashrc로 이동합니다 (또는 로그인 쉘이 아닌 쉘에서는 활성화되지 않습니다).
Tobu

2
또한 CTRL + R을 누른 후 CTRL + SHIFT + R을 여러 번 사용하여 이전 명령으로 되돌아
갈 수 있습니다.

37

의 대안으로 crtl+R다음을 입력하여 기록을 검색 할 수 있습니다.

!text

'text'로 시작 하는 가장 최근의 명령에 대한 기록을 검색합니다 .

그러나 잘못된 명령 실행을 방지하기 위해 이것을 .bashrc에 넣는 것이 좋습니다.

shopt -s histverify

이 후 같은 것을 bash에 지시 어떤 역사 작업 (같은 !!:s/prev_text/after_text), 그것은 명령 프롬프트로 결과 행을 배치합니다. 그런 다음 명령을 검토하거나 편집 한 후 Enter를 누를 수 있습니다.


5
!? text를 사용하여 "text"로 시작하는 것이 아니라 가장 최근의 명령을 다시 실행하십시오.
mark4o

3
누군가 '!', '!!', '!?', '역사를 통합해야한다면 | grep '과'ctrl-r '을 종합적인 대답으로 선택하겠습니다.
Richard Hoskins

32

당신은 또한 할 수 있습니다 :

history | grep "stuff"

그것은 같은 것을 반환 할 것입니다

num stuff

그런 다음 입력 할 수 있습니다

!num

15

역 검색 기록보다 과거 검색 기록을 사용하는 것을 선호합니다. 전자를 사용하면 검색 키를 먼저 누른 다음 검색 문자열을 입력하는 대신 명령의 몇 문자를 입력 한 다음 검색 키 누를 수 있습니다.

기본적으로 시스템에서 Mp와 Mn은 비슷한 기능에 바인딩되지만 화살표 키 바인딩을 선호합니다.

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

13

나는 정말 좋은 별명을 가지고 있습니다. h. 실제로 "history | grep"이지만 "grep -E -v"를 사용하여 이전 "h 명령"항목을 필터링합니다.

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

처럼 사용

h aliases
2003  less .bash_aliases

1
이 명령은에 명령을 추가하여 수행 할 수도 있습니다 HISTIGNORE.
tanenbring

12

훌륭한 글쓰기, 션! 나는 이것을 논평에 넣었지만, 나는 몇 가지 평판이 부끄러웠다. :-)

관련된 또 다른 유용한 기술은 단어를 변경하면서 이전 명령을 실행하는 기능입니다. 디렉토리 이름을 입력했거나 파일 이름을 변경하려고한다고 가정하십시오.

$ echo 내 이름은 밥이야
내 이름은 밥이야
$ ^ 밥 ^ 요르단
에코 내 이름은 요르단입니다
내 이름은 요르단

명령이 실행되기 전에 명령이 확장, 교체 및 출력되므로, 잘못된 명령이 실행되면 bash가 수행 한 작업을 볼 수 있습니다.


6

Ctrl-r을 사용한 히스토리 탐색은 번거롭기 때문에 hh 를 고려할 수 있습니다 .

https://github.com/dvorka/hstr

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

여기에 이미지 설명을 입력하십시오


사용 방법? 이 사진을보기 위해 어떤 키를 눌러야합니까?
Nakilon

2
hh를 설치하면 hh 명령을 사용하거나 설명서에 설명 된대로 키보드 단축키 (일반적으로 Ctrl-r)에 바인딩 할 수 있습니다.
Martin Dvorak

그것은 ctrl + r기본적으로 지금 바인딩됩니다
Alleo

4

bash 명령 프롬프트에서 control-R을 입력 한 다음 원하는 명령의 몇 문자를 입력하면 bash의 readline 기능은 해당 명령에 대한 명령 히스토리를 검색합니다.

검색을 시작한 후 control-R을 다시 입력하여 다음 일치 명령으로 이동할 수 있습니다.


3

당신이 당신의 쉘이 사용하도록 구성된 경우 vi키 바인딩 ( set -o vi또는 필요 set editing-mode vi$HOME/.inputrc), 당신은으로 검색 <Esc>/some-command<Return>및 히트 n(다음) 또는 Shift-n명령 행 역사를 통해 순환 (이전)를.


이것은 vim 사용자에게 가장 가까운 것입니다.
Gabor Marton

2

CTRL+ R@ John1024가 제안한 것처럼 정상적으로 작동하지만 최근의 많은 명령이 비슷하고 모든 것을 빠르게 스캔 할 수있는 방법이 필요한 경우 다소 지루합니다. 대안은 다음을 사용하는 것입니다 history.

$ history | grep keyword

0

HSTR이 마음에 들지만 가끔 설치할 수없는 것 같습니다. 따라서 fzf 를 사용하여 동작 을 모방 한 별명을 작성했습니다 ( hx", history execute").

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가 결과를 업데이트 할 때 히스토리 순서 유지
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.