SPACEが時々より多くの(またはより少ない)操作で機能しない理由

SPACEが時々より多くの(またはより少ない)操作で機能しない理由

通常|more別の画面を表示するには、スペースバーを押します。ただし、一部のコマンドでは、スペースは何も実行せず、実際に一度に1画面ずつ前にスクロールするには、スペースバーを実行し続ける必要があります。どちらも同じようにmore振る舞います。less

このマシンでは、このコマンドは2つの動作を表示します。

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。ところで変数を消してみると動作は同じです。)

これはほんのわずかな刺激なので、違いを見つけるために2つのシステムを分離し始めません。


**更新済み(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

通常、ショートカットキーである項目を要求する方法は次のとおりですlessEnter

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

barメッセージが表示されるのを待ってからプロンプトが表示されたら、終了を入力lessできません。このプログラムはTTYを標準入力処理モードに切り替えて、一度に1文字ではなく1行ずつ入力する必要があります。lessqqEnter

実行中 - をすばやく押すと、Ctrl実行機会がまったくなかったため、すぐにメッセージが表示され、終了できます。Csleep 1:lessqstty

ページングされたコマンドが開始時にただちにTTYに何らかのアクションを実行すると、競合状態が発生します。つまり、TTYを最初に妨げるプログラムless(文字入力を設定するためのプログラム)ですか、またはページング中のプログラムですか?これがsleep上記のテストに1つある理由です。lessゲームで勝ちましょう。

phpTTYを使用して(自己またはロードおよび実行された項目によって)php興味深い操作が行われ、この問題が解決したように聞こえます。

関連情報