首页 > 解决方案 > bash 脚本变量 - 在脚本中有效,但在 cron 中无效

问题描述

所以我有一个有效的命令字符串,称之为“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....

标签: bashshellvariablesscript

解决方案


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

细节

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

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

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

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


推荐阅读