다른 쉘에서 테스트

다른 쉘에서 테스트

not알림( )을 표시하는 기능이 있습니다. 따라서 이를 사용하여 명령이 완료되는 시기를 표시할 수 있습니다.

sleep 5; not

그러나 때로는 ;notOS X의 터미널에서(몇 년 전) 현재 명령이 실행되는 동안 두 번째 명령을 입력할 수 있었습니다. 두 번째 명령은 첫 번째 명령이 완료된 후에 실행됩니다.

그래서 입력 sleep 5Enter하고 바로 입력하겠습니다 notEnter. 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+JASCII 개행 문자입니다. ABCDEFGHIJNUL에서 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

하지만, 다른 메뉴 완성 키를 찾으면 장기적으로 많은 수고를 덜 수 있을 것입니다. 대부분의 터미널 애플리케이션에서 개행 문자는 큰 의미를 갖습니다.

관련 정보