bash 히스토리를 사용하여 이전 명령을 가져 와서 복사 한 다음 '실행'하지만 명령은 주석 처리됨


79

bash기술 을 향상시키기위한 질문 입니다. 나는 항상 이것을한다 :

$ history | grep some_long_command

...
...
123 some_long_command1.........
124 some_long_command2.........
...

그런 다음 다음을 수행하여 찾은 명령을 실행할 수 있습니다.

!123

그러나 나는 종종 이것을하고 싶다.

some_long_command1foobar

즉, 실행하기 전에 명령을 변경하십시오. 대신 bash를 사용하여이 명령을 실행할 수 있습니까?

#some_long_command1

그래서 그것은 주석을받습니다.

그런 다음 마우스를 사용하여 명령을 강조 표시하고 편집 한 다음 실행할 필요가 없습니다 (키보드를 더 빠르게 사용할 수 있음).

스크립트를 작성할 수 있다고 생각하지만 이미 어딘가에 기능이 내장되어있을 수도 있습니다 ....?


6
가장 쉬운 방법 bind Space:magic-space은 bash 프로필을 입력하는 것입니다. 그런 다음을 누르면 Space로 확장 !123됩니다 some_long_command1.
Blaz 2013 년

@ 정중 : 감사합니다! 그것은 나에게 새로운 것이었다. 매우 유용한.
marlar aug

답변:


140

history 명령을 사용하는 대신 ctrl+r해당 명령 을 사용 하고 입력하는 것이 좋습니다 . 수정하러가는 것처럼 화살표 키를 누르면 자동 완성 인식에서 빠져 나가고 실행하기 전에 수정할 수 있습니다.

업데이트 : 또한 방금 입력 한 문자열이 포함 된 다른 명령을 순환하려면 계속 ctrl+r


8
vi 키 바인딩 ( set -o vi) 을 사용하는 경우를 사용 /하여 기록을 검색하고 편집 할 수도 있습니다.
William Pursell 2012-06-12

1
더 강력한 기능은 부분 명령이나 명령에 포함 된 경로의 일부를 입력 한 다음 화살표를 사용하여 기록을 탐색 할 수 있도록하는 것입니다. bash에 대한 내역 검색 뒤로, 내역 검색 앞으로 옵션 검색
DavidC 2013 년

2
DavidC, 나는 다른 사람들이 이것을하는 것을 보았지만 그것은 나를 위해 작동하지 않습니다. 명령의 처음 몇 글자를 입력 한 다음 위쪽 화살표를 누르면 입력 한 내용을 무시하고 아무 것도 입력하지 않은 것처럼 기록을 살펴 봅니다 (가장 오래된 것부터). 이를 수행하기 위해 쉘을 어떻게 구성합니까?
Daniel Watrous 2013

1
위 / 아래 가 일치 항목을 스크롤하지 않고 검색에서 즉시 종료 되는 것이 슬프다 . 위 / 아래 (내가 원하는 명령을 찾고 있음을 나타냄) 를 사용하여 일치 항목을 스크롤 하고 검색에서 왼쪽 / 오른쪽으로 만 나가는 것이 좋습니다 (원하는 명령 을 찾았 음을 나타냄). 이제 편집 할 준비가되었습니다.)
ADTC

3
@ADTC 내가 원하는 작업을 수행하는 방법을 찾았습니다.을 누르고 ctr+r입력을 시작한 다음 포함 된 모든 명령을 찾으려면을 계속 누르십시오 ctrl+r. 다시 말해, 위 / 아래로 수행하려는 작업은 다음과 같이 수행됩니다 (라운드 로빈 방식으로)ctrl+r
Miquel

61

실제로 :p명령에 추가 하여 실제로 실행하지 않고도 인쇄 할 수 있습니다. 예를 들면 :

$ ls -la
$ !!:p

ls -la실행하지 않고 이전 명령으로 인쇄되며 (위)를 눌러 검색 하고 편집 할 수 있습니다.

당신은 또한 할 수 있습니다

!123:p

123rd 명령을 이전 명령으로 인쇄합니다.


2
+1 일반적인 히스토리 명령이 OP : !mycmd:p. Bash에서 vi 명령이 켜져있는 경우 Pursell의 대답은 그보다 더 좋거나 좋습니다. Miquel이 언급했듯이 Ctrl-r은 차선책입니다.
Brent Faust

123 in이 줄의 시작 부분에 없으면 다음과 같이 할 수 있습니다.!? 123? : p
Udi

19

fc명령을 사용하여 기록에서 명령을 편집 할 수도 있습니다 .

WIKI 말한다,

FC는 목록 또는 편집 및 reexecutes이 명령은 이전에 대화 형 쉘에 입력 한 유닉스의 표준 프로그램입니다. fcbash 쉘 에 내장 된 명령입니다 . 도움말 fc 는 사용 정보를 표시합니다.


역 증분 검색 ( Ctrl+ R) 외에도 bash 단축키가 더 있습니다 .

에서 man bash:

이전 기록 (Cp)
    히스토리 목록에서 이전 명령을 가져와 목록에서 뒤로 이동합니다. 
다음 역사 (Cn)
    목록에서 앞으로 이동하여 내역 목록에서 다음 명령을 가져옵니다. 
역사의 시작 (M- <)
    기록의 첫 번째 줄로 이동합니다. 
기록 끝 (M->)
    입력 이력의 끝, 즉 현재 입력중인 줄로 이동합니다. 
역 검색 기록 (Cr)
    현재 줄에서 시작하여 필요에 따라 기록을 '위로'이동하여 뒤로 검색합니다. 이것은 증분 검색입니다.
전방 검색 기록 (Cs)
    현재 줄에서 시작하여 필요에 따라 기록에서 '아래로'이동하여 앞으로 검색합니다. 이것은 증분 검색입니다.
비 증분 역 검색 기록 (Mp)
    사용자가 제공 한 문자열에 대한 비 증분 검색을 사용하여 현재 행에서 시작하는 히스토리를 뒤로 검색합니다. 
비 증분 순방향 검색 기록 (Mn)
    사용자가 제공 한 문자열에 대한 비 증분 검색을 사용하여 기록을 앞으로 검색합니다.
yank-nth-arg (MCy)
    첫 번째 인수를 이전 명령 (일반적으로 이전 줄의 두 번째 단어)에 삽입합니다. 인수 n을 사용하여 이전 명령의 n 번째 단어를 삽입합니다 (이전 명령의 단어는 단어 0으로 시작). 음수 인수는 이전 명령의 끝에서 n 번째 단어를 삽입합니다. 인수 n이 계산되면 "! n"히스토리 확장이 지정된 것처럼 인수가 추출됩니다.
yank-last-arg (M-., M-_)
    이전 명령 (이전 기록 항목의 마지막 단어)에 마지막 인수를 삽입합니다. 인수를 사용하면 yank-nth-arg와 똑같이 동작합니다. yank-last-arg에 대한 연속적인 호출은 히스토리 목록을 통해 다시 이동하여 각 행의 마지막 인수를 차례로 삽입합니다. 히스토리 확장 기능은 "! $"히스토리 확장이 지정된 것처럼 마지막 인수를 추출하는 데 사용됩니다.
MCE (shell-expand-line)
    셸처럼 줄을 확장합니다. 이것은 별칭 및 히스토리 확장뿐만 아니라 모든 쉘 단어 확장을 수행합니다. 역사 확장에 대한 설명은 아래 역사 확장을 참조하십시오.
히스토리 확장 라인 (M- ^)
    현재 행에서 히스토리 확장을 수행합니다. 역사 확장에 대한 설명은 아래 역사 확장을 참조하십시오.
마지막 인수 삽입 (M-., M-_)
    yank-last-arg의 동의어입니다. 
운영 및 다음 획득 (Co)
    실행을 위해 현재 행을 승인하고 편집을 위해 히스토리에서 현재 행에 상대적인 다음 행을 가져옵니다. 모든 인수는 무시됩니다.
편집 및 실행 명령 (C-xC-e)
    현재 명령 줄에서 편집기를 호출하고 결과를 셸 명령으로 실행합니다.

11
!123:gs/old/new/

'old'문자열을 'new'문자열로 바꾸는 명령 123을 실행합니다.


6

M-^ (Mac의 경우 option-shift-6)을 눌러 편집 모드로 이동할 수 있습니다.

이것을 입력하십시오 :

! 123M- ^

그리고 명령 # 123을 편집 할 것입니다. ctrl-r을 사용하는 것과 비슷하지만 느낌표 구문으로 시작합니다.


M-^더 손가락 친화적 인 것에 다시 바인딩 할 수 있습니까 ?
Blaz 2011 년

4

history명령 을 사용하는 대신 history-search-backward/ history-search-forward를 쉽게 기억할 수있는 키 바로 가기에 바인딩 합니다 (PgUp / PgDown 선호). 그렇게하려면 다음을 .inputrc파일에 넣으십시오 .

"<key code>":  history-search-backward
"<key code>":  history-search-forward

를 얻으려면 셸에 <key code>입력 Ctrl-V <key>하고 출력 된 내용에서 시작 ^[\e로 바꿉니다.

이 설정이 끝나면 입력 some하고 PgUp을 눌러 some_long_command. 필요 some_long_command with_some_arg하지만 some_long_command with_some_other_arg나중에 비슷한 명령 이있는 경우 입력 some한 다음 PgUp을 반복해서 눌러 도달 할 때까지 순환 하거나를 입력 하고 PgUp을 누르고 some두 명령이 다른 위치로 커서를 이동합니다. 몇 개의 문자를 입력하고 PgUp을 한 번 더 누르십시오. 유사한 명령을 빠르게 페이지를 넘기거나 구분할 수있는이 기능은 내 생각에 Ctrl-R.


3

당신은 또한 넣을 수 있습니다

shopt -s histverify

에서 .bash_profile실행하지 않고 히스토리 확장이 명령 줄에 나타나므로 편집하기 전에 편집 할 수 있습니다.


1

"제안 상자"와 같은 기록 https://github.com/dvorka/hstr 을 시도해 볼 수 있습니다. Bash 기록을 읽고 빠른 탐색이 가능합니다.

hh

마지막 명령을 얻으려면 hh를 입력하고 명령으로 이동 한 다음 오른쪽 화살표를 사용하여 명령 줄 (편집 및 / 또는 주석 추가 가능)에서 가져옵니다.


0

유닉스 / 솔라리스에서 마지막으로 입력 한 명령을 얻으려면 ^ p


0

놓다

별칭 r = 'fc -s'

당신에 .bashrc(홈 디렉토리) 다음은 입력 할 수 있습니다

r <whatever>

명령 프롬프트 <whatever>에서 히스토리 에있는 마지막 명령 (동일한 매개 변수) 의 복사본을 실행합니다 . 당신이 필요하다고 느끼면 당신이 무엇을 실행했는지 보려면 위쪽 화살표를 누르십시오.

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