나는 종종 긴 명령(또는 일련의 명령)을 작성하는 도중에 현재 명령을 완료하기 전에 다른 명령을 실행해야 한다는 것을 깨닫습니다.
예
때때로 나는...
- 네트워크 인터페이스의 정확한 이름을 찾아야 합니다(
wlp2s0b1
--blagh). - 특정 명령의 문서를 확인해야 합니다.
- 데몬 프로세스 와 통신하려면 시작해야 합니다(등을 사용하여
systemctl
) .service
- sudo를 사용하여 명령을 실행했는데 탭 완성이 작동하지 않으면
sudo ls
작업 중인 디렉터리에 대한 권한이 없기 때문에 디렉터리가 필요합니다.
나에게 이상적인 솔루션은 키보드 단축키를 사용하여 현재 명령을 스택에 푸시하고 줄을 지우는 것과 스택의 최상위 명령을 입력 줄에 넣는 또 다른 명령을 사용하는 것입니다.
현재 사용 중인 약간의 솔루션은 다음과 같습니다.
- 마우스를 사용하여 터미널에서 명령을 선택하고(사용 가능한 그래픽 터미널이 있는 경우) 복사한 후 준비되면 붙여넣습니다.(느린);
- Enter 키를 누르고(콘텐츠를 삭제하는 대신 명령이 실패하기를 바랍니다) ↑다음을 사용하여 복원합니다.(위험한);
- 재입장하다(시간이 많이 걸린다)
이를 더 잘 달성하는 방법에 대한 제안이 있습니까? 가능한 경우 사용 하겠습니다 zsh
. 하지만 똑같이 효율적인 솔루션이 있다면 bash
크게 감사하겠습니다.
답변1
zsh의 경우 이 효과에 바인딩할 수 있는 세 가지 위젯이 있습니다: push-input
, push-line
및 push-line-or-edit
(참조man 1 zshzle
더 많은 정보를 알고 싶다면). 상단 프롬프트(PS1) 둘 다 동일하게 동작합니다. 현재 버퍼가 버퍼 스택에 푸시된 다음 지워집니다. 다음 프롬프트에서(또는 위젯이 호출될 때 get-line
) 버퍼는 스택에서 팝되어 편집 버퍼에 로드됩니다. 이는 또한 여러 명령을 보류할 수 있음을 의미합니다.
기본적으로 ( + , 작동하지 않을 수 있음), ( + + 또는 , + ) 및 ( + 또는 , ) push-line
에 바인딩됩니다 . 하지만 다른 콤보에 쉽게 묶을 수 있습니다 . 예를 들어 + 의 경우 :^Q
Ctrlq^[Q
AltShiftqEscShiftq^[q
AltqEscqbindkey
Alth
bindkey '^[h' push-line
앞서 언급했듯이 이 세 가지 위젯은 최상위 프롬프트에서 동일하게 작동합니다. 그러나 여러 줄 입력 보조 프롬프트인 경우에는 다릅니다(PS2).
push-input
항상 전체 여러 줄 구조를 버퍼에 푸시하세요. 이것이 마지막 팁 이후의 전부입니다. 최상위 프롬프트로 돌아갑니다.
push-line
현재 행만 버퍼에 푸시됩니다. 마지막 메시지 이후 그게 전부입니다. 여전히 동일한 프롬프트 수준을 유지합니다.
push-line-or-edit
현재 여러 줄 구조 전체를 편집기 버퍼(아니요스택). 이것이 본질적으로 하는 일은
push-input
즉시 스택에서 버퍼를 다시 꺼내는 것입니다.
이러한 위젯의 대응은 get-line
버퍼에서 맨 위 행을 팝하여 커서 위치에 삽입한다는 것입니다. Emacs 모드에서는 ^[G
( Alt+ Shift+ g또는 Esc, Shift+ g) 및 ^[g
( Alt+ g또는 Esc, g) 에 바인딩됩니다.
효과적으로 사용하려면 push-line-or-edit
명령줄을 편집하는 데 필요한 일부 명령(단어와 줄 복사하여 붙여넣기, 새 줄 삽입(명령 실행 없이) 등)을 알고 있어야 합니다(또는 배우고 싶어야 합니다). 그렇지 않으면 push-line
및/또는 을 사용하는 것이 좋습니다 push-input
.
답변2
세부 사항을 확인하기 위해 두 번째 셸을 사용하는 것은 어떨까요? 나는 그것을 사용 screen
하거나 (보통) 오픈 셸도 있는 두 번째 데스크탑으로 전환합니다. 이렇게 하면 백업 셸로 전환하는 데 바로 가기를 하나 더 사용하고, 다시 전환하려면 바로 가기를 하나 더 사용하면 됩니다.
물론, 이 기술은 설명하는 마지막 경우에는 작동하지 않습니다. 두 번째 쉘이 첫 번째 쉘과 동일한 작업 디렉토리를 갖지 않기 때문입니다.