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

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

$ history | grep some_long_command

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

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

!123

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

some_long_command1foobar

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

#some_long_command1

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

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

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



답변

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

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


답변

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

$ ls -la
$ !!:p

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

당신은 또한 할 수 있습니다

!123:p

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


답변

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)
    현재 명령 줄에서 편집기를 호출하고 결과를 셸 명령으로 실행합니다.


답변

!123:gs/old/new/

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


답변

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

이것을 입력하십시오 :

! 123M- ^

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


답변

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.


답변

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

shopt -s histverify

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