Ruby 명령이 tty echo를 끄고 있습니다.

Ruby 명령이 tty echo를 끄고 있습니다.

Ruby 스크립트를 실행한 후 거의 100% bash 명령줄이 실행됩니다.나타나다실제로는 키 입력을 나에게 보여주지 않고 조용히 받아들이고 있습니다.

이는 여러 OS 업데이트를 통해 여러 버전의 Ruby에서 발생했습니다. 현재 저는 OS X 10.9.2에서 v1.9.2p29를 실행하고 있습니다. reset문제를 해결합니다. clear, et al., 그렇지 않습니다.

echo아래의 "now you don't" 등은 보이지 않는 명령 의 출력입니다 .

$ echo Now you see my typing...
Now you see my typing...

$ bundle exec jekyll build
...
done.

$ This is the output of an unseen echo command

$ About to run "reset"

$ echo And we''re back.
And we're back.

stty -a일이 작동할 때 출력:

speed 9600 baud; 57 rows; 187 columns;
lflags: icanon isig -iexten echo echoe echok echoke -echonl echoctl
    -echoprt -altwerase -noflsh -tostop -flusho pendin -nokerninfo
    -extproc
iflags: -istrip icrnl -inlcr -igncr ixon -ixoff -ixany imaxbel iutf8
    -ignbrk brkint -inpck ignpar -parmrk
oflags: opost onlcr oxtabs onocr onlret
cflags: cread cs8 -parenb -parodd hupcl -clocal -cstopb -crtscts -dsrflow
    -dtrflow -mdmbuf
cchars: discard = ^O; dsusp = <undef>; eof = ^D; eol = <undef>;
    eol2 = <undef>; erase = ^?; intr = ^C; kill = ^U; lnext = ^V;
    min = 1; quit = ^\; reprint = ^R; start = ^Q; status = <undef>;
    stop = ^S; susp = ^Z; time = 0; werase = ^W;

stty -a상황이 그렇지 않을 때 출력:

speed 9600 baud; 57 rows; 187 columns;
lflags: -icanon isig -iexten -echo echoe -echok echoke -echonl echoctl
    -echoprt -altwerase -noflsh -tostop -flusho pendin -nokerninfo
    -extproc
iflags: -istrip icrnl inlcr -igncr ixon -ixoff -ixany imaxbel iutf8
    -ignbrk brkint -inpck ignpar -parmrk
oflags: opost onlcr oxtabs onocr onlret
cflags: cread cs8 -parenb -parodd hupcl -clocal -cstopb -crtscts -dsrflow
    -dtrflow -mdmbuf
cchars: discard = ^O; dsusp = <undef>; eof = <undef>; eol = <undef>;
    eol2 = <undef>; erase = ^?; intr = ^C; kill = ^U;
    lnext = <undef>; min = 1; quit = ^\; reprint = <undef>;
    start = ^Q; status = <undef>; stop = ^S; susp = ^Z; time = 0;
    werase = <undef>;

특히 에서는 가 가 된 것을 lflags확인 echo했습니다 -echo.

이 문제의 원인이 무엇인지 또는 확인해야 할 다른 설정/진단이 무엇인지 잘 모르겠습니다.

답변1

프롬프트에 다음을 입력하면:

$ And now you don't.
> 

이로 인해 명령줄 연속이 실행됩니다. 분명히 OSX에 보조 프롬프트가 설정되어 있지 않지만(프롬프트에 대해 추측하고 있습니다) 문제는 "$ 그리고 지금은 그렇지 않습니다.`"라는 특정 문자열을 사용하고 있기 때문입니다.

이것을 입력하면:

$ echo And we''re back.
And were back.

계속을 종료하고 있습니다. 다른 문자열을 사용해 동일한 문제가 발생하는지 확인하세요.

메모:결론 문제는 '....'.

답변2

echo터미널 드라이버 설정의 설정은 터미널 드라이버가 다음을 수행해야 하는지 여부를 지정합니다 .에코입력한 문자를 다시 되돌립니다. vi최신 쉘과 같은 애플리케이션그들의 프롬프트에그것을 사용하지 마십시오. 터미널을 사용하지도 않습니다.정식 모드, 그들은 모든 키 누름을 처리하고에코터미널 장치에 기록하여 직접 입력하는 내용입니다.

그러나 readline 및 이를 사용하는 모든 응용 프로그램은 다음 bashgdb같이 비활성화합니다.그들의 반향echo터미널이 비활성화되었음을 감지하면 다른 쉘이 좋아 zsh하거나 tcsh그렇지 않습니다.

readline이 자체 에코를 수행하므로 셸 프롬프트(또는 자체 줄 편집기가 있는 최신 셸) echo에서는 항상 비활성화되어 있습니다 . /는 각 프롬프트 앞에 터미널 설정을 저장하고 라인 편집기를 구현하는 데 필요한 설정(비활성화 포함 )으로 설정하고 명령을 실행하기 전에 저장된 값으로 재설정합니다.bashbashreadlineecho

따라서 출력은 stty -a저장된 구성입니다. 그리고 /readline(다른 쉘은 아님) 이 비활성화 bash되면 자체 에코를 비활성화합니다.echo저장된 구성에서.

다음을 실행하여 보고 있는 것과 동일한 동작을 얻을 수 있습니다.

stty -echo

응용 프로그램은 일반적으로 암호 프롬프트를 실행할 때 또는 위의 경우와 같이 자체 텍스트 편집을 구현하기 위해 터미널 에코를 비활성화하고 vi( bash그런 다음 터미널 표준 모드를 ​​사용하지 않음) 종료 시 설정을 복원합니다.

귀하의 경우의 또 다른 차이점은 icanon비활성화되어 있다는 것입니다. 이는 두 번째 경우에 있을 가능성이 더 높다는 것을 의미합니다.

Ruby 스크립트는 터미널 설정을 올바르게 재설정하지 못하는 시각적 응용 프로그램을 시작할 수 있습니다. SIGKILL과 같은 트랩할 수 없는 신호로 해당 애플리케이션이 종료되거나 여전히 실행 중이거나 일시 중단된 경우 이러한 상황이 발생할 수 있습니다.

터미널 설정을 복원하려면 stty sane또는 를 수행할 수 있습니다 reset. 아직 실행 중인 프로세스가 없는지, 스크립트가 실행되는 애플리케이션이 무엇인지, 왜 오작동하는지 확인하고 싶을 수도 있습니다.

관련 정보