记录下今天在工作遇到的问题。
大致的问题是我以某种方式通过ssh登陆到服务器上执行一些指令,导致指令运行结果不符合预期。
导致问题的根本原因是bash的四种模式,bash在不同的模式下会加载不同的环境变量
1. interactive + login shell
交互式、登陆的shell。交互式指用户一条一条地向shell输入命令,shell输出执行结果。非交互式与之相反。
login shell指打开一个新的shell需要输入用户名和密码。non-login shell与之相反。
该模式下shell首先会加载/etc/profile全局环境变量,然后再按照顺序尝试加载 /.bash_profile、/.bash_login、~/.profile三个用户环境变量,如果有一个加载成功后面的就不再加载。
2. interactive + non-login shell
这种情况通常是,在interactive login shell下打开了一个新的shell。
该模式下shell加载 /bash/bashrc(/bash/bash.bashrc)、~/.bashrc
3. non-interactive + login shell
当使用bash执行shell脚本的时候就属于non-interactive。shell命令有一个参数[--login],如果bash使用[--login]参数执行shell脚本打开一个新的shell就属于这种情况。
该模式加载配置文件与 1 相同。
4. non-interactive + non-login shell
创建这种模式的shell,有两种常见的方法
-
ssh命令下有一个参数[command],可以通过[--help]查看到。
例如,ssh user@addr [command],就属于这种模式。 -
bash *.sh
该模式会通过BASH_ENV的值去寻找环境变量,BASH_ENV的值就是环境变量的文件名。可以通过设置BASH_ENV的值查找环境变量。
写在最后
参考[https://feihu.me/blog/2014/env-problem-when-ssh-executing-command-on-remote/#加载配置文件]