为什么 `at` 警告我命令将使用 /bin/sh 执行?如果我想要不同的外壳怎么办?

为什么 `at` 警告我命令将使用 /bin/sh 执行?如果我想要不同的外壳怎么办?

at我尝试在我的脚本中 使用它并打印:

警告:命令将使用 /bin/sh 执行

如果我愿意,我将如何使用不同的外壳?

答案1

在 Linux 下,at始终警告您它将使用 执行指定的命令/bin/sh,而不是您最喜欢的 shell。您无法隐藏此消息,它是硬编码在源代码中的。

您传递的命令由 解释/bin/sh。如果您愿意,此命令可以是脚本的路径;然后/bin/sh将执行脚本程序,导致脚本的解释器启动并解释脚本。脚本的语言完全独立于启动它的程序。因此,例如,如果您想执行 bash 脚本(即以 开头的脚本#!/bin/bash),只需将脚本的路径传递给at( echo /path/to/script | at 3:42) 并忽略不相关的消息。

答案2

您可以通过更改脚本从不同的 shell 运行它舍邦。一些典型的shebang台词:

#!/bin/sh — Execute the file using sh, the Bourne shell, or a compatible shell
#!/bin/csh -f — Execute the file using csh, the C shell,
#!/usr/bin/perl -T — Execute using Perl with the option for taint checks
#!/usr/bin/php — Execute the file using the PHP command line interpreter
#!/usr/bin/python -O — Execute using Python with optimizations to code
#!/usr/bin/ruby — Execute using Ruby

要在给定时间运行脚本,我建议您添加定时任务

例子:

以下行使用户程序 test.pl(表面上是一个 Perl 脚本)每两个小时运行一次,时间为午夜、凌晨 2 点、凌晨 4 点、上午 6 点、上午 8 点等:

0 */2 * * * /home/用户名/test.pl

答案3

一种选择是将命令本身作为发送到 bash 的脚本(作为不同 shell 的示例):

命令:

<<'EOD' at now
<<'BASH' /bin/bash -s -- test
echo "$BASH ::" "$@"
BASH
EOD

输出:

warning: commands will be executed using /bin/sh
job 148 at Sat Feb 13 00:24:00 2021

在(1)然后将使用/bin/sh内部命令执行:

<<'BASH' /bin/bash -s -- test
echo "$BASH ::" "$@"
BASH

哪个正在执行回声与 bash-shell 特定$BASH变量和一个位置参数一致测试/bin/bash作为不同 shell 的示例)。

就是这样。


要抑制硬编码错误消息,请在复杂命令前添加以下前缀:

2> >(sed '/warning: commands will be executed using \/bin\/sh/d' ) 

因为它将删除有关执行的警告/bin/sh,并且只会删除该警告而不会删除其他警告。

命令:

2> >(sed '/warning: commands will be executed using \/bin\/sh/d' ) \
<<'EOD' at now
<<'BASH' /bin/bash -s -- test
echo "$BASH ::" "$@"
BASH
EOD

输出:

job 150 at Sat Feb 13 00:26:00 2021

答案4

命令将使用/bin/sh即使你添加了#!/bin/bash到脚本。要使其使用 bash,您需要执行以下操作:

echo script.sh | at now+x minutes

在这种情况下,如果您包含了,则将使用 bash#!/bin/bash在脚本的顶部。

另请注意/bin/sh如果符号链接到/bin/bash例如,如果以这种方式调用,它的行为将不会与 bash 完全一样。因此,如果您的脚本使用 bash 特定功能,则以这种方式运行时会出现错误:

at -f script.sh now+x minutes

仅当您检查(本地)电子邮件时,这些错误才会显示。通常/var/邮件/用户名如果存在诸如 sendmail 之类的东西。如果无法发送电子邮件将丢弃输出和错误。

很容易错过,如果您手动测试脚本,它在使用运行时效果很好它可能有错误。因为在后一种情况下它将使用/bin/sh

相关内容