web-dev-qa-db-ja.com

時計はパイプされるとps aux出力を遮断します

ここでは重要ではない(Python)スクリプトの作業中に、watchps auxを含む非常に奇妙な動作に遭遇しました。

この問題を1行に減らすことができました。実行中

watch "ps aux | grep 'ps aux'"

ターミナルでは、予想どおり、通常数行の出力が得られます。

output showing 5 results

上の3行は切り取られ、最後にps auxがほとんど収まらないことに注意してください。端末のサイズをそれ以上収まらないサイズに縮小すると、結果から完全に切り取られます。

output showing 2 results

つまり、grepはカットオフ出力のみを受け取ります。私がこれについて最も困惑させているのは、これが起こる非常に限られた範囲です。どちらにも起こりません

ps aux | grep "ps aux"
watch "ps u -C ps"
watch "ssh localhost 'ps aux | grep \"ps aux\"'"

これらのすべてのケースで、リストは期待どおりに折り返されます。

これは、Ubuntu 15.04のbashとshの両方に当てはまるようです。

スクリプトでこの問題を回避できましたが、この動作の説明はありますか?

5
MrLemon

鼻の悪魔。1

man psは次のように述べています(私の強調):

comm       COMMAND   command name (only the executable name).
                     Modifications to the command name will not be
                     shown.  A process marked  is partly
                     dead, waiting to be fully destroyed by its
                     parent.  The output in this column may contain
                     spaces.  (alias ucmd, ucomm).  See also the args
                     format keyword, the -f option, and the c option.
                     When specified last, this column will extend to
                     the Edge of the display.  If ps can not determine
                     display width, as when output is redirected
                     (piped) into a file or another command, the
                     output width is undefined (it may be 80,
                     unlimited, determined by the TERM variable, and
                     so on).  The COLUMNS environment variable or
                     --cols option may be used to exactly determine
                     the width in this case.  The w or -w option may
                     be also be used to adjust width.

確かに、COLUMNS変数を手動で設定すると役立ちます。

watch "ps aux | grep 'ps aux'"

enter image description here

COLUMNS=2000 watch "ps aux | grep 'ps aux'"

enter image description here

1Cコンパイラについては話していないのに...

4
muru