내가 무언가를 확인하는 동안 반 타입의 명령을 기억하십시오


97

나는 종종 다음과 같은 위치에 자신을 발견한다 : 나는 bash 프롬프트에서 긴 명령을 입력하기 시작했지만, 도중에 다른 명령으로 무언가를 확인해야한다는 것을 알았다. 이것은 내가 콘솔에있을 때 문제입니다 (X 없음). 그런 경우에 나는 다음과 같은 불만족스러운 방법 만 가지고 있기 때문에 종종 그런 경우가 있습니다.

  • 히트 ctrl+ alt+ F2돌아가서 계속 한 후, 다른 가상 콘솔에 로그인하고 내가 원하는 것을 찾아
  • ctrl+ a, echo + space+를 입력 enter하고 원하는 것을 찾은 다음 명령을 찾을 때 까지을 누릅니다 . ctrl+ a, delx 5, ctrl+ e, 계속
  • 마우스로 지금까지 입력 한 내용을 강조 표시하고 (gpm이 실행중인 경우 일반적으로 실행) ctrl+ c를 눌러 중단하고 마우스를 사용하여 내용을 강조 표시하지 않도록주의하면서 원하는 내용을 찾은 다음 마우스 가운데 버튼을 누릅니다. 새 프롬프트에서 계속
  • 반줄로 쓴 명령이 악영향을 끼치 지 않고 단순히 실패하고 진지하게 enter를 누른 다음 원하는 것을 찾은 다음 명령을 다시받을 때까지 위쪽 화살표를 누르고 계속되도록 명령 행 신에게기도하십시오.
  • 내 타임머신으로 뛰어 들어 시간을 거슬러 여행을 시작하기 전에 명령을 입력하기 전에 화면을 시작하라는 메시지를 표시하고, 현재로 돌아가고, ctrl+를 누르고 a c, 원하는 것을 찾고, ctrl+를 누른 다음 a ctrl+a계속하십시오.

내가 알고 싶은 것은 더 우아한 방법이 있습니까? 일종의 하위 셸 명령입니까?

준비 나 설정이 필요하지 않은 방법에 가장 관심이 있습니다.

답변:


68

의 다소 빠른 버전 알렉스의 Ctrl + A Ctrl+ K(앞줄로 이동 한 후 모든 기대를 절단하는) 만 사용하는 것입니다 Ctrl+ U배쉬에 뒤로 절단하는, 전체 라인 (관계없이 현재 위치) zsh을합니다. 그런 다음 Ctrl+ Y를 사용 하여 다시 붙여 넣습니다.


1
이것을 테스트하면서 Ctrl + U가 뒤로 이동하지 않고 뒤로 잘라지는 것으로 결론을 내립니다. 명령 중간에 커서를두면 명령 행에 뒤에있는 모든 것이 남습니다. 그러나 @alex의 솔루션에 비해 키 입력을 절약하기 때문에 여전히 33 % 개선되었습니다.
Lauritz V. Thaulow

2
@lazyr 아, 맞아; 에 zsh그것은 전체 라인을 잘라 않지만,에 bash그것을 거꾸로 잘라냅니다. 나는 그 차이를 전에는 눈치 채지 못했습니다
Michael Mrozek

2
오, 나는 Ctrl + U도 버퍼를 죽일 텍스트를 넣는 것을 몰랐다. 알고 반갑습니다! :)
alex

1
^U ^K와 같은 효과가 ^A ^K있지만 약간 더 인체 공학적이며 아래에서 훨씬 더 편리합니다 screen.
intuited

53

ctrl-A를 사용하여 줄의 시작을 시작하고 해시를 추가하고 return을 누르십시오. 이렇게하면 명령 내역에 주석으로 유지되며 커서를 사용하여 다시 가져올 수 있습니다

편집 : 방금 이것이 # 2에서 약간 더 우아한 변형이라는 것을 알았습니다.)


1
예, 왜 그렇게 생각하지 않았습니까? 감사합니다!
Lauritz V. Thaulow

1
본인의 답변을 게시하기 전에 읽어야합니다. 제임스가 제대로 해냈어
Sean C.

4
이 작동하지 않습니다 csh또는 zsh그들이 대화 형 쉘에 주석을 허용하지 않기 때문에. 에서 zsh당신은 적절한 옵션을 활성화해야합니다 setopt interactive_comments.
sam hocevar

1
@Sam 예, 그러나 ": command"는 동일한 효과를 갖습니다 ( ":"= null 명령)
barrycarter

6
@ barrycarter : 아니요, :이 목적에 해로운 것으로 간주되어 절대로 제안해서는 안됩니다. 세미콜론, 백틱 등의 모든 부작용과 함께 모든 것을 실행합니다.
sam hocevar

29

히트 Ctrl+A, Ctrl+K그것의 끝 (죽) 라인의 시작으로 이동 및 삭제 할 수 있습니다. 그런 다음 연구를 수행하고 계속 준비가되었을 때 Ctrl+Y(잉크)를 누르면 저장된 (킬된) 라인을 되돌릴 수 있습니다.


3
아, 이제 이것은 내가 생각했던 것과 더 비슷합니다. 그리고 저는 Emacs에서 항상 명령 행에서 동일한 작업을 수행해야한다고 생각했습니다.
Lauritz V. Thaulow

13

zsh에서는 Ctrl+ Z를 입력하여 입력하는 명령을 "일시 중지"하고 다른 명령을 입력합니다. 해당 명령을 실행하거나 Ctrl+로 중단 C하면 일시 중단 된 명령이 에디션으로 돌아옵니다 (커서 위치를 기억하더라도). 또한 편의상 Ctrl+를 입력 할 때 명령 줄이 비어 있으면 대신 Z키가 bg내장 기능을 호출 하므로 double Ctrl+ Z는 실행중인 명령을 백그라운드로 직접 보냅니다.

fancy-ctrl-z () {
  emulate -LR zsh
  if [[ $#BUFFER -eq 0 ]]; then
    bg
    zle redisplay
  else
    zle push-input
  fi
}
zle -N fancy-ctrl-z
bindkey '^Z'          fancy-ctrl-z

나는 bash에서 비슷한 것을하는 법을 모른다.

모든 쉘에서, 현재 행의 시작 부분에 a #를 추가하는 최첨단 방법을 사용할 수 있습니다 .


2
당신의 기능은 훌륭하지만 이미 내장 된zsh 기능 이 있다는 것을 알고 있습니까? 그것은 불려지고 당신이해야 할 일은 그것을 사용 하는 것입니다. push-linebindkey
Caleb

@ Caleb : 나는 여기 push-input보다는 왜 사용하는지 모르겠다.보다 적절한 것처럼 보인다 . 그러나 이것이 나머지 기능을 대체하는 것은 아닙니다. push-linepush-linepush-input
Gilles

내가 알 수있는 한, 실행중인 작업을 백그라운드로 만드는 것과 동일한 바인딩 효과가 있습니다. 뭔가 빠졌습니까?
Caleb

1
@Caleb : 아니, 내가의 조합을 찾을 단지의 두 가지 모두 (편리한 push-line가진, 빈 줄에 쓸모가 bg에 대한 것은 Ctrl+Z그냥 그 과정에 중단 한 경우에만 유용 Ctrl+Z하고 니모닉을 (나도 프로세스를 배경 처리하고 있습니다) 또는 부분 명령 줄).
Gilles

3
@Caleb push-input는 전체 입력 버퍼를 push-line일시 중단 하지만 현재 행만 일시 중단합니다. 여러 줄 명령을 입력하는 경우 전체 명령을 일시 중단하고 싶습니다 push-input. 그렇습니다 . (여러 줄 입력 버퍼에서 줄을 지연하려면 줄의 시작 부분으로 이동하여 줄 바꿈을 삽입 할 수 있음) push-input보다 더 유용한 경우가 많으 push-line므로 실제로 push-line기본 키 바인딩이 아닌 왜 궁금 push-input합니다.
Gilles

13

bash에서 Alt+ 만 입력하십시오 #.

그런 다음 준비를 눌러 Up다음 Alt+ #.

첫 번째 #는 줄의 시작 부분에 a를 넣어 주석으로 바꾼 다음을 누른 것처럼 줄을 수락합니다 Enter.

그런 다음 두 번째로 수행 #하면 시작에 이미 줄이 있음을 알 수 있으므로 제거하고 수락하여 다시 Enter키를 저장합니다 .

두 번째는 또 다른 삽입하는 경우 #에, 당신은 입력해야 Alt+ - Alt+ #대신.

다음과 같이 넣어서 zsh를 동일하게 만들 수 있습니다.

bindkey -M emacs '\e#' pound-insert

~ / .zshrc에.

또는 vi 바인딩을 사용하는 경우 #bash 및 zsh 모두에서 명령 모드에서 입력 할 수 있습니다 .


2
나를 위해 작동하지 않습니다, #을 제거하는 두 번째 명령은 #을 앞에 추가합니다.
Lauritz V. Thaulow

1
첫 번째가 작동합니까? 어떤 버전의 bash를 사용하고 있습니까?
Mikel

3
Alt + #은 세 번째 단락에서 설명하는대로 작동하지만 네 번째 단락에서는 설명하지 않고 다른 #을 앞에 추가하고 행을 수락합니다. Ubuntu 10.10에서 bash 4.1.5 (1) 릴리스를 사용합니다.
Lauritz V. Thaulow

1
오 사랑, bash는이 숫자 인수가 필요합니다, 예를 들면 Esc+1다음 Alt+ #전환합니다.
Mikel

그것은 작동하지만 Ctrl + A Del Ctrl + E보다 훨씬 번거 롭습니다. 특히 Alt + #이 실제로 Alt + Shift + 3 인 키보드 레이아웃에서는 더욱 그렇습니다.
Lauritz V. Thaulow

10

내가 가장 좋아하는 기능 중 하나는 zsh다른 답변의 해커가 없어도이를 처리하는 내장 푸시 라인 기능입니다. 내 파일에서 다음과 같이 Ctrl+ l에 바인딩 .zshrc했습니다.

bindkey '^L' push-line

그런 다음 명령에 입력 할 때 다른 빠른 작업을 수행해야 할 때 하나의 키로 호출하여 빈 프롬프트를 얻을 수 있습니다. 다른 명령을 실행하면 이전에 입력했던 내용으로 프롬프트가 자동으로 채워집니다.

이 계층을 여러 계층으로 연결할 수도 있으며 명령은 대기열로 푸시 한 순서와 역순으로 다시 나타납니다.


5
에 바인딩 Ctrl+QESC q(이맥스 모드에서) 기본적으로.
Gilles

bash와 비슷한 것이 있습니까?
Magnus

@ Magnus :이 질문에 대한 나머지 답변을 검토하십시오. 이것처럼 우아하지 않은 bash 솔루션이 있습니다.
Caleb

@ Caleb, 좀 더 구체적으로 말해야합니다 .bash와 비슷한 단일 키 조합 이 있습니까?
Magnus

1
이것은 Zsh에게는 분명히“올바른”답변입니다! push-line-or-edit기본적으로 어떤 키 맵에도 바인딩되지 않은 위젯 을 언급하고 싶습니다 . 최상위 프롬프트에서는와 같은 작업을 수행 push-line하지만 프롬프트 수준이 낮 으면 입력되는 전체 명령이 여러 줄 버퍼로 변환됩니다. 하나의 키 바인딩에 대한 두 가지 훌륭한 기능! push-line-or-editplain 대신 바인딩을 권장 할 수 있습니다 push-line. 당신은 아무것도 잃지 않고 유용한 기능을 얻습니다.
wjv

5

받는 사람뿐만 아니라 ctrl- a ctrl- k당신은 화면에 있다면 트릭, 단지 ctrl- a d에 다시 연결 한 후 분리하기screen -r

ctrl+로 다른 창을 열 수도 있습니다.a c


8
화면에 있다면로 다른 창을 엽니 다 Ctrl+A c.
Gilles

1
쉘 상태의 일부 측면 (변수, 함수, 별명 등)을 사용해야하는 경우가 아니라면 @Gilles ..
intuited

4

완벽하지 않은 다른 방법은을 누르십시오 Ctrl-X Ctrl-E. 그러면 반 입력 명령이 포함 된 기본 편집기가 열립니다. 그런 다음 명령을 파일에 저장하거나 편집기 내에서 새 쉘을 열 수 있습니다. 새 셸을 종료하면 편집기로 돌아가고 내용을 저장하면 자동으로 실행됩니다.

원래 쉘로 돌아 가지 않기 때문에 완벽하지는 않지만 명령을 강제로 실행하거나 완전히 버립니다. 그러나 걱정할 임시 선택이나 킬 버퍼가 없으며, 편집기 = vi와 같은 멋진 조정도 있습니다.

:wq            # execute the command
:cq            # cancel and abort
:! command     # execute command
:shell         # open a new shell
:r filename    # insert the contents of a file for editing
:r ! command   # insert the output of a command for editing

아주 좋은 대안. 나는 vi-emacs-agnostic이므로 powertools가 정말로 필요할 때 이것을 사용하여 조개처럼 기쁠 것입니다. (vi에 대해 말하면, 나는 얼마 전에 N64 리눅스 에뮬레이터 Mupen64Plus를 시도했습니다. Esc는 저장하지 않고 에뮬레이터를 종료합니다. 곧 아무것도 재생하지 않았습니다.)
Lauritz V. Thaulow

1
@lazyr, debian / ubuntu를 실행 sudo update-alternatives --config editor하고 좋아하는 편집기를 선택하십시오. 다른 시스템의 경우 EDITOR 또는 VISUAL 환경 변수를 선호하는 편집기로 설정하십시오 (예 : export EDITOR=/usr/bin/nano.bashrc에 추가) .
forcefsck

3

#줄의 시작 부분 에 추가하는 방법과 마찬가지로 줄의 시작 부분으로 돌아갈 필요가없는 더 간단한 방법이 있습니다.

그냥 오픈 견적을 추가하고, 닫습니다하지 않는 단일 또는 이중 여부.

그런 다음를 누릅니다 Enter.

그런 다음를 누릅니다 CtrlC.

부분 명령은 명령 기록에 저장되지만 (위쪽 화살표를 통해 사용 가능) 실제로 실행되지는 않습니다.


2

zsh를 사용하여 <ESC> q(이스케이프, Q) 를 입력하면 프롬프트 행이 잘려서 다른 명령을 입력 할 수 있습니다. 다음 프롬프트에서 잘라낸 텍스트가 자동으로 다시 나타납니다.

동시에 여러 줄을 기억할 수 있으므로 줄을 기다리는 동안 사용할 수 있습니다. 빈 줄에 사용하여 절단 선의 이력서를 지연시킬 수도 있습니다.

검사 / 준비를 위해 여러 명령을 사용해야하는 경우 가장 효율적인 방법은 아닙니다 ( <ESC> q각 명령 전에 다시 입력 해야 함). 그러나 나는 그것을 더 짧은 지름길에 묶을 수 있다고 생각합니다.


매뉴얼을 확인하려면 <ESC> h(escape, H)를 입력하십시오. run-help명령 행의 첫 단어를 인수로 하여 내장 기능을 실행합니다 . 한 번 완료하면 회선을 다시 찾을 수 있습니다.


대부분의 터미널은 당신이 할 수있게된다 M-q대신<ESC> q
sleblanc
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.