SPACE가 때때로 더 많은(또는 더 적은) 작업에 작동하지 않는 이유

SPACE가 때때로 더 많은(또는 더 적은) 작업에 작동하지 않는 이유

보통 |more다른 화면을 보려면 스페이스바를 누르세요. 그러나 일부 명령의 경우 space는 아무 작업도 수행하지 않으며 실제로 한 번에 한 화면씩 앞으로 스크롤하려면 스페이스바를 계속 실행해야 합니다. 둘 다 동일하게 more행동합니다 .less

이 머신에서 이 명령은 두 가지 동작을 표시합니다.

php -i |more;tree -A |more

PHP에서는 각 공백 다음에 Enter 키를 눌러야 합니다. tree스페이스바를 누르면 스크롤됩니다.

Bash를 사용하는 것과 같은 몇 가지 트릭을 시도했지만 2>&1운이 좋지 않았습니다.

bash -c "php -i 2>&1;tree -A" | more

이와 같이 명령을 연결하려면 전체 출력에서 ​​스페이스바를 눌러야 함을 의미합니다. 그래서 PHP가 방해가 되는 제어 문자를 출력하고 있는지 궁금합니다 more.

다른 컴퓨터에 SSH를 시도했는데 php -i이 동작이 발생하지 않습니다.

( LESS로 설정했습니다 -FRX. 그런데 변수를 지워보니 동작은 동일합니다.)

이것은 단지 사소한 자극일 뿐이므로 차이점을 찾기 위해 두 시스템을 분리하기 시작하지 않을 것입니다... 누군가에게 경각심을 불러일으키는 것인지 궁금합니다.


**업데이트됨(2014년 11월 26일)**

어떤 사람이 나에게 연락하여 다음과 같은 방법으로 이를 재현할 수 있다고 말했습니다.

Ubuntu 10.04.4 LTS GNU bash, 버전 4.1.5(1)-릴리스(x86_64-pc-linux-gnu) Suhosin-Patch(cli)가 포함된 PHP 5.3.2-1ubuntu4.21(내장: 2013년 9월 19:13) :4일 13시)

내 현재 시스템은 이제 Mint 17(PHP 5.5.9-1ubuntu4.5)이며 이 동작이 없습니다. Ubuntu 14.04.1(SSH를 통해)에서도 괜찮습니다.

Ubuntu 11.10(SSH를 통해)에서 문제가 발생했습니다. PHP 5.3.6-13ubuntu3.10

Ubuntu 12.10(SSH를 통해)에서는 문제가 없습니다. PHP 5.4.6-1ubuntu1.4

그러면 Ubuntu 11.x와 12.x 사이 또는 PHP 5.3과 5.4 사이에서 수정될 수 있는 버그처럼 보입니까? (아무도 더 많은 증거를 찾지 못하면 몇 주 후에 자가 답변으로 게시하겠습니다.)

답변1

호출기는 표준 입력이 명령 파이프라인의 이전 요소 출력에 연결될 more때 실행됩니다. less페이징 UI를 제공하려면 제어 TTY 장치를 명시적으로 열어야 합니다. 제어 TTY는 파이프의 첫 번째 요소의 표준 입력이기도 합니다.

페이징 명령이 TTY에서 읽거나 방해하는 경우(TTY 설정 변경) 이와 같은 이상한 동작이 발생할 수 있습니다.

미친 "여행"을 위해서는 다음을 시도해 보세요.

$ vi file | less

일반적으로 단축키인 항목을 요청하는 방법은 다음과 같습니다 less.Enter

(echo foo; sleep 1; stty icanon; bar) | less

bar메시지가 나타날 때 까지 기다렸다가 프롬프트가 나타나면 종료를 입력 less할 수 없습니다 . 이 프로그램은 TTY를 표준 입력 처리 모드로 전환하여 한 번에 한 문자가 아닌 한 줄씩 입력해야 합니다 .lessqqEnter

실행 중에 - 를 빠르게 누르면 Ctrl실행 기회가 전혀 없었기 때문에 즉시 메시지가 표시되고 종료할 수 있습니다.Csleep 1:lessqstty

페이징된 명령이 시작 시 즉시 TTY에 어떤 작업을 수행하는 경우 경쟁 조건이 발생합니다. 즉, TTY를 먼저 방해하는 프로그램 less(문자 입력을 설정하기 위한 프로그램)입니까 아니면 페이징 중인 프로그램입니까? 이것이 sleep위의 테스트에 하나가 있는 이유입니다. less게임에서 승리합시다.

phpTTY를 사용하여 (자체적으로 또는 로드 및 실행된 항목에 의해 ) php흥미로운 작업이 수행되었으며 이 문제가 해결된 것처럼 들립니다 .

관련 정보