2016-09-29 40 views
0

我很困惑我的shell如何讀取bash_profile。閱讀「bash_profile」正在做兩件相互矛盾的事情

根,我的〜/ .bash_profile文件看起來像這樣

# .bash_profile 

# Get the aliases and functions 
if [-f ~/.bashrc ]; then 
     .~/.bashrc 
fi 

PATH=$PATH:$HOME/bin:$HOME/sbin:$HOME/usr/sbin:$HOME/usr/bin:/usr/sbin 
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib 

export PATH=$PATH 
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH 
unset USERNAME 

沒有〜/ .profile文件。

在用戶調用MARUHAN,我的〜/ .bash_profile中看起來像這樣

# .bash_profile 

# Get the aliases and functions 
if [-f ~/.bashrc ]; then 
     .~/.bashrc 
fi 

PATH=$PATH:$HOME/bin:$HOME/sbin:$HOME/usr/sbin:$HOME/usr/bin:/usr/sbin 
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/maruhan/Desktop/issac:/usr/local/lib 
ASDF=$ASDF:/home 

export PATH=$PATH 
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH 
export ASDF=$ASDF 
unset USERNAME 

我的〜/ .profile文件看起來像這樣

LD_LIBRARY_PATH=/home/maruhan/Desktop/issac:/usr/local/lib:$LD_LIBRARY_PATH 
ASDF=/home:$ASDF 
export ASDF=$ASDF 
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH 

你可以清楚地看到,ASDF沒有定義在root的bash_profile中。

但是,當我打電話給export,我得到這根。

declare -x ASDF=":/home" 

但沒有關於LD_LIBRARY_PATH。

奇怪的是,在maruhan中,運行導出會同時顯示ASDF和LD_LIBRARY_PATH。

此外,在/ etc/environment中還沒有關於ASDF或LD_LIBRARY_PATH的內容。我也沒有/ etc/bash_profile文件。

運行echo $0給我bash爲根和maruhan。

在ASDF存在的情況下,LD_LIBRARY_PATH如何在根中消失?

+0

* root *用戶如何啓動'bash'?和* maruhan *? – pynexj

+0

@whjm可以幫助我如何檢查? – CuriousKimchi

+0

'export PATH LD_LIBRARY_PATH ASDF'就足夠了;你不需要「重新分配」這些值。 'export'標記名稱,而不是值。 – chepner

回答

1

規則有點複雜。據bash的手冊頁:

INVOCATION

一個登錄shell是其第一個字符,參數零的是-,或一個 開始與--login選項。

一種交互式shell是一個啓動時沒有非選項參數(除非-s是 指定)和沒有-c選項,其標準輸入和錯誤都 連接到端子(如通過isatty(3)確定的),或者啓動與-i 選項。 PS1已設置,$-包括i如果bash是交互式的,允許shell 腳本或啓動文件測試此狀態。
......
當bash是作爲交互的登錄shell,或者作爲非交互 外殼與--login選項,它首先讀取並 文件/etc/profile執行命令,如果該文件存在。讀取該文件後,按順序查找 ~/.bash_profile,~/.bash_login~/.profile,並且讀取和 執行的第一個的命令,該命令存在且可讀。當shell開始禁止這種行爲時,可以使用--noprofile 選項。
......
當不是登錄shell啓動的交互的shell是,Bash讀取和 從~/.bashrc執行命令,如果該文件存在。這可能會被 使用--norc選項禁止。 --rcfile文件選項將強制bash讀取, 執行來自文件的命令而不是~/.bashrc
......

注意,在某些系統上的bash可以定製,以便它也將執行一個系統級的rc文件(如/etc/bash.bashrc)採購~/.bashrc交互的shell這不是一個前登錄shell

殼通過登錄機制(通常是用用戶名/密碼提示,如控制檯登錄,telnetssh,...)通常是登陸shell啓動。對於登錄shell,$0通常是-bash

[local] % ssh [email protected] <-- The user is trying to login 
Password: [email protected] 
[remote] % echo $0 
-bash     <-- This is a login shell 
[remote] % bash   <-- This is not a login (no username/password) 
[remote] % echo $0 
bash      <-- Not a login shell 
[remote] % 

爲了讓生活更輕鬆,我會把所有的事情的rc在~/.bashrc~/.bash_profile~/.bashrc。例如:

% cat ~/.bash_profile 
[[ -f ~/.bashrc ]] && source ~/.bashrc 
% cat ~/.bashrc 
# return immediately if not in an interactive shell 
[[ $- != *i* ]] && return 0 

export FOO=bar 
PATH=$PATH:/my/path 
% 
相關問題