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

Why is my "at" command in terminal not functioning?

我正在尝试使用 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

我做错了什么?

你的命令:

echo "test" | at 20:48

告诉 at 不带参数执行命令 test。它是 shell 内置的 运行s,但失败了。尝试:

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读取标准输入,你可以用任何你喜欢的方式重定向标准输入,使用这里的文档,或者这里的字符串,或者来自文件,或者使用管道,仅列举四种机制.

$ 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 列出职位并查看 运行。

常规用法更像是:

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

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


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