我不知道如何恢复在后台运行的“管道”命令的标准输出。让我们来解释一下。我有这个命令:
iface=$(airmon-ng start wlan0 2> /dev/null | grep monitor)
我希望您能将所有内容发送到后台以使用 $! 恢复 pid,但是当我在任何地方放置 & 时,grep 停止工作并且 iface 变量为空。有什么想法吗?谢谢。
我不知道如何恢复在后台运行的“管道”命令的标准输出。让我们来解释一下。我有这个命令:
iface=$(airmon-ng start wlan0 2> /dev/null | grep monitor)
如果你只想知道脚本是否在等待 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)
或许你甚至不再需要将它存储在变量中,因为很多东西都知道如何操作文件
iface
会有什么值? - Eric Renoufpv
可以工作吗?iface=$(airmon-ng start wlan0 2> /dev/null | grep monitor | pv)
将会打印一个状态栏,并将stdout
存储在iface
中,就像你想要的那样。 - Eric Renouf