我有多个vagrant配置(shell脚本),我想将所有命令输出重定向到文件,同时在stdout中保持echo
输出。
目前,我通过执行
重定向所有输出exec &>> provision.log
在每个条款的开头
哪个好用,但控制台是空的。所以我想将所有但 echo命令重定向到一个文件。
如果有可能将所有输出(包括回声)重定向到文件,并且只保留stdout中最好的回声。
结果应如下所示:
控制台
Starting provision "master"
Updating packages...
Installing MySQL...
ERROR! check provision.log for details
provision.log
Starting provision "master"
Updating packages...
...
(output from apt-get)
...
Installing MySQL...
...
(output from apt-get install mysql-server-5.5)
...
ERROR! check provision.log for details
我确实知道我可以将输出重定向附加到每个命令,但这很麻烦
答案 0 :(得分:2)
您可以采用这种方法复制stdout文件描述符并使用自定义echo
函数重定向来复制文件描述符。
#!/bin/bash
# open fd=3 redirecting to 1 (stdout)
exec 3>&1
# function echo to show echo output on terminal
echo() {
# call actual echo command and redirect output to fd=3 and log file
command echo "$@"
command echo "$@" >&3
}
# redirect stdout to a log file
exec >>logfile
printf "%s\n" "going to file"
date
echo "on stdout"
pwd
# close fd=3
exec 3>&-
答案 1 :(得分:0)
您可以仅重定向 stdout 并在终端上保留 stderr 。当然,您的脚本应该echo
到 stderr ,可能使用echo something > /dev/stderr
或echo something >&2
您还可以将echo-s重定向到/dev/tty
,只有在终端上启动脚本时才有意义(例如,不是at
或crontab
)