我正在设计一个shell bash脚本。它有很多功能,其中之一是检测网卡是否处于监控模式。不确定是否有“专业”方法来做到这一点。我的基本方法有效,但有问题。是下一个功能:
function monitor() {
WIFI="wlan0" #hardcoded wlan0 for the example
mode=`iwconfig $WIFI|cut -d ' ' -f 6`
if [[ $mode == "Mode:Monitor" ]]; then
echo "Your interface $WIFI is in monitor mode already"
return
fi
#Here is the rest of the function... not relevant
}
问题是在屏幕上打印命令的标准输出,我不希望在屏幕上打印任何内容。所以我想到的第一个是将stdout重定向到/ dev / null这样做:
mode=`iwconfig $WIFI|cut -d ' ' -f 6 > /dev/null 2>&1`
但是,如果我这样做,它就会停止工作......我认为因为它需要stdout将一个命令传递给其他工作。
如果我选择已经监控的模式卡,一切正常。问题是如果网络接口不处于监控模式(例如eth0),则打印出:
eth0没有无线扩展。
如何将stdout用于管道并防止在屏幕上打印任何内容?
提前谢谢。
干杯。
答案 0 :(得分:2)
stderr
命令的沉默iwconfig
(使用2> /dev/null
重定向):
iwconfig $WIFI 2> /dev/null | cut -d ' ' -f 6
答案 1 :(得分:0)
请勿在命令替换中加入> /dev/null
,因为这会阻止在变量mode
中捕获任何。
如果您的意图是在变量$mode
中捕获stdout和沉默 stderr :
mode=`iwconfig "$WIFI" 2>/dev/null | cut -d ' ' -f 6 `
如果您的意图是捕获两者 stdout和stderr ,正如您的解决方案尝试所示:
mode=`iwconfig "$WIFI" 2>&1 | cut -d ' ' -f 6 `
注意:正如@ nsilent22在评论和their answer中指出的那样, 2/dev/null
或2>&1
的展示位置至关重要:它是{{1这可能会产生stderr输出,因此重定向必须应用于 it ,而不是iwconfig
。
通常,如果您想将重定向应用于整个 强>; e.g:
cut