我尝试使用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
我做错了什么?
答案 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
之间的所有内容。