问题将标准输出重定向到bash中的文件

时间:2015-07-28 19:22:43

标签: bash file-io

我写了一个简短的bash脚本来更新一些twitter_ebooks机器人。涉及的命令产生大量输出,我想将其重定向到具有当天日期的文件。我尝试使用顶部的aswer来this question on ask ubuntu但是绝大多数的输出仍然到达终端。

我的bash脚本:

#!/bin/bash

arc() { ## $1 is account name $2 is log file
    ebooks archive $1 corpus/$1.json >> "$2"
    ebooks consume corpus/$1.json >> "$2"
}

accounts=(some twitter names)

echo "moving to ~/twitter/snare_ebooks"
cd ~/twitter/snare_ebooks

date_var=$(date -d @$(date +%s) +"%m_%d_%Y")
logfile=~/ebooks_archive_logs/$date_var.log
touch "${logfile}"
echo "model update log for $date_var" >> "${logfile}"

echo "archiving and consuming the corpus"

for accountName in ${accounts[*]}
do
    arc $accountName "${logfile}"
done

echo "git adding"
git add --all . >> "${logfile}"

echo "git committing"
git commit -m "model update" >> "${logfile}"

echo "pushing to heroku"
git push heroku master >> "${logfile}"

创建的日志文件仅包含:

model update log for 07_28_2015
[master 2eb0961] model update
 4 files changed, 134 insertions(+), 134 deletions(-)

有谁可以解释为什么这不能按预期工作?还需要做些什么才能使其按预期工作?

1 个答案:

答案 0 :(得分:3)

您可以在脚本的开头执行此操作,而不是重定向每个命令:

date_var=$(date -d @$(date +%s) +"%m_%d_%Y")
logfile=~/ebooks_archive_logs/$date_var.log
exec >"$logfile" 2>&1
没有命令的

exec只是重定向操作符只是更改脚本其余部分的I / O连接。 2>&1还会重定向标准错误。如果您看到输出,那些命令可能会将其写入stderr而不是stdout

如果您希望能够偶尔写入原始sdtdout,例如您的echo "git adding"行,则可以执行以下操作:

exec 3>&1 >"$logfile" 2>&1

这会将原始stdout移至FD 3,然后您可以执行以下操作:

echo "git adding" >&3

有些命令可能写入/dev/tty而不是stdout,但这不太可能(这通常只针对输入提示等)。