Ubuntu bash 脚本:shell 无缘无故地发生变化

Ubuntu bash 脚本:shell 无缘无故地发生变化

我在 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

相关内容