我编写了一个 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"
这将运行date
并uptime
通过管道将两者的输出写入当前用户主目录中的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.sh
into /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