2016-05-22 92 views
4

我不知道如何恢復在後臺啓動的「管道」命令的標準輸出。我們來解釋一下。我有這樣的命令:Bash。從後臺管道命令stdout

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

,我想所有發送到後臺來恢復使用$ pid的!但是當我把&任何地方,grep的停止工作和IFACE變種是空的。任何想法?謝謝。

+0

如果你把它放在後臺,你希望'iface'在命令完成之前有什麼價值? –

+0

當我執行'airmon-ng start wlan0'時,會產生很多行。那麼我只想grep只有一行,其中有文本「監視器」。這個例子是我需要的一個簡化例子。當然,然後是更復雜的,我用該行的正則表達式來獲取接口的確切名稱,但是不相關。這裏的問題是如何放入var行,同時在後臺執行所有操作以獲得帶有$!的pid。 。感謝您的關注! – OscarAkaElvis

+0

我想我會收集你正在做的事情,但是如果你試圖將輸出分配給一個變量,並且在將它存儲在'iface'之前,你並沒有等待輸出完成,那麼你可以設想使用'airmon-ng'完成前的'iface'。 'airmon-ng'結束之前,你會期望它有什麼價值?這是超級慢,所以你需要在後臺做到這一點? –

回答

0

如果你想先手狀態腳本仍在運行,同時從grep等待輸出,您可以使用現有的工具,像pv,將打印一個進度表,以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) 

,或者你可以有你的中背景命令寫入到一個臨時文件後得到的答案一樣

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

或許你甚至不會需要它的變量更多的是很多事情知道如何操作文件

+0

哇......我修改了一下微調,但這個想法真棒。加工。你搖滾哥們! – OscarAkaElvis