我在 Ubuntu 12.04.1 LTS 上使用 shell 脚本时遇到了奇怪的行为。
我的脚本计划每小时启动一次(在 crontab 中)。它使用 /bin/bash,但有时会无缘无故地切换到 /bin/sh。
以下是我从脚本中记录的 env 命令的一些部分。
正确的是:
SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/opt/jdk/jdk1.6.0_35/bin
有时会出现的错误是:
SHELL=/bin/sh
PATH=/usr/bin:/bin
问题是我丢失了 PATH 变量,并且当我尝试运行命令时出现错误。
有什么提示吗?谢谢!
答案1
很难说为什么它有时有效,有时无效。所以这里有一些可能有用也可能没用的想法。
检查你的脚本是否以
#!/bin/bash
并确保脚本以正确的用户运行:这将使 bash 为该用户加载正确的环境。
如果您想确定,您也可以bash
在您的中明确运行crontab
,然后传递脚本并使用参数运行-c
。
如果这没有帮助并且您需要快速修复,您可以选择使用完整路径运行脚本中的命令,因此您PATH
根本不需要正确的命令。
旁注:这个问题更适合 Server Fault 或 Unix 和 Linux。
答案2
将其放在脚本的最开始处:
#!/bin/bash
if [ "$(readlink -f /proc/$$/exe)" != "/bin/bash" ] ; then
echo restarting script with bash... > &2
exec /bin/bash $0 "$@"
fi
答案3
该SHELL
变量是登录 shell,不一定是您当前正在运行的 shell。
造成差异的最可能的原因是,有时您从交互式 shell 运行,有时则不是(cron),在每种情况下运行的启动文件都不同。
当您在 cron 下运行时,它不是登录 shell,因此您的.profile
没有被运行 - 这是您的PATH
不同的最可能的原因。
在脚本的开头输入:
source ~/.profile
(或使用.
代替source
)