not
알림( )을 표시하는 기능이 있습니다. 따라서 이를 사용하여 명령이 완료되는 시기를 표시할 수 있습니다.
sleep 5; not
그러나 때로는 ;not
OS X의 터미널에서(몇 년 전) 현재 명령이 실행되는 동안 두 번째 명령을 입력할 수 있었습니다. 두 번째 명령은 첫 번째 명령이 완료된 후에 실행됩니다.
그래서 입력 sleep 5
Enter하고 바로 입력하겠습니다 not
Enter. sleep
종료 후 실행됩니다 not
.
그러나 Linux에서의 내 경험에 따르면 이런 일이 발생하지 않습니다. 종료 후 sleep
명령줄이 표시되지만 not
등록 Enter되지는 않습니다. Terminator, Konsole 및 tty를 테스트했습니다.
이 동작은 터미널 에뮬레이터에 따라 달라지나요? 그렇다면 원하는 방식으로 작동하는 것이 있나요? 또는 내가 선택한 터미널(터미네이터)에서 이 작업을 수행할 수 있는 방법이 있습니까?
다른 쉘에서 테스트
작동하지 않습니다. 즉, 두 번째 명령이 등록되지 않았습니다.
bash
bash --norc
bash --norc --noprofile
sh
작동합니다. 즉, 두 번째 명령 레지스터는 다음과 같습니다.
bash --norc --noprofile --noediting
zsh
~/.inputrc
기본 셸에서 해당 행을 선택적으로 제거하고 bash
다시 테스트했습니다. 문제를 다음 줄로 추적했습니다. 제거되면 두 번째 명령이 예상대로 등록됩니다.
Control-j: menu-complete
Ctrl이상한 점은 + 를 바인딩하려고 하면 i문제가 없다는 것입니다. 이 항목이 두 번째 명령이 등록되는 것을 방지하는 이유는 무엇이며, 두 번째 명령에 대해 원하는 동작을 유지하면서 계속 Ctrl+를 사용할 수 있는 방법이 있습니까 j?menu-complete
답변1
bash를 사용한다고 가정하면 ^Z(예: Ctrl-Z)를 눌러 프로세스를 중지하고 배경으로 이동한 다음 다른 bash 프롬프트를 표시해 보세요. input
fg; not
, 전자는 중지된 프로세스를 계속하고 완료되면 반환됩니다.
또는 기다리고 싶은 프로그램의 프로세스 ID(예: 2342)를 알아보세요. 새로운 Should에 다음을 입력하세요.
until kill -0 2342; do sleep 1; done; not
이는 매초마다 확인됩니다.
답변2
글쎄, 편집 내용 중 일부를 기반으로 매크로 명령 CTRL+J
에 바인딩 했습니다. bindkey
이는 기본 동작을 bash
고려한 문제를 설명합니다 readline
.
입력은 일반적으로 readline
매우 유사한 stty raw
패턴으로 읽혀집니다. 입력 문자는 입력되는 즉시 읽혀지며 쉘의 줄 편집기는 자체 버퍼링을 처리합니다. readline
전경을 얻을 때 터미널을 원래 상태로 설정하고 다른 전경 프로세스 그룹이 호출되면 이전 상태로 복원합니다.
CTRL+J
ASCII 개행 문자입니다. ABCDEFGHIJ
NUL에서 10바이트. readline
이 문자를 먹고 메뉴 완성 시 실행되는 명령줄의 나머지 부분을 확장하도록 구성했기 때문에 자동 완성 기능이 작동하지 않습니다. 자동 완성이 커널의 줄 규칙에 의해 버퍼링되면 터미널은 readline
전경에 있을 때와 다른 상태에 있습니다.
포그라운드에 있을 때 readline
입력 캐리지 리턴 -> 줄 바꿈 문자를 자체적으로 변환하고 터미널 드라이버는 이를 전혀 변환하지 않습니다. 그러나 자동 입력 내용을 입력하면 터미널 드라이버는 일반적으로 캐리지 리턴 문자를 사용할 수 있는 줄 바꿈으로 변환합니다 stty [-]icrnl
. 따라서 라이브 입력 명령에는 리턴 키로 충분하지만 터미널의 줄 규칙은 개행 기호를 보냅니다. 전체 메뉴 명령으로 해석됩니다.
를 사용하여 터미널 드라이버에 이 변환을 중지하도록 지시할 수 있습니다 stty -icrnl
. 익숙해지는 데 최소한 약간의 시간이 걸릴 수 있습니다. 터미널 입력을 허용하는 다른 명령은 일반적으로 반환 값이 아닌 개행 문자를 기대하므로 CTRL+J
전경을 제어할 때 명시적으로 사용 하거나 bash
반환 값을 이와 같이 처리하도록 가르쳐야 합니다.
read
터미널에서 읽을 때 예상대로 작동하지 않는다고 언급하셨습니다 . 다시 말하지만, 명시적으로 를 사용하여 입력 줄을 끝내는 경우 CTRL+J
이런 일이 발생할 수 있습니다 . 아니면... 가르칠 수도 있습니다:
read()
if [ -t 0 ]
then command read -d $'\r' "$@"
else command read "$@"
fi
하지만, 다른 메뉴 완성 키를 찾으면 장기적으로 많은 수고를 덜 수 있을 것입니다. 대부분의 터미널 애플리케이션에서 개행 문자는 큰 의미를 갖습니다.