【问题标题】:bash script variable - works in script, but not in cronbash 脚本变量 - 在脚本中有效,但在 cron 中无效
【发布时间】:2021-03-10 13:15:34
【问题描述】:

所以我有一个有效的命令字符串,称之为“command_string”。如果我从命令行执行 command_string,它会正常工作,并返回我所期望的(IP 地址)。如果我在 shell 脚本中使用以下内容:

ShellStringVar=$(command_string)
echo "The value you want is $ShellStringVar"

效果很好,我得到类似“你想要的值是 192.168.1.1”

但如果我 CRON 脚本(以 root 身份运行)我会得到

The value you want is

我做错了什么?

Ubuntu 18.04LTS....

【问题讨论】:

  • “CRON shell 脚本”是指你让 cron 运行相同的外部 shell 脚本吗?与将脚本中的命令转换为由 cron 直接运行相反?无论哪种方式,细节都很重要。请出示minimal reproducible example
  • 另外,我认为 Cron 使用 /bin/sh 运行您的命令,默认情况下它在 Ubuntu 上是破折号,因此它可能无法按您预期的那样工作。通过运行“/bin/sh script.sh”来测试您的脚本,这应该更能代表 cron 将执行的操作。即使这样@MrR 的评论很重要,环境仍然会不一样。
  • @joanis /bin/sh 非常有启发性,并强调了脚本的其他几个小问题。但严格来说,cron 中的“/bin/sh scrptfile”解决了我的问题。因此,显然 /bin/sh 和 /bin/bash 在解释脚本的方式及其上下文方面存在显着但细微的差异。所以你解决了我眼前的问题(谢谢!!),但给了我一个家庭作业,以了解其中的差异以及将来如何避免它。
  • 由于 sh != bash 问题,我花了很多时间来解决问题!多年来,我们一直在 sh == bash 所在的系统上编写软件,然后尝试在 sh == dash 所在的较新的 Ubuntu 操作系统上运行该软件。我必须修复很多错误!所以现在我的 moto 是,“如果你的意思是 bash,就说 bash!”,它适用于 python 和 perl 中的系统调用,适用于 Makefiles 中的命令,显然也适用于 crontabs。

标签: bash shell variables script


【解决方案1】:

TL;DR /bin/sh 不是(总是)bash。

详情

您面临的问题是您的交互式 shell(可能)是 /bin/bash,而您的 crontab 命令是使用 /bin/sh 运行的。

根据没有系统强制执行的 POSIX 标准,/bin/sh 只需要识别符合 POSIX 的 Bourne shell 语法。

在许多 Linux 系统上,/bin/sh 实际上是指向/bin/bash 的符号链接,在这种情况下,许多 bash 扩展都可以在 crontab 中运行。然而,在最近的 Ubuntu 系统上,他们改用更精简的 /bin/dash shell,它更严格地遵守 Bourne shell 语法。

如果您想在脚本中使用 bash 语法,您应该使用/bin/bash 启动它。或者,清理您的脚本以严格遵守 Bourne 语法。通常,在 Python 和 Perl 系统调用、Makefile 命令和 crontab 中,这是一个很好的做法,以确保在使用 bash 扩展时明确要求 /bin/bash 作为 shell。我喜欢说“如果你是说 bash,就说 bash”!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-03
    • 1970-01-01
    • 2015-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-31
    相关资源
    最近更新 更多