bash 小记

本文内容来自man bash。

一. bash分类

bash从不同角度看分为两种,一种是是否登录(login),另一种是是否交互式(interactive)。

登录式shell是启动时:

1. 第0个参数以“-”开头

2. 或使用--login选项

交互式shell是启动时:

1. 没有非选项参数除非用使用了-s选项;

2. 并且没有-c选项;

3. 并且input/outptu与terminal相连;

4. 并且用-i选项


两种不同分法的shell有4种组合方式:

1. 交互登录式shell

2. 交互非登录式shell

3. 非交互登录式shell

4. 非交互非登录式shell


二. bash启动加载文件

1. 登录式shell,不管是不是交互的

(如果相应文件不存在就跳过)

/etc/profile
~/.bash_profile
~/.bash_login
~/.profile

退出时会执行:

~/.bash_logout

2. 交互非登录式shell

/etc/bash.bashrc
~/.bashrc

3. 非交互非登录模式

在执行脚本时,回去找BASH_ENV这个环境变量,并用这个环境变量的值作为脚本名执行


三. 总结:

我的系统是debian,查看相应文件可以看到

head -n1 ~/.profile
~/.profile: executed by the command interpreter for login shells.
head -n1 ~/.basrc
~/.bashrc: executed by bash(1) for non-login shells


一般来说,在~/.profile中会去source ~/.bashrc,也就是说我们平时配置环境是,直接在~/.bashrc中配置即可。


最后说一下如何检测当前shell是否为交互式的

 determine within a startup script whether or not Bash isrunning interactively,test the value of the ‘-’ special parameter.It containsi when the shell is interactive. For example:

case "$-" in
*i*)	echo This shell is interactive ;;
*)	echo This shell is not interactive ;;
esac


Alternatively, startup scripts may examine the variablePS1; it is unset in non-interactive shells, and set ininteractive shells. Thus:

if [ -z "$PS1" ]; then
        echo This shell is not interactive
else
        echo This shell is interactive
fi


参考:
http://www.gnu.org/software/bash/manual/html_node/Is-this-Shell-Interactive_003f.html#Is-this-Shell-Interactive_003f
http://www.gnu.org/software/bash/manual/html_node/Bash-Startup-Files.html
http://blogread.cn/it/article/6007?f=sa

你可能感兴趣的:(bash 小记)