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

问题描述 投票:12回答:5

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

warning: commands will be executed using /bin/sh

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

linux bash unix
5个回答
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!如果你习惯使用不同的外壳,很容易犯这些错误,你有责任记住做正确的事情。


5
投票

除了烦人之外,警告是否有任何有害影响?手册页没有提及任何关闭它的方法,所以我认为你不能阻止它在不重建你的源头的情况下被发射。

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

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


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>前缀。可能不是一个交易破坏者,但需要注意的事情。


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.

0
投票

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

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

fprintf(stderr,“warning:命令将使用/ 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'
}

在此之后,它不会警告您有关该特定警告(同时其他警告/错误消息仍会传达给您)

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.