表示せずにスクリプトの出力を観察します。

表示せずにスクリプトの出力を観察します。

ps端末でawkを使用する簡単なスクリプトがあります。ただし、watchを使用してこのスクリプトを実行すると、次のようになります。

watch bench_run.sh

まったく出力がありません。

スクリプトは次のとおりです。

#!/bin/bash

bench_run() {
    local awk_cmd='
        {
            time=$10
            bench=$46

            start=match(bench, /throughput/)
            start+=(RLENGTH+1)
            end=match(bench, /base/)
            printf ("%s %s\n", time, substr(bench, start, end-start-1))
        }
    '

    ps aux | grep $USER | grep simulator | awk "$awk_cmd"
}

bench_run

時計が出力を印刷しないのはなぜですか?

答え1

全幅出力を取得するには、 ps auxに置き換えます。入力またはttyがテスト中で内部的に異なる動作をすることを決定した可能性があります。ps auxwwpswatch

答え2

これは改善されたバージョンの始まりです。これまで私はそれを次のように変更しました。

  • ■削除grepawk正規表現の一致を実行できます)
  • psオプションをよりよく活用する
  • 奇妙なawk_cmdローカル変数の削除
  • $1 と $46 参照 (現在 $37、ps出力から不要なフィールド 9 個を削除)
#!/bin/bash

bench_run() {

    ps -u "$USER" -o time,args | awk "/simulator/ {
            time=\$1
            bench=\$37

            start=match(bench, /throughput/)
            start+=(RLENGTH+1)
            end=match(bench, /base/)
            printf ("%s %s\n", time, substr(bench, start, end-start-1))
            }
    "
}

bench_run

使用されるバージョンですsed

#! /bin/sh
watch 'ps -u "$USER" -o time,args | 
       sed -n -e "/[s]imulator/ s/\([^ ]*\) .*\(throughput.*\)base.*/\1 \2/ p"'

'watchコマンドの周りに一重引用符を使用したので、"sedコマンドの周りに二重引用符を使用しました。

simulatorプロセスのフルネームの場合は、次のものを使用できます。

#! /bin/sh
watch 'ps -o time,args -C simulator | 
       sed -n -e "s/\([^ ]*\) .*\(throughput.*\)base.*/\1 \2/ p"'

関連情報