工作中經常碰見環境變量加載問題,歸根結底就是配置文件的加載問題。
一般會有四種模式:交互式登陸、非交互式登陸、交互式非登陸、非交互非登陸。
交互式和非交互式對環境變量的加載:
+----------------+--------+-----------+---------------+
| | login |interactive|non-interactive|
| | |non-login |non-login |
+----------------+--------+-----------+---------------+
|/etc/profile | A | | |
+----------------+--------+-----------+---------------+
|/etc/bash.bashrc| | A | |
+----------------+--------+-----------+---------------+
|~/.bashrc | | B | |
+----------------+--------+-----------+---------------+
|~/.bash_profile | B1 | | |
+----------------+--------+-----------+---------------+
|~/.bash_login | B2 | | |
+----------------+--------+-----------+---------------+
|~/.profile | B3 | | |
+----------------+--------+-----------+---------------+
|BASH_ENV | | | A |
+----------------+--------+-----------+---------------+
bash的每種模式會讀取其所在列的內容,首先執行A,然后是B,C。而B1,B2和B3表示只會執行第一個存在的文件。
交互式登陸:簡單示例:
? ? ? a.用戶直接登陸到機器獲得的第一個shell
? ? ? b.用戶使用? ssh user@remote 獲得的shell
非交互式登陸:
? ? ? bash -l? script.sh
交互式非登陸:
? ? ? 在已有的shell中運行bash,此時不需要登陸
非交互式非登陸:
? ? ? a. bash script.sh
? ? ? b. ssh user@remote command
?
為了更好的理清這幾種模式,下面我們對一些典型的啟動方式各屬于什么模式進行一個總結:
- 登陸機器后的第一個shell:login + interactive
- 新啟動一個shell進程,如運行
bash
:non-login + interactive - 執行腳本,如
bash script.sh
:non-login + non-interactive - 運行頭部有如
#!/usr/bin/env bash
的可執行文件,如./executable
:non-login + non-interactive - 通過ssh登陸到遠程主機:login + interactive
- 遠程執行腳本,如
ssh user@remote script.sh
:non-login + non-interactive - 遠程執行腳本,同時請求控制臺,如
ssh user@remote -t 'echo $PWD'
:non-login + interactive - 在圖形化界面中打開terminal:??Linux: non-login + interactive? 、Mac OS X上: login + interactive
?
參考鏈接:http://feihu.me/blog/2014/env-problem-when-ssh-executing-command-on-remote/