将标准输出重定向到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

我写了一个简短的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 >> "$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