我需要帮助理解bash脚本。此bash脚本自动从特定文件夹结构中的文本文件生成cron作业行。
#!/bin/bash
LOGFILE="/home/test/logs/buildCron.log"
CTLOGFILE="/home/test/logs/cronOutput.log"
CURCRONTAB="/home/test/logs/cronTab.current"
CTARCHIVE="/home/test/logs/archive"
NEWCRONTAB="/home/test/logs/cronTab.proposed"
MYCRON="*/5 * * * * /home/test/scripts/buildCron.sh >> $LOGFILE 2>&1"
# Dump old and prepare new crontab files
umask 077
echo "`date`: Starting buildCron" | tee -a $LOGFILE
echo "$MYCRON" > $NEWCRONTAB
crontab -l > $CURCRONTAB
echo "`date`: Current (Active) Crontab dumped to: $CURCRONTAB" | tee -a $LOGFILE
# Append crontab-entries listed in cronjob.txt files to new crontab file
CRONS="`find /home/test/scheduled_scripts -type f -name cronjob.txt`"
for CRON in $CRONS
do
echo "`date`: Processing CronFile: $CRON"
DIRPARAMETER="`dirname $CRON`"
CRONENTRY="`cat $CRON` $DIRPARAMETER >> $CTLOGFILE 2>&1"
echo "$CRONENTRY" >> $NEWCRONTAB
done | tee -a $LOGFILE
Q1)
中的>> $LOGFILE 2>&1
是什么
MYCRON="*/5 * * * * /home/test/scripts/buildCron.sh >> $LOGFILE 2>&1"?
我认为第一部分>> $LOGFILE
意味着将输出写入变量$ LOGFILE中的文件路径。但是变量声明会产生输出吗?因为MYCRON=
是变量的声明吗?为什么有两个箭头而不是echo "$MYCRON" > $NEWCRONTAB
Q2) 在
echo "`date`: Starting buildCron"
单词日期周围的单个引号是什么?他们为什么只围绕这个词约会?是否可能意味着在那里执行一个名为date的命令?
Q3) 在
CRONENTRY="`cat $CRON` $DIRPARAMETER >> $CTLOGFILE 2>&1"
什么是
`cat $CRON`
在做什么?
我理解cat,将两个文件连接成一个,但是代码似乎只在命令cat之后只编写一个文件名。所以我不明白哪两个文件正在连接......这部分还在做什么? $DIRPARAMETER >> $CTLOGFILE 2>&1
数字2和& 1是什么?
Q4)
umask 077
做了什么?它是否为将在此.sh文件中生成的所有文件建立权限?如果我想在同一个shell脚本中生成具有不同权限的文件,该怎么办?
如果问题是婴儿的话,谢谢你。这是我读过的第一个bash脚本......
答案 0 :(得分:1)
A1:假设$LOGFILE
包含文件名,>> $LOGFILE 2>&
将命令的标准输出附加到该文件,再加上重定向标准错误到标准输出(即将其写入日志文件)。
A2:反引号(也可以写为$()
)正在执行给定的命令,并将反引号短语替换为命令的输出(在您的情况下,将当前日期放入{ {1}}行)。
A3:我会传递那个,我必须测试一下,我不会写出需要超过一分钟才能打字的答案。 ; - )
A4:这使得生成的所有文件都删除了所有“组”和“其他”权限,即仅保留使用的权限。这是脚本生成的文件的默认值;您始终可以通过echo
明确设置权限。
单个问题有点太多了。通过孤立地提问,你可能会更好。
答案 1 :(得分:1)
>>
附加到文件(而不是>会覆盖到文件)
2>& 1表示它写入所有输出,包括stdout和stderr。如果这没有任何意义,只需理解它就意味着写下所有输出
后面的滴答声是指运行命令并给我输出,在这种情况下是日期
反叛cat cron说要运行文件的输出。可以把它想象一下在文件内容上调用eval
用户的权限设置