2

psで指定されたカスタム形式を使用して出力を読み取ろうとしています-o。カスタムセパレーターを指定したいので、AIXフォーマット記述子(たとえば%p、pid、%aargsなど)を使用していますが、通常のフォーマットコードを使用した場合にも同じ問題が発生します。

%aこのフォーマット文字列の最後に指定すると、すべてが期待どおりに機能します。

$ echo 'while true; do sleep 1; done' > really-really-really-long-filename 

$ bash really-really-really-long-filename &
[1] 31181

$ ps -p 31181 -o '%p|%a'

  PID|COMMAND
31181|bash really-really-really-long-filename

ただし、%aが最後のフィールドでない場合は、次のようになります。

$ ps -p 31181 -o '%a|%p'

COMMAND                    |  PID
bash really-really-really-l|31181

これは、画面幅の修飾子とは関係がないようです。ここで他に何か遊んでいますか?

(GNU bash 4.1.5)

4

1 に答える 1

3

おそらく最も洗練されたソリューションではありませんが、選択したフィールドの幅コントロールを使用できるように、形式を組み合わせて一致させることができます。例えば

[me@home]$ ps -p 780 -o "%a|%p"
COMMAND                    |  PID
dbus-daemon --system --fork|  780

[me@home]$ ps -p 780 -o args:50 -o "|%p"
COMMAND                                           |  PID
dbus-daemon --system --fork --activation=upstart  |  780

切り捨てが発生する理由については、最後のフィールドではない場合、各フィールドに使用されるハードコーディングされた幅があると思います (ユーザーが幅を指定しない限り)。これにより、印刷前に最大列幅を決定するために最初に出力をバッファリングする必要があるプログラムを節約できます。

argsデフォルトのハードコードされた幅の場合は(この の実装を27参照) のようです。ps

これはあくまで私の勝手な憶測であり、必ずしもそうであるとは限りません。

于 2012-05-25T13:25:49.610 に答える