在远程机器上通过 `ssh` 执行命令时未加载环境变量

Environment variables not loaded when executing command via `ssh` on remote machine

我想编写一个脚本,在远程服务器上执行多个命令,其中包括执行一些应用程序。远程机器上的 .bashrc 文件定义了 PATH 变量,因此这些应用程序都在它下面。

但是当我尝试使用 ssh <host> <command> 时,似乎没有加载 .bashrcssh <host> 'echo $PATH' 只显示一些路径,例如 /usr/bin .

更让我困惑的是,连ssh <host> "source ~/.bashrc; <command>"都不行。 ssh <host> 'source ~/.bashrc; echo $PATH' 仍然只打印了几个路径。我通过 ssh <host> 'cat ~/.bashrc' 检查并确认该文件确实包含所有 PATH 定义,这在命令执行的环境中没有受到影响。

于是经过两个小时的排查,终于找到了问题所在。这是因为下面的命令在 .bashrc .

开头
# If not running interactively, don't do anything
case $- in
    *i*) ;;
      *) return;;
esac

这可以防止在 ssh <host> <command> 的环境中执行之后的任何操作。

如果您遇到类似问题,请尝试检查 .bashrc 文件的开头。