命令时参数的测试语法

Test syntax of at command time argument

我想在 at 命令 运行之前测试时间参数。用例是我想在不同的时间在不同的计算机上运行 at命令,所以我想先存储at参数,这意味着我想在第一次输入时检查它。

示例在之前:

$ atarg1="now+7mintes"
# I would like to check the above *before* running this
$ at $atarg1 <<< "echo hi there"
syntax error. Last token seen: t
Garbled time

您可以尝试在 GNU date 上测试时间。请注意,这失败了:

$ atarg="now+7mintes"
$ date -d "$atarg" >/dev/null 2>&1 || echo "Bad time"
Bad time

成功时:

$ atarg="now+7minutes"
$ date -d "$atarg" >/dev/null 2>&1 || echo "Bad time"

换句话说,当 date -d 给出一个错误的参数时,date 以非零 return 代码退出。这允许您在 bash 下测试日期是否合适,至少在 date 接受日期之前。

我没有找到任何文档表明 atdate 使用相同的代码来解释日期。所以,这种方法没有保证。

问题

事实证明,date 的时间格式比 at 更灵活。正如 XuWang 指出的那样,date 接受 18minutes 作为 now + 18minutes 的 shorthand 但 at 不接受:

$ date -d "18minutes"
Fri May 27 15:30:59 PDT 2016
$ echo true | at "18minutes"
syntax error. Last token seen: minutes
Garbled time

如果成功,您可以随时从队列中删除作业。这显然有一个竞争条件——在不太可能的情况下,命令在提交和删除之间从队列中执行,你将 运行 一个不必要的命令。 运行 true 当你不想的时候影响很小。

if success=$(at "$atarg" <<<true); then
    sed 's/^job \([1-9][0-9]*\) at .*//' <<<"$success" | xargs atrm
    exit 0
else
    exit $?
fi