阅读" bash_profile"正在做两件相互矛盾的事情

时间:2016-09-29 09:54:33

标签: bash shell terminal

我对shell如何阅读bash_profile非常困惑。

在root中,我的〜/ .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时,我会以root身份接听。

declare -x ASDF=":/home"

但没有关于LD_LIBRARY_PATH。

奇怪的是,在maruhan中,运行导出会同时显示ASDF和LD_LIBRARY_PATH。

此外,/ etc / environment中不存在ASDF或LD_LIBRARY_PATH。我也没有/ etc / bash_profile文件。

正在运行echo $0为我提供bash root和maruhan。

当ASDF存在时,LD_LIBRARY_PATH如何在root中消失?

1 个答案:

答案 0 :(得分:1)

规则有点复杂。根据bash的手册页:

  

参与

     

登录shell 是参数为零的第一个字符为-或一个   以--login选项开始。

     

交互式shell 是在没有非选项参数的情况下启动的(除非-s是。)   指定的)并且没有-c选项,其标准输入和错误都是   连接到终端(由isatty(3)确定),或者以-i开头的终端   选项。如果bash是交互式的,则PS1已设置且$-包含i,允许使用shell   用于测试此状态的脚本或启动文件   ...... ...   当bash作为交互式登录shell 调用时,或作为非交互式调用   shell使用--login选项,它首先从中读取并执行命令   文件/etc/profile,如果该文件存在。在阅读该文件后,它会查找   ~/.bash_profile~/.bash_login~/.profile按此顺序,并且读取和   执行来自存在且可读的第一个的命令。 --noprofile   启动shell时可以使用选项来禁止此行为。
  ...... ...   当启动不是登录shell的交互式shell 时,bash会读取和   如果该文件存在,则执行来自~/.bashrc的命令。这可能会受到抑制   使用--norc选项。 --rcfile文件选项将强制bash读取和   从文件而不是~/.bashrc执行命令   ......

请注意,在某些系统上,可以自定义bash,以便在为{em>交互式shell 获取/etc/bash.bashrc之前执行系统范围的rc文件(例如~/.bashrc) #39;不是登录shell

通过登录机制启动shell(通常使用用户名 / 密码提示,如控制台登录,telnetssh,.. 。)通常是登录shell。对于登录shell,$0通常为-bash

[local] % ssh user@host  <-- The user is trying to login
Password: P@ssw0rd
[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中的~/.bashrc来源 ~/.bash_profile中。例如:

% 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
%