【问题标题】:Why does the "at" command always warn me that commands will be executed via sh?为什么“at”命令总是警告我命令将通过 sh 执行?
【发布时间】:2008-10-08 03:35:04
【问题描述】:

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

warning: commands will be executed using /bin/sh

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

【问题讨论】:

    标签: linux bash unix


    【解决方案1】:

    对于我们这些不使用 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,就很容易犯这些错误,记住做正确的事情是您的责任。

    【讨论】:

    • /bin/sh 是 Bourne shell,而不是 Bash。
    • 见鬼,即使 /bin/bash 和 /bin/sh 行为不同,即使 /bin/sh 符号链接到 bash。
    • @John 好吧,它通常是 bash 的符号链接......(但不在 Ubuntu 上......所以是的,这很重要)
    • @Spudd86 - 是的,但是 bash 模拟 Bourne,它被称为 /bin/sh,所以即使 /bin/sh 只是一个符号链接,它的行为仍然与“正常”Bash 不同。
    • @Sherm 是的,但它仍然接受 POSIX /bin/sh 语法的超集,即使被称为 /bin/sh
    【解决方案2】:

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

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

    fprintf(stderr, "warning: commands will be executed using /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'
    }
    

    之后,它不会向您发出特定警告(而其他警告/错误消息仍会发送给您)

    【讨论】:

      【解决方案3】:

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

      现在,如果您不想看到它,可以使用 at [time] 2&gt;/dev/null 将其发送到遗忘,但不幸的是,at&gt; 提示由于某种原因被打印到 STDERR(一个错误,IMO - 他们真的应该去STDOUT),所以他们也被这个隐藏了。

      也许可以设计一些外壳管道,这样可以消除警告,而不会同时吃掉提示,但是

      1. 我的尝试 (at [time] 2&gt;&amp;1 | grep -v warning) 不起作用,并且
      2. 即使您能找到一个有效的组合,它也不适合混叠(因为时间在中间而不是在末尾),因此您每次都需要输入完整的使用它,或者在 at 周围编写一个包装脚本来处理它。

      因此,除非它引起实际问题,否则我会说您最好像我们其他人一样忽略警告。

      【讨论】:

      • 啊,关于 STDERR 而不是 STDOUT 的补充很好。我一直想知道为什么正常的重定向不起作用。它写给 STDERR 的副作用是它向管理员(在我的本地系统上是我)发送一封电子邮件,正如你所说,这不是有害的影响,但它很烦人 ;-)
      • stderr 实际上是正确的。 POSIX 指定将其用于所有“诊断”用途。状态,例如关于何时需要什么输入的信息,是诊断性的——这就是 shell 向它写入提示的原因,例如,这就是你 希望在 shell 管道中发生的情况,所以内容意味着人类阅读以了解执行期间发生的事情并不会被吸入管道中的下一个程序。
      【解决方案4】:

      如果您希望绕过该消息,请让“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.
      

      【讨论】:

      • 不,我的意思是,如何关闭警告消息?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-16
      • 2013-11-20
      • 2020-07-02
      • 2023-03-06
      • 1970-01-01
      • 2021-07-19
      • 1970-01-01
      相关资源
      最近更新 更多