当前位置: 首页 > 知识库问答 >
问题:

Bash命令替换stdout stderr重定向

谈渊
2023-03-14

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

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显示在“尝试…$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"

感谢任何帮助或建议。

共有2个答案

萧无尘
2023-03-14

第一条回显行稍后显示,因为它是第二条执行的回显行$(...) 将执行代码。请尝试以下操作:

#!/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以检测错误。

闻人越
2023-03-14

这就是如何将stderr重定向到/dev/null

command 2> /dev/null

例如

ls -l 2> /dev/null

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

 类似资料:
  • 问题内容: 我正在尝试运行一个SSH到远程主机上的bash脚本,并停止正在运行的单个docker容器。 但是,出现以下错误: 当我手动执行此操作(向计算机SSH,运行命令)时,一切都很好,但是当尝试通过脚本执行操作时,我得到了错误。我猜我的命令替换语法不正确,我已经搜索并尝试了各种引号等,但无济于事。 谁能指出我要去哪里了? 问题答案: 在启动您的Heredoc时,请使用(或-仅引用第一个字符将具

  • 命令替换将会重新分配一个命令使用命令替换的典型形式是使用后置引用(`...`). 后置引用形式的命令(就是被反引号括起来)将会产生命令行文本. 1 script_name=`basename $0` 2 echo "The name of this script is $script_name." 这样的话, 命令的输出可以被当成传递到另一个命令的参数, 或者保存到变量中, 甚至可以用

  • 行动时刻 - 使用命令替换 到目前为止,我们使用双引号来包含将被引用的变量。 Unlang还具有反引号字符串,允许命令替换。这些反引号内的字符串的计算方式类似于可以进行字符串扩展的双引号字符串。 让我们修改上一个练习,以显示操作中的命令替换: 1.编辑FreeRADIUS配置目录下的sites-available / default虚拟服务器,并在该部分顶部的post-auth部分中添加以下内容:

  • 基础常用命令 某个命令 --h,对这个命令进行解释 某个命令 --help,解释这个命令(更详细) man某个命令,文档式解释这个命令(更更详细)(执行该命令后,还可以按/+关键字进行查询结果的搜索) Ctrl + c,结束命令 TAB键,自动补全命令(按一次自动补全,连续按两次,提示所有以输入开头字母的所有命令) 键盘上下键,输入临近的历史命令 history,查看所有的历史命令 Ctrl +

  • 问题内容: 如果给定其他配置文件,则rebar不会自动重建文件。因此,我尝试在Makefile级别上执行此操作: 希望的意图很明显:当我使用需要特定配置文件的目标时,请检查上次是否使用了相同的文件;运行并记录我们现在使用的配置。 但这不起作用,并且文件会不断重新编译: 尽管config.tmp包含“ normal”: 我想念什么? 问题答案: 在定义变量时,您缺少用于实际调用外部程序的部分。

  • 它输出,这让我认为变量赋值不会扫过上一个错误代码,也不会产生新的错误代码。但当我尝试这个的时候: 它输出,显然这就是返回的内容,它重写返回的。 我想知道为什么会发生这种情况,变量赋值有什么特殊性,不同于其他正常命令吗?或者仅仅是因为被认为是一个命令,只有命令替换部分才有意义? --更新-- 谢谢大家,从答案和评论中,我得到了这样一个观点:“当您使用命令替换分配变量时,退出状态就是命令的状态。”(作