bash - 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....
解决方案
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/dash
shell,它更严格地遵守 Bourne shell 语法。
如果你想在你的脚本中使用 bash 语法,你应该使用/bin/bash
. 或者,清理您的脚本以严格遵守 Bourne 语法。通常,在 Python 和 Perl 系统调用、Makefile 命令和 crontabs 中,这是一个很好的做法,以确保/bin/bash
在使用 bash 扩展时明确要求作为 shell。我喜欢说“如果你的意思是 bash,就说 bash”!
推荐阅读
- bash - Bash grep 不同的输出
- c++ - 停止 QTextCursor::insertText() 修改 QTextDocument 滚动条范围
- elasticsearch - Geoip插件不适用于filebeat
- angular - 打字稿类继承
- javascript - TypeError:无法读取未定义的 jQuery/PnP 的属性“地图”
- javascript - Mapping a list of lat, long points to x, y in java: is there a cleaner way to do this?
- google-cloud-ml - 基于 TPU 的 CloudML 调优
- javascript - 为什么我只返回第一个数组元素?
- bash - 将 bash 列表传递到 applescript(使用 osascript)
- windows - 如何在 LabVIEW 中获取所有 Windows 服务?