为什么这个 bash 脚本在作为 sudo 运行时不在控制台上打印 stdout?

问题描述 投票:0回答:1

考虑以下脚本:

#!/bin/bash

# Define a function to redirect both stdout and stderr
redirect_both_to() {
    local log_file=logfile.log
    exec > >(tee -a "$log_file") 2> >(tee -a "$log_file")
}


# Example functions
one() {
    echo "This is from one()"
    echo "Error message from one()"
}

two() {
    echo "This is from two()"
    echo "Error message from two()"
}

# Call the functions
function main(){
    redirect_both_to
    one
    two
}

main "$@"

当在没有

sudo
的情况下执行此脚本时,输出将显示在控制台上,并将其写入日志文件(如预期)。但是,如果我以 root 身份运行相同的脚本(即
sudo ./script.sh
),脚本将退出而不向控制台打印任何内容。但
stdout
stderr
都正确记录在日志文件中。最终,我希望脚本以
sudo
的方式运行。

bash stdout sudo stderr tee
1个回答
0
投票

修改后的脚本:

#!/bin/bash

# Writes to both console and log
log_output() {
    tee -a "logfile.log"
}

# Example functions with piping to log_output
one() {
    echo "This is from one()" | log_output
    echo "Error message from one()" >&2 | log_output
}

two() {
    echo "This is from two()" | log_output
    echo "Error message from two()" >&2 | log_output
}

# Main function
function main(){
    one
    two
}

main "$@" 2>&1 | log_output

您在

exec > >(tee -a "$log_file") 2> >(tee -a "$log_file")
函数中使用
redirect_both_to
的方式会为输出重定向创建一个新的子 shell,并且由于各种原因,这在
sudo
下的行为可能有所不同。

修改后的脚本应该可以解决您的问题。

© www.soinside.com 2019 - 2024. All rights reserved.