将标准输出重定向到bash中的文件时出现问题
我写了一个简短的bash脚本来更新一些twitter_电子书机器人。所涉及的命令生成大量输出,我想将其重定向到一个包含日期的文件。我试着使用顶部的aswer,但是绝大多数的输出仍然流向终端 我的bash脚本:将标准输出重定向到bash中的文件时出现问题,bash,file-io,Bash,File Io,我写了一个简短的bash脚本来更新一些twitter_电子书机器人。所涉及的命令生成大量输出,我想将其重定向到一个包含日期的文件。我试着使用顶部的aswer,但是绝大多数的输出仍然流向终端 我的bash脚本: #!/bin/bash arc() { ## $1 is account name $2 is log file ebooks archive $1 corpus/$1.json >> "$2" ebooks consume corpus/$1.json &g
#!/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(-)
有人能解释一下为什么这不能像预期的那样起作用吗?还需要做什么才能使其按预期工作?您可以在脚本开头执行以下操作,而不是重定向每个命令:
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
这会将原始的标准输出移动到FD 3,然后您可以执行以下操作:
echo "git adding" >&3
有些命令可能是写入到
/dev/tty
而不是stdout
,但这种情况不太可能发生(通常只在提示输入等情况下才会发生)。您可以在脚本开始时执行此操作,而不是重定向每个命令:
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
这会将原始的标准输出移动到FD 3,然后您可以执行以下操作:
echo "git adding" >&3
有些命令可能是写入到
/dev/tty
而不是stdout
,但这种情况不太可能发生(通常只在提示输入等情况下才会发生)。您可以在脚本开始时执行此操作,而不是重定向每个命令:
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
这会将原始的标准输出移动到FD 3,然后您可以执行以下操作:
echo "git adding" >&3
有些命令可能是写入到
/dev/tty
而不是stdout
,但这种情况不太可能发生(通常只在提示输入等情况下才会发生)。您可以在脚本开始时执行此操作,而不是重定向每个命令:
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
这会将原始的标准输出移动到FD 3,然后您可以执行以下操作:
echo "git adding" >&3
有些命令可能是写入到
/dev/tty
而不是stdout
,但这不太可能(这通常只用于提示输入之类的事情)。不需要-d@$(日期+%s)
;您只是告诉date
使用当前时间(默认值)。此外,您可能需要重定向标准错误和标准输出,具体取决于各种程序使用的内容以及您在日志中想要的内容。arc“$accountname”>>“$logfile”
比在函数中重定向两次要好。同样,在脚本的整个内容上重定向一次会更好。终端上显示的是什么输出而不是日志文件?@chepner我用&>
重定向了标准错误,效果非常好!如果你写了一个答案,我想把它标记为正确答案,-d@$(日期+%s)
是不必要的;您只是告诉date
使用当前时间(默认值)。此外,您可能需要重定向标准错误和标准输出,具体取决于各种程序使用的内容以及您在日志中想要的内容。arc“$accountname”>>“$logfile”
比在函数中重定向两次要好。同样,在脚本的整个内容上重定向一次会更好。终端上显示的是什么输出而不是日志文件?@chepner我用&>
重定向了标准错误,效果非常好!如果你写了一个答案,我想把它标记为正确答案,-d@$(日期+%s)
是不必要的;您只是告诉date
使用当前时间(默认值)。此外,您可能需要重定向标准错误和标准输出,具体取决于各种程序使用的内容以及您在日志中想要的内容。arc“$accountname”>>“$logfile”
比在函数中重定向两次要好。类似地,对脚本的全部内容进行一次重定向会更好。终端上显示的是什么输出而不是日志文件?@chepner我使用&>
重定向了标准错误,它就像一个cha