[Linux] shell 学习(二):bash配置文件的读取
给命令设置别名
当命令过长时,可以给命令设置一个别名,alias flag=command
用来设置别名,如:
# 用lg代替长命令
$ alias lg='ls | grep test'
如果想要查看所有的别名,就直接使用alias
:
aaa@qq.com:~$ alias
alias alert='notify-send --urgency=low -i "$([ $? = 0 ] && echo terminal || echo error)" "$(history|tail -n1|sed -e '\''s/^\s*[0-9]\+\s*//;s/[;&|]\s*alert$//'\'')"'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l='ls -CF'
alias la='ls -A'
alias lg='ls | grep test'
alias ll='ls -alF'
alias ls='ls --color=auto'
aaa@qq.com:~$
取消别名时,使用unalias flag
命令:
$ unalias lg
bash的环境配置文件
在上面说到,可以通过alias
来设置命令的别名、自定义变量,然而,这些变量在注销bash后就会失效,如果想保留所有的设置,就需要将这些设置写入配置文件。一些bash默认的变量或别名,就是bash在启动时直接在配置文件中读取到而设置的。
在了解bash的配置文件读取之前,需要搞清楚两个概念:login shell 和 non_login shell.
login shell
在启动bash时需要完整的登录流程,如在tty1-tty6中登录,就是login shell。
non_login shell
取得bash时不需要完整登录流程,如使用图形界面 ctrl+alt+T打开终端,或者在原来bash中启动bash,都没有输入用户名密码,属于non_login shell.
可以通过命令 shopt login_shell
查看是哪种bash:
# 在终端下:
aaa@qq.com:/$ shopt login_shell
login_shell off
aaa@qq.com:/$
# 在tty1中:
aaa@qq.com:/$ shopt login_shell
login_shell on
aaa@qq.com:/$
这两种方式取得的bash,读取的配置文件并不相同。对于login shell来说,读取的配置文件主要有/etc/profile
和~/.profile
.
1.
/etc/profile
:shell全局配置文件,在这个文件中会读取/etc/bash.bashrc
、/etc/prfile.d/*.sh
。2.在读取完整体环境配置文件后,开始读取个人配置文件,个人配置文件有会在以下文件中读取一个,按照以下的优先级:
~/.bash_profile
>~/.bash_login
>~/.profile
,ubuntu中不存在前两个文件,因此会读取最后一个文件,在该文件中,读取了~/.bashrc
文件。可以通过vim来查看其内容:
~/.profile: executed by the command interpreter for login shells.
# This file is not read by bash(1), if ~/.bash_profile or ~/.bash_login
# exists.
# see /usr/share/doc/bash/examples/startup-files for examples.
# the files are located in the bash-doc package.
# the default umask is set in /etc/profile; for setting the umask
# for ssh logins, install and configure the libpam-umask package.
#umask 022
# if running bash
if [ -n "$BASH_VERSION" ]; then
# include .bashrc if it exists
if [ -f "$HOME/.bashrc" ]; then
. "$HOME/.bashrc"
fi
fi
# set PATH so it includes user's private bin directories
PATH="$HOME/bin:$HOME/.local/bin:$PATH"
- 3.
~/.bashrc
:最终读取的配置文件,一般在该文件中进行用户自定义的配置。
结合以上分析,对于login shell 读取配置文件的流程可以用如下图来表示:
对于non_login shell来说,则仅仅会读取~/.bashrc
文件,可以使用vim来查看该文件:
# ~/.bashrc: executed by bash(1) for non-login shells.
# see /usr/share/doc/bash/examples/startup-files (in the package bash-doc)
# for examples
# ......
因此,无论是login shell还是non login shell,都会读取~/.bashrc
.
除以上几个文件外,还有几个配置文件:
- 1.
~/.bash_history
:保存曾经使用过的命令,使用history
命令输出的就是该文件中保存的,其保存命令的个数可以在.bashrc
中配置:
# for setting history length see HISTSIZE and HISTFILESIZE in bash(1)
HISTSIZE=1000
- 2.
~/bash _logout
:记录注销bash后系统所做的工作,默认情况下仅仅清除了屏幕。
source的使用
在了解了bash的配置文件的读取流程之后,我们可以在配置文件中进行环境变量的配置、配置命令的别名等,比如在启动Android Studio时,每次都需要执行/android-studio/bin/studio.sh
,因此可以配置一个android studio的快捷启动方式,在~/.bashrc
中:
alias studio=/home/jiayongqiang/worksoftware/android-studio/bin/studio.sh
还有在配置jdk时,我们通常会采用如下形式进行配置:
# export命令表示将自定义变量转换为环境变量
export JAVA_HOME=/usr/local/java/jdk1.6.0_45
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH
但是它并不会立即生效,对于non_login shell 来说,重新开启一个bash即可生效;对于login shell来说,由于配置文件的读取都是在取得login shell 进行的,因此,当重新登录后,才会生效,如果不想重新登录,就可以使用source
命令了,如:
$ soruce ~/.bashrc
# 或者
$ . ~/.bashrc
source
命令将配置文件中的内容读入当前的shell环境中。
查看历史命令
在分析配置文件~/.bash_history
时说过,该文件中保存了执行过的命令,我们用vim查看下该文件:
ll
cd ..
rm -rf myfolder/
ll
cp -l test.txt/ haahhah
cd PythonWorkSpace/
ll
cp -l test
cp -l test hahha
ll
cp -s test sdfa
ll
rm -r sdfa hahha
ll
cp -s test test_link
ll
cp -l test test_h
ls -l
ll
mv test new_test
这些命令都是我之前执行过的,如果要将这个命令打印出来,并且可以选择再次执行某一条,就要用到history
命令了,该命令使用参数如下:
history [n]
history [-w]
n 表示显示最近的n个命令,不加则列出所有命令
-w 将执行的命令写入.bash_history中,默认情况下只有在关机的时候才会写入.bash_history中
如:
$ history 3
3223 vim .bash_hii
3224 history -w
3225 history 3
在执行histroy
时可以看到,前面标有数字,通过这个数字可以快速执行命令:
!n 执行第几个命令
!! 执行上一个命令
如:
# 执行history命令打印的第3225个命令
$ !3225
命令的查找顺序
当我们执行ls
时,会将该路径下的文件、文件夹、可执行文件以不同的颜色显示出来,那这个ls是如何找到的呢?通过whereis ls
命令可看到实际执行的是/bin/ls
:
aaa@qq.com:~$ whereis ls
ls: /bin/ls /usr/share/man/man1/ls.1.gz
aaa@qq.com:~$
因此,直接使用命令的相对路径、执行/bin/ls
也可以:
aaa@qq.com:~$ /bin/ls
catefile new_test PythonWorkSpace shellstudy test1 testbashrc test.txt
aaa@qq.com:~$
但却没有颜色显示,这是为何?这就需要了解下命令的查找路径了,通过type -a command
可以查看命令的查找路径,如查看ls
:
aaa@qq.com:~$ type -a ls
ls is aliased to `ls --color=auto'
ls is /bin/ls
aaa@qq.com:~$
所以直接使用ls
,执行的是alias中的别名。所以如果使用绝对路径来执行,且也显示颜色,可以使用如下命名:
$ /bin/ls --color=auto
从这个例子中可以看出,用户输入的命令可以同时存在于不同位置,如可以存在于alias
设置的别名中,也可以是shell 内置命令,或者是环境变量PATH中的命令,因此需要执行一个优先级来决定优先执行哪个,命令查找的顺序(或优先级)为:alias > builtin > $PATH
,也就是说,当用户在shell中输入一个命令时,首先会在alias
中查找是否是某一命令的别名,如果不存在,然后查找是否是shell 内置命令,最后才会在PATH
中找,如果都找不到,则提示command not found
,说明无此命令。
如果是以相对路径或绝对路径执行,则会直接执行。如上例中的/bin/ls
.
shell builtin表示bash内置的命令,如echo、history…
上一篇: JQ 设置属性 attr()
下一篇: Java代码实现时钟