为什么“at”命令总是提醒我,命令将通过sh执行?

每次我使用“at”命令,我都会得到这样的信息:

warning: commands will be executed using /bin/sh 

有什么要警告我的? 更重要的是,我如何closures警告?

对于我们这些不使用bash作为shell的人来说,这是一个很好的警告,因为我们会忘记,当我们的代码运行时,我们的日常shell中的一个功能是不可用的在约定的时间。

 username@hostname$ at 23:00 warning: commands will be executed using /bin/sh at> rm **/*.pyc at> <EOT> job 1 at 2008-10-08 23:00 

使用'**'有完全有效的zsh,但不是/ sbin / sh! 如果您习惯使用不同的shell,那么很容易犯这些错误,您应该记住要做正确的事情。

警告除了恼人之外还有什么有害的影响吗? 手册页没有提及任何关闭它的方法,所以我不认为你可以阻止它从源头重建你的发射。

现在,如果你只是没有看到它,你可以在[时间] 2 / dev / null中使用它来遗忘,但不幸的是,出于某种原因, at>提示符被打印到STDERR(一个bug,国际海事组织 – 他们真的应该去STDOUT),所以他们也被这个隐藏。 可能有可能做一些壳管道,这将消除警告,而不是吃了提示,但是a)我在这个( 在[时间] 2&1 | grep -v警告 )的尝试是行不通的,b)甚至如果你能找到一个有效的组合,它将不适合走样(因为时间在中间而不是结束),所以你需要在每次使用它时或者完全键入它编写一个包装脚本来处理它。

所以,除非它引起实际的问题,否则我认为你可能是最好的,就像我们其他人一样忽略警告。

它提醒您,命令将由标准的Bourne Shell运行,这意味着您的命令语法必须与该shell兼容。 (“有趣”的事实:我只是注意到, 即使你当前的shell /bin/sh ,它也会发出警告,必须是一个bug。)

删除消息的“简单黑客”就是简单地删除输出的第一行。 这可以通过重新定义at命令以方便的方式完成:

 at() { /usr/bin/at $@ 2>&1 | tail -n +2; } 

您可以将其添加到包含其他shell别名( ~/.bashrc~/.zshrc或您的shell的等效项)的文件中。

注意:上面“hack”中的tail命令在写内联命令时也会去掉at> -prefix。 可能不是交易破坏者,但要注意的事情。

如果你想解决这个问题,可以运行一个脚本来调用指定的环境,比如ksh,bash,csh,zsh,perl等等。

此外 – 请参阅“at”手册页http://www.rt.com/man/at.1.html获取更多信息&#x3002;

 at and batch read commands from standard input or a specified file which are to be executed at a later time, using /bin/sh.