Bash 脚本将脚本的输出记录到单独的日志文件中

Bash 脚本将脚本的输出记录到单独的日志文件中

我编写了一个 scipt(example.sh) 来在标准输出上回显日期和系统正常运行时间。同时我希望这个脚本将此输出记录到日志文件中。这是我的代码

echo `date`
echo `uptime`

最后

cat /home/rpeb/example.sh 1> /home/rpeb/example.log 

将输出重定向到日志文件中。

我不想记录最后一行。我应该对此代码进行哪些更改?

答案1

#!/bin/sh
{ date; uptime; } | tee "$HOME/example.log"

这将运行dateuptime通过管道将两者的输出写入当前用户主目录中的tee文件,example.log到脚本的标准输出。用于{ ...; }将一组命令组合成一个可以作为一个整体重定向的“复合命令”。

如果没有{ ...; },您将需要在脚本中执行两次重定向:

#!/bin/sh
date   | tee    "$HOME/example.log"
uptime | tee -a "$HOME/example.log"

请注意,第二次调用tee需要-a附加到日志文件的选项,否则它将截断日志文件,并且您将丢失命令的输出date


您通常不想echo仅用于输出命令替换的结果。命令替换(反引号命令或$(...))可能有助于将命令的输出插入到由其他命令使用的字符串中,但仅用于输出命令的结果不需要命令替换或echo(例如,您不需要echo $(ls)在命令行上执行此操作,也不需要在脚本中执行此操作)。

答案2

这有效:

echo `date`
echo `uptime`

但这样更好:

echo $(date)
echo $(uptime)

(阅读为什么这里


而且,在这种特殊情况下,您可能会满意:

date
uptime

这:

cat /home/rpeb/example.sh 1> /home/rpeb/example.log

将不会执行你的脚本。

cat /home/rpeb/example.sh只是打印内容/home/rpeb/example.sh

然后,您stdout将从该命令重定向到文件/home/rpeb/example.log.所以,你真正在这里做的是复制/home/rpeb/example.shinto /home/rpeb/example.log。看来这不是你想要的。

但如果你这样做的话,这更简洁:

cat /home/rpeb/example.sh > /home/rpeb/example.log

当你只使用 时>1它前面的内容就被暗示了。


如果您想运行脚本/home/rpeb/example.sh,然后将其输出重定向到文件/home/rpeb/example.log,首先,授予执行权限/home/rpeb/example.sh,如下所示:

chmod u+x /home/rpeb/example.sh

然后,运行脚本,只需编写其路径,然后重定向其输出,如下所示:

/home/rpeb/example.sh > /home/rpeb/example.log

而且,顺便说一句,如果两个文件(您的脚本和日志)位于同一个文件中dir,并且您在其中dir,则只需运行:

./example.sh > example.log

如果您希望将输出example.sh打印在终端上并登录到example.log,您可以这样做:

./example.sh | tee example.log

相关内容