히스토리에서 명령을 실행하는 방법이 있습니까?


99

예를 들면 다음과 같습니다.

[root@ip-10-0-7-125 ~]# history | grep free
  594  free -m
  634  free -m | xargs | awk '{print "free/total memory" $17 " / " $ 8}'
  635  free -m
  636  free -m | xargs | awk '{print "free/total memory" $9 " / " $ 10}'
  736  df -h | xargs |  awk '{print "free/total disk: " $11 " / " $9}'
  740  df -h | xargs |  awk '{print "free/total disk: " $11 " / " $8}'
  741  free -m | xargs | awk '{print "free/total memory: " $17 " / " $8 " MB"}'

다시 입력하지 않고 636 명령을 실행할 수있는 방법이 있는지 궁금합니다. 히스토리 636 또는 뭔가와 같은 숫자를 더하십시오.


14
당신은 알고 ctrl-r있습니까?
Carlos Campderrós

1
그래, 나는 그것을 알고 있지만 그것은 내가 원하는 것이 아닙니다.
하나의

답변:


170

bash에서는 !636괜찮을 것입니다.


12
In Linux-이것은 사람이 실행중인 쉘 (bash, zsh 등)과 관련이 있습니다. 리눅스에는 역사를 지원하지 않는 쉘이 있습니다.
Zoredache

@Zoredache 마찬가지로 Windows에서 대부분의 bash 구현에서 제대로 작동합니다.
Ajedi32

1
물론 배쉬뿐만 아니라 csh를 포함한 다른 쉘도 있습니다.
Drew

5
예를 들어 :p, 실행 하려는 것과 매우 유사한 명령이있는 경우 명령을 실행하지 않고 인쇄하도록 추가 할 수 있습니다 !636:p. 즉, 위쪽 화살표를 눌러 기록에서 다시 쉽게 선택할 수 있고 원하는대로 변경할 수 있습니다.
AJefferiss

78

예, "역사 확장"이라고합니다. 보다

LESS='+/^HISTORY EXPANSION' man bash

자세한 내용은.

느낌표 다음에 숫자를 사용하는 것이 가장 간단한 사용법 일 것입니다.

!636

그러나 히스토리 번호를 몰라도 마지막으로 실행 된 명령을 직접 실행할 수도 있습니다.

!!

또는 두 개의 명령을 다시 실행할 수 있습니다.

!-2

그러나 가장 자주 사용하는 형식은 마지막 명령의 마지막 인수를 반복하는 것입니다.

echo this text goes into a file > /tmp/afile.txt
cat !$

또는 파일을 검사한다고 가정 해 봅시다. 탭 완성을 사용하여 다음을 수행 할 수 있습니다.

ls -l /really/long/path/to/some/file
less !$

다시 말하지만, 맨 페이지 읽기 자세한 내용을 :

LESS='+/^HISTORY EXPANSION' man bash

25
대화식 Alt-.으로보다 편리 할 수 ​​있습니다 !$. 그것은 마지막 명령의 마지막 인수를 삽입 그대로 라인에.
ulidtko

2
@ulidtko이 특별한 탈출구는 어디에 기록되어 있습니까 (내가 알고 !$있지만 전혀 들어 본 적이 Alt-.없는가)? 링크를 게시 하시겠습니까?
edmz

5
LESS="+/DEFAULT KEY BINDINGS" man 3 readline, /etc/inputrc, ~/.inputrc. bash 이외의 많은 프로그램은 libreadline을 사용합니다. 사용자에게는 Alt-., Ctrl-X-U(실행 취소), Ctrl-/(바로 가기 설명), 탭 완성 등과 같은 기능 이 무료로 제공됩니다. 예를 들어, 그냥 세 줄PYTHONSTARTUP하나가에있는 탭 완성과 역사 사용할 수 있습니다 재고 파이썬 REPL을 . 어떤 작업을 수행하는 GNU Readline 라이브러리이기 때문에 bash에서와 거의 동일하게 작동합니다. readline의 맨 페이지는 기능에 대해 자세히 설명합니다.
ulidtko

2
또한 Ctl-UpArrow (또는 bash의 AltUpArrow)는 기록 목록을 거꾸로 스크롤합니다. 몇 개의 문자를 입력하면 UpArrow는 해당 문자로 시작하는 명령 만 가져옵니다. 예를 들어 "fr (Ctl-Up)"은 OP ​​목록의 "free ..."명령을 모두 스크롤합니다. 이것은 또한 readline을 사용하는 gnuplot & gdb와 같은 것들에서 작동합니다.
jamesqf

2
@ Ajedi32, 내 대답의 마지막 굵은 선을 참조하십시오. :) 진실로이 답변은 역사 확장무엇을 할 수 있는지에 대한 맛이 거의 없습니다 . 이것은 호출하는 명령이 아니라 쉘 레벨에 있다는 것을 명심하십시오. 따라서 echo {1..5}다음 touch !$만질 오 개 파일뿐 아니라 하나. 엄밀히 말하면 그것은 마지막 논쟁이 아니라 그 줄의 마지막 셸 단어입니다. (또한보십시오 echo hello >temp다음에 echo goodbye !$.) 당신이 더 명확하게 수정 제안 자유롭게 넣을 수있는 방법을 생각 할 수 있습니다.
와일드 카드

14

먼저 역사를 원하지 않으면 번호 등을 적어 두십시오.

bash에서 (그리고 아마도 다른 사람들) :

ctrl-r something 

( ctrl-r= "대화식으로 역방향 검색") ( something= 이전 명령의 일부)

여기에가 포함 된 최신 기록 줄이 표시됩니다 something. 이전 줄을 얻으려면 이전 줄을 얻을 때마다 ctrl-r (단독)을 다시 수행하십시오.

전의:

ctrl-r  10

'10'을 포함하는 최신 기록 줄을 표시하려면 (예를 들어,으로 줄을 $10예를 들어), ctrl-r다시 찾은 기록 줄을 검색 할 때까지

당신이 원하는 선이 나타나면 바로 Enter실행하는 (또는 당신은 또한을 사용하여 편집 할 수 있습니다 arrow keys, backspace그리고 ctrl-a라인의 시작 부분으로 이동 ctrl-e, 최종에 도착 ctrl-k: 커서에서 라인의 끝으로 "죽이기"로 (= 삭제 + 버퍼에 저장) ctrl-y: : 버퍼에서 이전에 죽인 비트 등을 복원합니다.)

당신이 앞으로 검색하려면 (CTRL-S), 먼저 필요가 XON을 해제하기 : 참조 https://stackoverflow.com/a/791800/1841533를 :

"실행하여 XON / XOFF를 비활성화

stty -ixon

"(그리고 터미널을 멈추지 않고도 ctrl-s를 사용할 수 있습니다)


이렇게하고 실수로 ctrl-r을 한 번 너무 많이 누르면 역사에서 다시 검색 할 수있는 방법이 있습니까?
kasperd

@kasperd : 그렇습니다. 많은 대답은 지적합니다 : 정방향 검색을위한 ctrl-s.
Olivier Dulac

불행히도 ctrl-s는 터미널을 고정하는 데 사용되며 bash는이를 비활성화하지 않으므로 기본 구성에서 작동하지 않습니다. (emacs와 같은 다른 프로그램은 ctrl-s를 사용하여 검색 할 수 있도록 터미널을 고정시키기 위해 키 바인딩을 비활성화합니다.)
kasperd

@kasperd : 예, 이전에 언급하지 않아서 죄송합니다 (정확한 이유 때문에 "많은 답변"을 지적했지만 주석에 이것을 입력하거나 링크를 제공하는 데 시간이 걸리지 않았습니다 ... .. 전화) 내가 지금 집에 와서 위의 질문에 대해 답이 편집 할 수 CTRL-S를 bash는 역사 검색 먼저 -ixon stty에 할 필요가
올리비에 Dulac

이 명령은 ctrl-s의 정상적인 사용을 중단하므로 실제로는 옵션이 아닙니다.
kasperd

7

쉘 내장 fc를 사용할 수 있습니다 :

fc -s 636

2
이것은 실제로 허용되는 답변보다 낫지-s혜택을 받으려면를 제거해야 합니다. 실행 fc 636하면 버퍼의 히스토리에서 명령 636으로 편집기 를 열고 저장하고 종료하면 명령이 수정되거나 실행되지 않습니다. 그리고 더 나은 것은 POSIX 호환 입니다.
와일드 카드

@StevenPenny 감사합니다. 그리고 네, POSIX가 무엇인지 알고 있지만 관련성을 보지 못합니다. 어쨌든, 쉽게 액세스하고 포함 된 문서 중 일부는 좋을 것입니다.
Faheem Mitha 님이

@FaheemMitha는 "help fc"를 실행 해보십시오.
와일드 카드

@Wildcard help는 POSIX가 아닙니다-해야 man dash하거나 비슷할 것입니다
Steven Penny

@ 와일드 카드 감사합니다. 나는 help존재 하는 것을 잊는 경향이 있습니다. 다른 쉘 내장. 그리고 새로운 시스템에 대한 도움을 원하지만 대신 횡설수설에 직면하는 경고를받지 않는 사용자를위한 수수께끼. :-(
Faheem Mitha

3

HSTR- hh에 대한 명령 bashzsh대화 형 명령 선택에서 Ctrl-R 검색 리버스보다 더 :

hh 대화식 히스토리 명령 예제

대화식이므로 명령을 실행하기 전에 검색하고 편집 할 수 있습니다.

우분투에서는 hh다음과 같은 단일 라이너로 설치할 수 있습니다 .

sudo add-apt-repository ppa:ultradvorka/ppa && sudo apt-get update && sudo apt-get install hh && hh --show-configuration >> ~/.bashrc

또는 단계별 :

sudo add-apt-repository ppa:ultradvorka/ppa
sudo apt-get update
sudo apt-get install hh

hhFedora, RHEL 또는 CentOS에 설치하십시오 .

sudo dnf|yum install hstr -y

macOS에서 homebrew:

brew install hh

... 다음으로 구성하십시오.

hh --show-configuration >> ~/.bashrc

이것은 기본 Ctrl-R 동작을 대체합니다.

hh --show-configurationBash 프로필에 추가 할 내용을 결정하기 위해 실행 합니다.

Github의 프로젝트 홈페이지에서 사용 가능한 추가 구성 옵션 : https://github.com/dvorka/hstr

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.