bash脚本中的sed输出可在CLI中使用,而cron中的输出则不同

时间:2018-12-12 01:03:11

标签: linux bash ubuntu sed cron

一个简单的脚本来列出我的Webinoly Ubuntu 18服务器上的站点,可以在CLI中运行,但在cron中失败。 Webinoly是一个站点管理脚本,并具有列出其管理的站点的命令:

site -list

CLI中此命令的输出如下:

 - catalyst.dk39ecbk3.com
 - siteexample3.com
 - webinoly.dk39ecbk3.com

我遇到问题的脚本(如下)应该删除控制字符,每行开头的“-”和使用sed的空白行:

#!/bin/bash

# create array of sites using webinoly 'site' command
# webinoly site -list command returns lines that start with hyphens and spaces, along with control chars, which need to be removed
# SED s/[\x01-\x1F\x7F]//g removes control characters
# SED s/.{7}// removes first seven chars and s/.{5}$// removes last 5 chars
# SED /^\s*$/d removes blank lines
# removing characters http://www.theunixschool.com/2014/08/sed-examples-remove-delete-chars-from-line-file.html
# removing empty lines https://stackoverflow.com/questions/16414410/delete-empty-lines-using-sed

SITELIST=($(/usr/bin/site -list | sed -r "s/[\x01-\x1F\x7F]//g;s/.{7}//;s/.{5}$//;/^\s*$/d"))

#print site list

for SITE in ${SITELIST[@]}; do
echo "$SITE"
done

这是所需的输出,我在CLI中看到:

root@server1 ~/scripts # ./gdrive-backup-test.sh
catalyst.dk39ecbk3.com
siteexample3.com
webinoly.dk39ecbk3.com

当脚本在cron中运行时会发生麻烦。这是cron文件:

root@server1 ~/scripts # crontab -l
SHELL=/bin/bash
MAILTO=myemail@gmail.com
15 3 * * 7 certbot renew --post-hook "service nginx restart"
47 01 * * * /root/scripts/gdrive-backup-test.sh > /root/scripts/output-gdrive-backup.txt

这是cron命令生成的output-gdrive-backup.txt文件:

root@server1 ~/scripts # cat output-gdrive-backup.txt
lyst.dk39ecbk3
example3
noly.dk39ecbk3

每行的前三个字符以及后四个(.com)都丢失了。

我已经研究并确保在cron文件以及脚本的开头强制使用bash。

2 个答案:

答案 0 :(得分:1)

使用以下输入:

$ cat site 
 - catalyst.dk39ecbk3.com

 - siteexample3.com

 - webinoly.dk39ecbk3.com

 - webinoly.dk39ecbk3.com

您可以使用以下sed命令到达您的输出:

$ cat site | sed -e "s/^\s*-\s*//g;/^\s*$/d"
catalyst.dk39ecbk3.com
siteexample3.com
webinoly.dk39ecbk3.com
webinoly.dk39ecbk3.com

用您要过滤输出的命令替换cat site

答案 1 :(得分:1)

结果是未能在我的cron文件中指定TERM。这就解决了我遇到的主要问题。这是一个奇怪的问题,很难研究和解决。

还有其他一些-其中之一是命令之一的路径不是cron使用的路径的一部分,而是包含在CLI的用户根目录中。有关TERM问题的更多信息,请参见"tput: No value for $TERM and no -T specified " error logged by CRON process