为什么“at”命令总是警告我命令将通过sh执行?

时间:2008-10-08 03:35:05

标签: linux bash unix

每次我使用“at”命令时,都会收到以下消息:

warning: commands will be executed using /bin/sh

它试图警告我什么?更重要的是,如何关闭警告?

5 个答案:

答案 0 :(得分:12)

对于我们这些不使用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!如果你习惯使用不同的外壳,很容易犯这些错误,你有责任记住做正确的事情。

答案 1 :(得分:5)

除了烦人之外,警告是否有任何有害影响?该手册页没有提及任何关闭它的方法,因此我认为如果不从源代码重建 ,就不能阻止它被发射。

现在,如果您不想看到它,可以在[时间] 2&gt; / dev / null 使用将其发送到遗忘状态,但不幸的是, at&gt; ; 提示由于某种原因打印到STDERR(一个错误,IMO - 他们真的应该去STDOUT),所以它们也被隐藏了。有可能处理一些shell管道,这将消除警告,而不会吃掉提示,但a)我的尝试( at [time] 2&gt;&amp; 1 | grep -v warning )不起作用b)即使你能找到一个有效的组合,它也不适合混叠(因为时间是在中间而不是在结尾),所以你需要输入它每次使用它时都要完整,或者在 周围写一个包装脚本来处理它。

所以,除非它引起实际问题,否则我说你最好不要像我们其他人那样忽略警告。

答案 2 :(得分:3)

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

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

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

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

注意:上面“hack”中的tail命令也会在编写内联命令时删除at> - 前缀。可能不是一个交易破坏者,但需要注意的事情。

答案 3 :(得分:2)

如果您希望绕过该消息,请'at'运行一个调用指定环境的脚本,无论是ksh,bash,csh,zsh,perl等。

添加 - 有关详细信息,请参阅“at”手册页http://www.rt.com/man/at.1.html

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

答案 4 :(得分:0)

at.c的源代码(来自Debian,版本为3.1.20-3)包含答案:

  

/ * POSIX.2允许由用户的SHELL环境指定的shell   变量,来自用户密码数据库条目的登录外壳,
  或/ bin / sh作为处理作业的命令解释器。
  它还允许打​​印警告诊断。因为
  可能的差异,我们总是输出诊断信息。 * /

     

fprintf(stderr,“警告:将使用/ bin / sh \ n”命令执行);

您可以使用Shell重定向解决它:

% echo "echo blah"  | at now+30min 2>&1 | fgrep -v 'warning: commands will be executed using /bin/sh'
job 628 at Fri Mar  8 23:25:00 2019

或者您甚至创建一个休闲功能(例如~/.zshrc~/.profile中的交互式shell):

at() {
  /usr/bin/at "$@" 2>&1 | fgrep -v 'warning: commands will be executed using /bin/sh'
}

在那之后,它不会以特定警告警告您(而其他警告/错误消息仍会到达您)