我在设计一个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没有无线扩展。
我能做些什么来使用标准的管道和防止在屏幕上打印任何东西?
提前谢谢你。
干杯。
发布于 2016-02-26 21:10:54
静默stderr的iwconfig命令(使用2> /dev/null重定向):
iwconfig $WIFI 2> /dev/null | cut -d ' ' -f 6发布于 2016-02-26 21:07:39
> /dev/null 在命令替换中不包括,因为它将阻止捕获变量mode中的任何内容。
如果您的意图是捕获标准输出和静默 stderr中的变量$mode
mode=`iwconfig "$WIFI" 2>/dev/null | cut -d ' ' -f 6 `如果您的意图是捕获,那么 stdout和stderr,正如您的解决方案尝试所建议的那样:
mode=`iwconfig "$WIFI" 2>&1 | cut -d ' ' -f 6 `注意:正如@nsilent22 22在评论和their answer中所指出的,或的placement在这里是至关重要的:是iwconfig可能产生stderr输出,因此必须将重定向应用于它,而不是cut。
通常,如果您希望将重定向应用于管道作为一个整体,则可以使用命令分组;例如:
mode=`{ iwconfig "$WIFI" | cut -d ' ' -f 6; } 2>/dev/null`https://stackoverflow.com/questions/35661694
复制相似问题