0

プロセス置換を使用すると、コマンドの出力のすべての行を取得できます。

# Echoes every seconds using process substitution
while read line; do
   echo $line
done < <(for i in $(seq 1 10); do echo $i && sleep 1; done)

上記と同じ方法で、「wpa_supplicant」コマンドの stdout 出力を取得し、stderr を破棄します。しかし、画面には何も表示されません!

while read line; do
    echo $line 
done < <(wpa_supplicant -Dwext -iwlan1 -c${MY_CONFIG_FILE} 2> /dev/null)

プロンプトで同じコマンドを入力すると、正常に出力されることを確認しました。

$ wpa_supplicant -Dwext -iwlan1 -c${MY_CONFIG_FILE} 2> /dev/null

間違いは何ですか?どんな助けでも大歓迎です。

4

1 に答える 1

0

最後に、ここで答えを見つけました 問題は簡単でした...バッファリング。stdbuf (およびパイプ) を使用すると、元のコードは次のように変更されます。

stdbuf -oL wpa_supplicant -iwlan1 -Dwext -c${MY_CONFIG_FILE} | while read line; do
    echo "! $line"
done

「stdbuf -oL」はストリーム行をバッファリングするので、実行中のプロセスからすべての行を取得できます。

于 2015-11-16T14:23:51.680 に答える