2

我想在运行 at 命令之前测试一个 at time 参数。用例是我想在不同的时间在不同的计算机上运行 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
4

2 回答 2

2

您可以尝试在 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以非零返回码退出。这允许您在 bash 下测试日期是否正确,至少就date接受它而言。

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

问题

事实证明,date它的时间格式比at. 正如 XuWang 所指出的,date接受18minutes为简写now + 18minutesat不接受:

$ date -d "18minutes"
Fri May 27 15:30:59 PDT 2016
$ echo true | at "18minutes"
syntax error. Last token seen: minutes
Garbled time
于 2016-05-11T05:45:11.433 回答
2

如果作业成功,您总是可以从队列中删除作业。这显然有一个竞争条件 - 万一命令在提交和删除之间从队列中执行,您将不必要地运行命令。true不过,在你不想的时候跑步的影响很小。

if success=$(at "$atarg" <<<true); then
    sed 's/^job \([1-9][0-9]*\) at .*/\1/' <<<"$success" | xargs atrm
    exit 0
else
    exit $?
fi
于 2016-05-11T05:50:21.940 回答