我已经编写了一个脚本,并且希望使用at命令安排它在特定时间运行。我还想使用一个参数,以便在脚本中传递我想要的时间,以便可以在特定时间执行它。
该脚本的名称为displaydir
,它具有以下参数和格式:
./displaydir dir1 09:00 AM
脚本:
#!/bin/bash
at $2 $3
ll $1
cp ./$1/ ./dir2
exit 0
答案 0 :(得分:1)
要每周运行一次,您应该像这样重写脚本:
#!/bin/bash
ll $1
cp ./$1/ ./dir2
exit 0
at
命令的位置不存在。
您需要使用命令cron
在crontab -e
中添加记录
0 18 * * 1 /path/to/displaydir argument
不确定使用at
运行命令时是否可以添加参数
此脚本的输出应重定向到某处,因为at
和cron
在后台运行并且不在终端/屏幕上打印信息
at
命令的格式为:
at -f /path/to/displaydir 6:00PM
这将在18:00h运行脚本/path/to/displaydir
答案 1 :(得分:0)
这里有几个问题。引起直接问题的一个原因是at
从其标准输入读取要运行的命令,而不是(通常)脚本。通常,将输入提供给脚本中的命令(作为其标准输入)的最简单方法是here-document,如下所示:
command <<EOF-MARKER
input
more input
EOF-MARKER
nextCommand
下一个问题是,要求cp
命令复制目录,但尚未传递-R
选项,因此它将拒绝执行任何操作。我认为您可能希望cp ./$1/* ./dir2
复制目录中的文件,而不是目录本身。
我不确定,但是如果ll
是别名,则它可能无法在at
作业中工作(因为别名通常在非交互式shell中被禁用)。我建议使用完整的命令(可能是ls -l
)。
接下来,作业的输出将通过电子邮件发送给您。或者至少,它将尝试通过电子邮件将其发送给您。它可能没有做任何有用的事情。如果您希望输出到可预测的位置,则应自己重定向。
最后,如果目录名$1
中包含任何有趣的字符,使用不带引号的目录将引起麻烦。 (我主要在macOS上工作,其中带空格的文件名非常普遍,因此我知道这个问题。)通常,处理此问题的最佳方法是将参数引用双引号,但在此处-文档单引号更可能起作用(除非名称本身可能包含单引号)。
因此,这是我获得的更正脚本的内容:
#!/bin/bash
at $2 $3 <<EOF
ls -l '$1'
cp ./'$1'/* ./dir2
exit 0
EOF