Bash命令替换stdout + stderr重定向

时间:2013-05-09 13:09:39

标签: macos bash stderr command-substitution

美好的一天。我有一系列命令,我想通过一个函数执行,以便我可以获得退出代码并相应地执行控制台输出。话虽如此,我在这里有两个问题:

1)我似乎无法将stderr指向/ dev / null。

2)在执行$ 1之前,不会显示第一个回波线。直到我运行需要一段时间才能处理的命令,例如在硬盘驱动器中搜索文件,它才真正引人注目。此外,很明显是这种情况,因为输出看起来像:

sh-3.2# ./runScript.sh
sh-3.2# com.apple.auditd: Already loaded
sh-3.2# Attempting... Enable Security Auditing ...Success

换句话说,在“尝试...... $ 2”

之前显示了stderr

以下是我尝试使用的功能:

#!/bin/bash
function saveChange {
    echo -ne "Attempting... $2"
    exec $1
    if [ "$?" -ne 0 ]; then
        echo -ne " ...Failure\n\r"
    else
        echo -ne " ...Success\n\r"
    fi
}

saveChange "$(launchctl load -w /System/Library/LaunchDaemons/com.apple.auditd.plist)" "Enable Security Auditing"

感谢任何帮助或建议。

2 个答案:

答案 0 :(得分:2)

这是将stderr重定向到/dev/null

的方法
command 2> /dev/null

e.g。

ls -l 2> /dev/null

你的第二部分(即echo的排序) - 这可能是因为你在调用脚本时所拥有的。 $(launchctl load -w /System/Library/LaunchDaemons/com.apple.auditd.plist)

答案 1 :(得分:1)

第一个回波线稍后显示,因为它正在执行第二个。 $(...)将执行代码。请尝试以下方法:

#!/bin/bash
function saveChange {
    echo -ne "Attempting... $2"
    err=$($1 2>&1)
    if [ -z "$err" ]; then
        echo -ne " ...Success\n\r"
    else
        echo -ne " ...Failured\n\r"
        exit 1
    fi
}

saveChange "launchctl load -w /System/Library/LaunchDaemons/com.apple.auditd.plist" "Enable Security Auditing"

编辑:注意到launchctl实际上没有设置$?失败时捕获STDERR以检测错误。