欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

[Linux] shell 学习(二):bash配置文件的读取

程序员文章站 2022-05-08 17:04:47
...

给命令设置别名

当命令过长时,可以给命令设置一个别名,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 读取配置文件的流程可以用如下图来表示:
[Linux] shell 学习(二):bash配置文件的读取

对于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…