2016-05-22 14 views
4

バックグラウンドで起動されたコマンド "piped"の標準出力を回復する方法がわかりません。説明しましょう。私は、このコマンドを持っている:Bash。バックグラウンドで実行されたコマンドからのstdout

iface=$(airmon-ng start wlan0 2> /dev/null | grep monitor) 

を、私は$を使用してPIDを回復するためにバックグラウンドにすべてを送りたい!しかし、私はどこにでも&を入れたときに、grepの停止作業とのiface varが空です。何か案が?ありがとうございました。

+0

これをバックグラウンドに置くと、コマンドが終了する前に 'iface'にどのような価値があると思いますか? –

+0

'airmon-ng start wlan0'を実行すると、結果として多くの行が生成されます。テキスト "monitor"を持つ1行だけをgrepしたいと思います。この例は私が必要とするものの縮小例です。もちろん、より複雑で、私はその行でregexpsを使ってインタフェースの正確な名前を取得しますが、関係はありません。ここでの問題は、行をvarに入れて、同時にすべてをバックグラウンドで実行して$でPIDを取得することです! 。興味を持っていただきありがとうございます! – OscarAkaElvis

+0

私はあなたがしていることを集めていると思いますが、出力を変数に代入しようとしていて、 'iface'に格納する前に出力が終了するのを待っていないのであれば、 'airmon-ng'の前に' iface'が終了しました。 'airmon-ng'が終了する前にどのような価値があると思いますか?あなたはバックグラウンドでそれをする必要があるので、このスーパーは遅いですか? –

答えて

0

あなただけgrepからの出力を待っている間にスクリプトがまだ実行されていることのステータスを取得したい場合は、それはあなたが獲得に干渉しないようにstderrにプログレスメーターを表示しますpvなどの既存のツールを使用することができます出力。

あなたは、たとえば、

get_monitor() { 
    printf ' ' >&2 # to put a first char there to backspace the spinner over 
    while read -r line; do 
     if [[ $line =~ monitor ]]; then 
      printf '%s\n' "$line" 
     fi 
     update_spinner 
    done < <(airmon-ng start wlan0 2>/dev/null) 
} 

sp_ind=0 
sp_chars='/-\|' 
sp_num=${#sp_chars} 
update_spinner() { 
    printf '\b%s' "${sp_chars:sp_ind++%sp_num:1}" >&2 
} 

iface=$(get_monitor) 

か、あなたのバックグラウンドにしている可能性などの各ラインを私は想像pvソリューションよりも遅くなり関数を書くことができますが、あなたは後にスピナーを更新できるようになる、という失敗コマンドの一時ファイルへの書き込みなどをした後

airmon-ng start wlan2 2>/dev/null >/tmp/airmon_out & 
# your spinner stuff 
iface=$(cat /tmp/airmon_out) 

を答えを得るか、おそらくあなたも、それ以上のように、多くのものがファイルを操作する方法を知っている変数にそれを必要としないでしょう

+0

うわー...私は少しスピナーを修正しましたが、そのアイデアは素晴らしいです。ワーキング。あなたは男だよ! – OscarAkaElvis

関連する問題