我对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中消失?
答案 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(通常使用用户名 / 密码提示,如控制台登录,telnet
,ssh
,.. 。)通常是登录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
%