3

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

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

换句话说,stderr 显示在 "Attempting... $2" 之前

这是我尝试使用的功能:

#!/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"

任何帮助或建议表示赞赏。

4

2 回答 2

2

这就是您将 stderr 重定向到的方式/dev/null

command 2> /dev/null

例如

ls -l 2> /dev/null

您的第二部分(即 的排序echo) - 这可能是因为您在调用脚本时遇到了这个问题。$(launchctl load -w /System/Library/LaunchDaemons/com.apple.auditd.plist)

于 2013-05-09T13:11:48.370 回答
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 来检测错误。

于 2013-05-09T13:22:14.170 回答