命令时参数的测试语法
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
接受日期之前。
我没有找到任何文档表明 at
和 date
使用相同的代码来解释日期。所以,这种方法没有保证。
问题
事实证明,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
我想在 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
接受日期之前。
我没有找到任何文档表明 at
和 date
使用相同的代码来解释日期。所以,这种方法没有保证。
问题
事实证明,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