考虑以下脚本:
#!/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
的方式运行。
修改后的脚本:
#!/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
下的行为可能有所不同。
修改后的脚本应该可以解决您的问题。