git
私は時々興味のある変化を見つけるためにつるはし機能を使用します。明らかに、これは非常に遅いかもしれませんが(例えば、同様に適用されますhg grep
)、もっと重要なのは爆発的です。一部の結果は一緒にクラスタ化され、非アクティブに分離されます。
このため、私は実際に出力を次にパイプして結果を読み取ろうとしますless
(実際にこれは基本的に行われます)。git
バーストが発生すると、ctrl-S
ソフトウェアプロセスが十分に高速化することはできません。これでコントロールが役に立ちました。
しかし、私はしばしばこの動作に直面しています。less
十分にスクロールすると、画面に表示するコンテンツの1行だけがコマンドから出なくても、コマンドが中断され、より多くのメッセージが表示されるまでプロンプトとほとんどの制御が失われますgit
。less
来る。今、なぜこれが起こるのか理解していますが、これがシェルコマンドの動作である場合は、ctrl-Z
プロンプトを復元して実行するために使用しますbg
。less
ポケットベルの警告を復元する同等の方法はありますか?
この場合、ctrl-Z
役に立たない。 Unix ジョブ制御は、画面の内容を管理するコマンドには適していません。また、とにかく私はシェルプロンプトに戻りたくありません。一般的に私が望むのは、スペースバーを繰り返し押しながら見たことが何であるかを確認することです。
Ctrl-C
また、役に立たない。プロンプトを再開できますが、受信したコンテンツがフリーズする可能性があります。つまり、好奇心が満たされて最新のコンテンツに戻ろうとするとき(スペースバーを数回押すなどG
))、いくら待っても見えるものだけが表示されます。F
(モード)を使用しても同じですtail -f
。
このコマンドを使用してgit
動作をシミュレートします。
(echo -e 'foo\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n.' ; sleep 3 ; echo -e 'bar\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n.' ; sleep 10; echo baz) | less
答え1
解決策は実際に使用することですが、ctrl-C
生成された信号が次のようになることを確認することです。いいえにパイプされた他のコマンドに送信されますless
。最初に得られなかった決定的な洞察は次のとおりです。less
読み取りは端末でのみ行われるため、通常の入力はそのコマンドでのみ使用できますが、端末ドライバからの信号はパイプ内のすべてのプロセスに渡されます。
このように信号伝達を制御することは言葉のように簡単ではありません。私が知っている限り、良い解決策はないので、最も悪い解決策を思い出しました。つまり、setsid(1)
他のコマンドを独自のセッションに分離することです。
% setsid sh -c "/bin/echo -e 'foo\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n.' ; sleep 3 ; /bin/echo -e 'bar\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n.' ; sleep 10; /bin/echo baz" sh-c | less
この設定を使用すると、クリックしたときに予想さctrl-C
れる動作を得ることができます。less
以前に受信したコンテンツの後にプロンプトが表示され、以前のすべてのコンテンツを再度参照できます。sleep
最新のコンテンツに直接戻ると、最後のコンテンツ(baz
、ここ)が最終的に表示されます。コンテンツの作成を独自のセッションに入力し、信号からプロセスを分離します(読み取り操作を中止するために含める必要があります。そうしないと、読み取り操作がless
中断されます)。
主な問題は、これがsetsid(1)
完全に非標準であることです。すべてのUnixおよびUnixファミリーカーネルはsetsid(2)
システムコールをサポートしていますが、スタンドアロンコマンドとしての可用性はわずかにLinux上の注意です。インストールで利用できない場合は、お気に入りのパッケージマネージャがそれを別々に提供するか、パッケージの一部として提供する必要があります(ソースは単純でパブリックドメインにあります)util-linux
。
% brew install util-linux # MacOS
名前のせいで誤解しないでください。setsid(1)
少なくとも移植可能です。 (注:util-linux
ここに表示されるHomebrewの樽には樽のみが含まれています。つまり、競合のために検索パスに何もインストールされていません。binディレクトリを手動で追加する必要があります。$PATH
)