방금 입력 한 접두사를 사용하여 이전 명령 검색


67

위 / 아래 화살표를 사용하여 명령 기록을 탐색 할 수 있습니다.

Matlab과 같은 일부 IDE에서 무언가를 입력 한 다음 화살표 키를 누르면 입력 한 내용으로 시작하는 기록 명령 만 스크롤합니다. 정말 편리하지만 쉘 터미널에서는 작동하지 않습니다.

쉘 터미널에서 비슷한 기능을 얻는 방법이 있습니까? 그리고 터미널 사용 효율을 높이기위한 다른 팁이 있습니까?


fish;) 와 같은 기능을 제공하는 쉘을 간단히 사용할 수 있습니다 .
yoann

@ yoann 당신은 bash가 그렇지 않다고 가정합니다. readline을 통해 기본적으로 액세스 할 수 없습니다.
muru

@muru bash에서 CTRL + R을 알고 있으며 egmont의 답변은 Page Up / Page Down으로 깔끔한 방법을 제공합니다. 그러나 화살표 키로 그렇게 할 수있는 방법이 있습니까?
yoann

1
@yoann 확인 unix.stackexchange.com/a/76591/70524을 . 대신 \e[5~\e[6~사용 \e[A, \e[B.
muru

답변:


95

당신이 찾고있는 것은입니다 CtrlR.

입력 CtrlR한 다음 원하는 명령의 일부를 입력합니다. 배시는 첫 번째 일치 명령을 표시합니다. 계속 입력 CtrlR하면 bash는 이전 일치 명령을 순환합니다.

기록에서 뒤로 검색하려면 CtrlS대신 입력하십시오 . ( CtrlS그렇게 작동하지 않으면 XON / XOFF 흐름 제어를 비활성화해야 할 수도 있습니다 stty -ixon. 그렇게하려면을 실행하십시오 .)

이 내용은의 "검색 중"에 설명되어 man bash있습니다.


1
Ctrl-QCtrl-S흐름 제어를 먼저 끄지 않고 적중 하여 터미널을 정지 시킨 경우 정지 상태를 종료합니다 .
HongboZhu

26

이것들을 당신의 ~/.inputrc:

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

이들은하게 Page Up하고 Page Down당신이 원하는대로 동작합니다. (일부 배포판에서는 이미 구성되어 있습니다.) 개인적으로 이러한 방법은 Ctrl+ R또는 보다 편리합니다 history.


이것은 모든 현재 답변에서 가장 편리한 방법입니다. 작동 메커니즘에 대해 조금 설명해 주시겠습니까?
Lee

3
~/.inputrc또는 /etc/inputrc환경 변수 $INPUTRC가 참조하는 파일은 bash (쉘)를 포함하여 readline을 사용하는 모든 응용 프로그램의 행 편집 구성 파일입니다. bash의 매뉴얼 페이지에서 이러한 키워드 중 하나를 검색하여 자세한 내용을 확인하십시오. \e[5~/ \e[6~는 대부분의 터미널 에뮬레이터에서 Page Up / Down 키로 생성 된 이스케이프 시퀀스입니다. 이를 보려면 cat명령을 실행 한 다음이 키를 누르십시오 (이스케이프 바이트는 터미널 ^[에서 inputrc에서로 \e표시됨).
egmont

원래 질문의 예는 Up / Down 키가 Matlab에서 이러한 방식으로 작동한다고 말합니다. inputrc에 Up 및 Down 시퀀스를 배치하고이 작업에 할당하면 어떤 일이 발생했는지 확인하는 것이 흥미로울 것입니다. 제대로 작동하거나 기본 동작과 충돌하여 불쾌한 부작용이 발생합니다. 잘 모르겠습니다. 실험 해 본 결과를 기뻐할 것입니다.
egmont

내가 할 때 echo $INPUTRC비어 있습니다. 나는 Ubuntu 14.04를 사용하고있다
JorgeeFG

2
나는 개인적으로 최대 오버라이드 (override) 선호 아래로 이렇게 화살표 : "\e[A": history-search-backward"\e[B": history-search-forward
A.Wan

9

^ r / ^ s 역사 i- 검색 외에도 :

alt.이전 명령의 마지막 "워드"를 커서에 삽입합니다. 이전 명령에서 마지막 단어를 얻으려면 반복하십시오. 그러나 후행 &은 백그라운드 명령의 마지막 단어로 계산됩니다.

이 슈퍼 편리 mkdir foo, cd고도 점. 위로 화살표 ^ A, ALT-D (순방향 단어 삭제)보다 더 빠르게 cd.

마지막 두 번째 단어를 얻으려면 esc - 2 alt+.(즉, emacs 스타일의 숫자 인수를 사용 alt+.하여 끝까지 시작합니다. 음수는 처음부터 앞으로 카운트합니다.) 그러나 이것은 일반적으로 가치가있는 것보다 더 문제가 많습니다. 어느 시점에서 마우스와 복사 / 붙여 넣기, 또는 위쪽 화살표와 ^ w / ^ y 부분에 도달하는 것이 더 빠릅니다 (아래 참조).


터미널이 올바르게 / 적절하게 설정되어 있으면 ctrl-left 및 ctrl-right가 단어 단위로 앞뒤로 이동합니다. 그렇지 않다면, 적어도 alt-b와 alt-f는 같은 일을 할 것입니다.


ctrl- /는 실행 취소입니다. 약간 오버 슈트 할 때 취소 할 수있는 경우 자동 반복을 사용하여 단어를 훨씬 효율적으로 삭제할 수 있습니다.


명령의 더 강력한 믹싱 / 매칭은 Emacs에서와 같이 작동하는 킬 링을 사용하여 발생합니다. ctrl-y는 마지막 ctrl-w / ctrl-u / ctrl-backspace / alt-d를 붙여 넣습니다. 오래된 텍스트를 순환하려면 alt-y입니다.

킬링 링 항목에 여러 개의 ctrl-w 또는 행의 항목이 있습니다. 두 가지를 제거하고 나중에 하나만 붙여 넣으려면 왼쪽 및 오른쪽 화살표 또는 무언가를 사용하여 항목을 분리하십시오.

이 모든 것들을 결합하면

  • 명령을 입력 시작
  • ctrl-r을 사용하여 이전 명령으로 돌아가서 control-w 또는 이와 유사한 명령으로 그 일부를 가져옵니다.
  • esc-r 또는 alt+r일부를 삭제하기 전의 상태로 복원합니다.
  • ALT-은 >역사의 끝으로 이동 (즉, 아래쪽 화살표 모든 방법을) 위로의 중앙에 있던 명령에 얻을.

다른 대화식 사용 팁 :

사용 가능 shopt -s globstar하므로 **/*.c현재 디렉토리를 포함하여 재귀 적입니다. 때로는 대화식 사용에 편리하지만 일반적 find -name '*.c' -exec foo {} +으로 더 좋습니다.

bash 스크립트를 작성하면 shopt -s extglob대화식 쉘에서도 활성화 하는 것이 편리합니다 . 당신은 것입니다 가끔 좋아하는 물건에 대한 사용 발견 *.!(c|h)이 .c 또는 .H로 끝나지 않는 파일과 일치합니다.

당신이 좋아하는 별칭을 찾아 ls -l, less그 밖의 무엇이든 당신은 많이 할. ( cp -i, mv -i,와 rm -I의 습관을하지 마십시오. 좋네요 따라 선택적 RM을 수행하는 그들. GNU의 RM의 -I 모든 인수에 대해 한 번 요청합니다.)

나는 좋아한다 alias m=less( "더보기"). 내가 한 less로 설정 ,.이전 / 다음 파일에 바인딩 ( lesskey). 기본값은 자동 반복과 함께 사용할 수없는 다중 키 누르기 순서입니다.


GNU 화면에서 모든 것을하고 싶습니다. Konsole (또는 내가 시도한 다른 터미널 에뮬레이터)의 탭 보트보다 번호가 매겨진 화면 창을 추적하는 것이 더 쉽다는 것을 알았습니다. 아직 모르는 screen경우 tmux가 새롭고 덜 무섭기 때문에 배우십시오.

다른 쉘과 동일한 cwd로 새 쉘을 여는 기능과 같은 것을 얻으려면 cd / pushd / popd에 대한 사용자 정의 후크를 cds 8사용하여 화면 창 8의 쉘이 사용하는 디렉토리를 cd로 할 수 있습니다 . 화면 세션이 하나만있는 한 화면 세션 외부의 쉘에서도 작동합니다.


광산이 "적절하게 구성되어 있지 않은"것 같습니다. 여기에 보이는 많은 단축키가 작동하지 않습니다. 우분투 14.04의 스톡 터미널을 사용하고 있습니다. 어떻게 구성 할 수 있습니까?
JorgeeFG

@ JoorgeeFG : gnome-terminalKDE로 전환하기 전에 Ubuntu 14.04에서 즉시 사용할 수 있다고 생각합니다 . 관련 옵션은 터미널 설정, esc-prefix 대 high-bit 및 기타 설정에 있습니다. 그들 중 일부는 ssh를 통해 나를 위해 완벽하게 작동하지 않습니다. (예 : ctrl 왼쪽 / 오른쪽 화살표 키의 이스케이프 코드를 섞으면 5D문자 그대로 나타납니다)
Peter Cordes

7

에 다음 줄을 추가하십시오 ~/.inputrc

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

이것은 egmont의 답변과 비슷하지만 Page Up 및 Page Down을 사용하는 대신 Arrow Up 및 Arrow Down에 이스케이프 시퀀스를 사용합니다. 이 방법은 Mac에서 사용하는 것이 훨씬 편리합니다.


4

나는 항상 HISTSIZE 값 이 큰 컴퓨터를 구성 하여 타임 스탬프 값이있는 HISTTIMEFORMAT 뿐만 아니라 더 긴 기록 목록을 유지 하여 명령이 언제 실행되었는지 확인할 수 있습니다.

export HISTSIZE=10000
export HISTTIMEFORMAT="%m/%d/%Y %T "

3

내가 일반적으로 사용하는 수단은 history명령을grep

IE :

history | grep <command im looking for>

그러면 해당 명령을 포함하여 입력 한 명령의 번호 기록이 표시되며 다음을 사용할 수 있습니다.

!<number listed in history command>

그 명령을 다시 실행하십시오.

IE :

history | grep history

142  history
143  history | grep lvresize
568  history | grep echo
570  history | grep echo
571  history | grep history

뒤에 : !571

반복 할 것이다 history | grep history


1
CR =이 훨씬 더 + 더 안전
PSkocik

1
아마도 개인적으로 나는 grep으로 파이프 된 히스토리가 대부분의 명령을 찾는 더 빠른 수단이라는 것을 알 수 있습니다. 더 안전한 한, 나는 당신이 무엇을 의미하는지 잘 모르겠습니다 .cR로 검색 할 때 기록을 사용할 때 내재 된 위험은 무엇입니까?
Gravy

2
@Gravy PSkocik은 !역사 대체가 덜 안전하다는 것을 의미한다고 생각 합니다.
derobert

3
@Gravy 본질적인 위험은 실수로 잘못된 라인을 얻는 것입니다. Control-S를 사용하고 xon / xoff 흐름 제어를 활성화하지 않은 경우 (종종 기본값) 터미널이 정지 된 이유를 모릅니다. 그렇다면 Control-Q가 다시 가져옵니다.
derobert

1
@PSkocik에 동의합니다. cr은 히스토리 라인을 다시 같은 방식으로 실행하는 것보다 편집하기가 쉽기 때문에 훨씬 좋습니다. 정확한 동일한 명령을 다시 실행하는 것은 복잡한 1- 라이너에서 변형을 다시 입력하거나 긴 경로에서 다른 파일을 탭 완성하는 시간을 절약 할 수있는 간단한 경우입니다. 내 대답을 참조하십시오.
Peter Cordes

1

내 bash 터미널에서 매일 4 가지 팁 (및 기타)을 사용 했습니다.

  • 마지막 명령을 실행하십시오. !!

  • 히스토리에서 명령 N 실행하십시오 . !N

  • 역사에서 접두사 시작하는 마지막 명령을 인쇄하십시오 . !prefix:p

  • 히스토리에서 접두사 시작하는 마지막 명령을 실행하십시오 . !prefix


1

cona zsh대신에 사용 하는 bash것이 괜찮다면 oh-my-zsh 를 사용하십시오.

여기에는 명령 기록을 통한 아래쪽 화살표 탐색이 포함되어 있습니다. 또한 텍스트를 이미 입력 한 경우 (Mathlab과 같은) 동일한 탐색이 가능합니다.

편집 : 또한 별칭 및 테마와 같은 개발자 중심의 내용도 포함합니다. 이러한 추가 기능으로 인해 배포판을 더 크고 더 복잡하게 사용할 수 있습니다.

https://github.com/robbyrussell/oh-my-zsh


1
oh-my-zsh많은 물건이 들어 있습니다. 당신은 말할 수도 있습니다 :이 정확한 기능은 필요한 설정이 특정 설정이나 앱 일 때 해당 배포판에 포함됩니다.
muru September

게시물을 편집했습니다. 게시물이 간단한 앱보다 크다고 경고했습니다.
user9869932

1

~ / .bashrc에 다음 별명을 추가하십시오.

alias h='history | awk '"'"'{$1="";print}'"'"' |sed "s/^ *//" |grep -v "^h " | sort | uniq | grep'

사용법 : h fire명령 목록에 fire 포함 됩니다 . 또는 fire로h ^fire 시작하는 명령 목록을 얻습니다 .

이것은 일련의 명령을 동시에보고 싶을 때 유용합니다.

그건 그렇고, '"'"'추악하지만 작은 따옴표로 작은 따옴표를 피할 수있는 다른 방법을 찾을 수 없습니다.


참고- h="history | awk '{\$1=\"\"; print}'작동해야합니다. 또는 함수를 작성하고 호출하십시오.
DarkHeart

DarkHeart에게 감사하지만 코드를 사용해 보았지만 내 환경에서 작동하지 않는 것으로 나타났습니다. 내 환경에 다른 것이있을 수 있습니다.
Hosi Golden
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.