砰.来自后台管道命令的标准输出


我不知道

如何恢复在后台启动的命令"管道"的标准输出。让我们解释一下。我有这个命令:

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

我想将所有内容发送到后台以使用 $!! 恢复 pid,但是当我放置 & 任何地方时,grep 停止工作并且 iface var 为空。知道吗?谢谢。

如果您只想在等待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 '%sn' "$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)

或者,也许您甚至不再需要它在变量中,因为许多东西知道如何对文件进行操作

相关内容

  • 没有找到相关文章