stdout的问题

时间:2016-02-26 21:02:45

标签: bash pipe stdout monitor mode

我正在设计一个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用于管道并防止在屏幕上打印任何内容?

提前谢谢。

干杯。

2 个答案:

答案 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 `

注意:正如@ n​​silent22在评论和their answer中指出的那样, 2/dev/null2>&1的展示位置至关重要:它是{{1这可能会产生stderr输出,因此重定向必须应用于 it ,而不是iwconfig

通常,如果您想将重定向应用于整个 强>; e.g:

cut