Shell,将所有输出重定向到文件但仍打印回显

时间:2017-02-27 10:28:43

标签: bash shell vagrant

我有多个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

我确实知道我可以将输出重定向附加到每个命令,但这很麻烦

2 个答案:

答案 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/stderrecho something >&2

您还可以将echo-s重定向到/dev/tty,只有在终端上启动脚本时才有意义(例如,不是atcrontab