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。