通常|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
通常、ショートカットキーである項目を要求する方法は次のとおりですless
。Enter
(echo foo; sleep 1; stty icanon; bar) | less
bar
メッセージが表示されるのを待ってからプロンプトが表示されたら、終了を入力less
できません。このプログラムはTTYを標準入力処理モードに切り替えて、一度に1文字ではなく1行ずつ入力する必要があります。less
qqEnter
実行中 - をすばやく押すと、Ctrl実行機会がまったくなかったため、すぐにメッセージが表示され、終了できます。Csleep 1
:
less
qstty
ページングされたコマンドが開始時にただちにTTYに何らかのアクションを実行すると、競合状態が発生します。つまり、TTYを最初に妨げるプログラムless
(文字入力を設定するためのプログラム)ですか、またはページング中のプログラムですか?これがsleep
上記のテストに1つある理由です。less
ゲームで勝ちましょう。
php
TTYを使用して(自己またはロードおよび実行された項目によって)php
興味深い操作が行われ、この問題が解決したように聞こえます。