我写了一个简短的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(-)
有谁可以解释为什么这不能按预期工作?还需要做些什么才能使其按预期工作?
答案 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
,但这不太可能(这通常只针对输入提示等)。