为什么我的" at"终端命令不起作用?

时间:2015-02-04 00:50:15

标签: macos bash command-line terminal

我尝试使用echo "haha" | at 20:30来让我的命令在几分钟后执行。

但命令永远不会执行:

$ date
Tue  3 Feb 2015 20:47:22 AST
$ echo "test" | at 20:48
job 5 at Tue Feb  3 20:48:00 2015
$ date
Tue  3 Feb 2015 20:48:05 AST

我做错了什么?

2 个答案:

答案 0 :(得分:4)

你的命令:

echo "test" | at 20:48

告诉at执行没有参数的命令test。它是一个内置的shell运行,但失败了。尝试:

test
echo $?

它为我产生1,表示失败。

你可能想过这样的事情:

echo "echo test" | at 20:48

现在你只需要知道输出的去向。 /dev/null是一个合理的猜测。所以,试试:

echo "echo test > /tmp/x39.214" | at 20:48

然后,当20:48(或您选择的新时间)来去匆匆时,请查找文件/tmp/x39.214以包含第test行。

at命令读取其标准输入以执行一系列命令。它们与您的环境一起运行,但没有连接终端(因此/dev/null是标准输入,输出,错误 - 或者,如果它不是,您将获得输出电子邮件)。因此,您的命令必须安排将输出存储在您可以找到的位置。像/tmp/x39.214这样的固定名称不是一个好主意,但您需要能够确定文件的去向以及名称。通常,名称将包括时间。

因为at读取标准输入,您可以按照自己喜欢的方式重定向标准输入,使用here doc或here字符串,或者从文件或管道重定向,仅列出四种机制。 / p>

$ echo "echo test >/tmp/x39.214" > file1.txt
$ at 20:48 < file1.txt
$ at 20:48 <<'EOF'
> echo test >/tmp/x39.214
> EOF
$ at 20:48 <<< 'echo test >/tmp/x39.214'
$ cat file1.txt | at 20:48
$

我已经为上面的每个命令省略了at的输出。

您可以使用at -l列出作业并查看将要运行的内容。

答案 1 :(得分:2)

传统用途更像是:

at 20:48 <<'EOF'
echo "test" >/tmp/hello_world
EOF

在预定时间过后检查/tmp/hello_world


在这种情况下,您发送到at命令的标准输入的内容是整个文档 - <<'EOF'和以下EOF之间的所有内容。