history 명령을 실행하지 않고 명령 행에 넣습니다.


57

! n을 사용합니다. 여기서 (n)은 history | less를 통해 찾은 명령 프롬프트에서 실행하려는 기록 파일의 행을 실행하기위한 행 번호입니다.

그러나 수동으로 수정하려는 명령 줄 기록 이벤트가 있습니다. 실제로 실행하지 않고 히스토리 이벤트 컨텐츠를 명령 행에 삽입하여 수정 한 후 리턴을 누르려면 어떻게해야합니까?

베스트,

답변:


71

히스토리 대체 후에 실행되지 않고 명령이 인쇄되도록 요청하려면 :p 수정자를 추가하십시오 ( 예 :) !42:p. 결과 명령도 기록에 입력되므로을 눌러 Up편집 할 수 있습니다 .

histverify 옵션 세트 ( shopt -s histverify) 가있는 경우 항상 히스토리 대체 결과를 편집 할 수 있습니다.

fc내장은 역사 확장 (아무 단어 지정자)에 제한된 액세스를 제공하고, 외부 편집기에서 이전 명령을 편집 할 수 있습니다.

!prefix시작하는 마지막 명령 을 참조 prefix하고 !?substring로 시작하는 마지막 명령을 참조하는 데 사용할 수 있습니다 substring. 찾고있는 것을 알면 시간을 많이 절약 할 수 있습니다 history | less.

이전 기록을 검색하는 또 다른 방법은 증분 검색입니다. Ctrl+를 누르고 R원하는 문자열을 입력하십시오. 보도 Ctrl+는 R지금까지 검색 문자열의 이전 선두로부터로 이동합니다 Ctrl+ S당신이 너무 멀리 갔다 한 경우. 이외의 대부분의 키 Ctrl+ R, Ctrl+ S, Backspace및 일반 문자는 증분 검색을 종료하고 자신의 일반적인 효과 (당신이 도달 한 줄에 커서를 이동합니다 예를 들어 화살표 키가 Enter명령을 실행 참조).


첫 번째 예에는 오타가 있습니다.
pbm

9
stty -ixonCtrl-s가 작동하기 전에 수행해야합니다 .
Dennis Williamson

@Dennis : 와우, 현대 터미널 에뮬레이터는 기본적으로 이것을하지 않습니까? <test> 맞습니다. 우분투의 그놈 터미널조차도 흐름 제어 기능이 있습니다!
Gilles

왜 아직도 그래야하는지 모르겠습니다. 스크롤하는 동안 무언가를 잡을 수 없습니다. Ctrl-s를 누를 때마다 프롬프트가 다시 나타납니다. 그리고 느린 직렬 연결은 대부분 과거의 일입니다.
Dennis Williamson

@ 데니스의 요점 Ctrl-s은 중요합니다. 그렇지 않으면 내가 한 것처럼 붙어 있습니다.
imz-Ivan Zakharyaschev

15

또 다른 작은 것 : Alt+#

현재 줄을 주석 처리하여 기록 버퍼로 옮깁니다.

따라서 명령 줄을 조립할 때 파일을 찾기 위해 임시 명령을 실행해야 할 경우 Alt+를 누르고 #다른 명령을 실행하고 기록에서 위로 이동하여 주석 처리를 제거하고 진행하십시오.


2
또한 Esc, #작품
Steven Penny

다른 ket 콤보 (fn + alt + shift + #) ;-)와 달리 실제로는 Mac에서 입력 할 수 있습니다 (shift 키를 누르고 ESC 키와 #을 함께 누름)
0xF2

7

Enter 키를 누르기 전에 마술 공간을 사용하여 기록을 확장 할 수 있습니다. .inputrc에서 공간을 마술 공간에 매핑하십시오.

$if Bash
     Space: magic-space
$endif

이제 내역 내역 뒤에 공백을 입력 할 때마다 공백이 즉시 확장되므로 편집하고 싶을 때 편리합니다!



4

Ctrl+r당신을 사용하여 기록을 검색 할 수 있습니다 :

pbm@tauri ~ $ 
(reverse-i-search)`xran': xrandr -o normal

찾은 모든 명령을 편집 할 수 있습니다 ...


나는 당신이 필요로 정확히 찾을 수 있다고 생각 : 실행 shopt -s histverify하고 다음 번에 사용할 때 !n명령을 실행 만 라인을 명령 두지됩니다 ...


Vass가 요구하는 것이 아니라 Ctrl + r로 검색하기 전에 명령을 실행해야합니다.
phunehehe

1
나는 이것이 그가 요구하는 것을 어떻게하지 않는지 이해하지 못합니다. 명령을 실행하기 전에 먼저 편집하려면 올바른 명령을 찾은 후 Tab 키를 누르면됩니다.
Steven D

2
따라서 절차는 (1) Ctrl + r, (2) 명령, (3) TAB, (4) 편집 명령, (5) ENTER를 찾을 때까지 입력합니다.
Steven D

1
@phuenhehe : "그러나 수동으로 수정하고 싶은 명령 행 히스토리 이벤트가 있습니다"
pbm

1
!n:p작동 하지 않습니까?
alex

1

나는 종종 이것을 원했다. csh (및 tcsh)를 사용할 때 관용구가있었습니다.
!:88*:p

이 관용구는 현재 명령 행에서 입력하는 지점 (일반적으로 끝 부분)에서 이전 명령의 "마지막 단어를 통해 단어 88"을 삽입합니다. csh에서 이러한 표현식이 단어를 생성하지 않는 것은 오류가 아닙니다. 즉, 단어 88 또는 그 뒤에 나오는 단어가 필요하지 않습니다. 단어 88이 없으면 입력중인 명령의 끝에 단어가 추가되지 않은 다음 결과 명령 줄을 실행하지 않고 기록으로 푸시합니다.

아시다시피,
*! (!! 및! -1과 같은)이 이전 명령입니다.
* : 88은 단어 88 (첫 번째 단어-일반적으로 명령-0)이며 csh에는 그러한 단어가 필요하지만 ...
* : 88 *는 단어 88에서 시작하는 모든 단어이며 csh는 단어가 존재하지 않아도된다.
* : p는 인쇄를 의미하지만 명령 행을 실행하지는 않습니다.
: p를 사용하거나 사용하지 않고 명령 행이 명령 히스토리에 추가됩니다.

"왜 88?" 궁금해하실 겁니다? *와 같은 키이므로 필요합니다. 긴 명령이 있다면 아마도! : 888 * : p가 필요할 것입니다. 죄송합니다 .bash AFAIK에서는 작동하지 않습니다. 배쉬는 단지 bash: :88*: bad word specifier

재미있는 사실 : 일반적으로 당신의 명령이 우선 일 필요는 없습니다.
> /tmp/foo echo My command is word 3
bash 및 csh에서 유효합니다.


질문에 bash 태그가 지정되어 있으므로 솔루션이 (t) csh에서만 작동한다고 말하는 것이 좋습니다.
zagrimsan

0

나는 보통 Ctrl+ r를 사용 하여 검색 한 다음 Ctrl+ e를 사용하여 줄 끝으로 이동합니다.



@JeffSchaller 나는 그것을 보지 못했습니다. CTRL + R 참조를 봅니다. 위의 게시물에서 퍼즐의 누락 된 부분 인 CTRL + E를 어디에서 볼 수 있습니까?
nikc
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.