在说alias之前,先大致说一下shell的相关知识点。

Shell与bash

Shell是用户与Linux系统进行交互的媒介。

bash是目前Linux最常用的Shell。除了bash之外,还有例如 sh、csh、ksh、zsh等。

查看自己使用的是哪一个shell

1
2
3
echo $SHELL
# $0也可以
echo $0

查看系统安装了哪些shell

1
cat /etc/shells

切换shell

1
2
3
4
# 切换至bash
chsh -s /bin/bash
# 切换至zsh
chsh -s /bin/zsh

profile和rc文件的解释

***注意***:以下文件解释是以bash shell为准。

(1)/etc/profile:(系统环境变量) 此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行。并从/etc/profile.d目录的配置文件中搜集shell的设置。

(2) /etc/bashrc:(用户变量)为每一个运行bash shell的用户执行此文件。当bash shell被打开时,该文件被读取(即每次新开一个终端,都会执行bashrc)。

(3) ~/.bash_profile: 每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该文件仅仅执行一次。随后该文件会显式调用 .bashrc. 其内容主要为设置环境变量。

(4) ~/.bashrc:该文件包含专用于你的bash shell的bash信息,当登录时以及每次打开新的shell时,该该文件被读取。

(5) ~/.bash_logout:当每次退出系统(退出bash shell)时,执行该文件。另外,/etc/profile中设定的变量(全局)的可以作用于任何用户,而~/.bashrc等中设定的变量(局部)只能继承 /etc/profile中的变量,他们是"父子"关系。

理解交互式与登录

交互式shell等待你输入命令, 然后执行并返回结果。

非交互式shell则只是执行预设的命令, 比如读取脚本中的命令并执行, 执行到文件的末尾时shell即结束。


登录通常就是指输入了用户名或者密码后启动的shell(比如系统启动, 远程登录等), 或者用-l或者--login方式启动的shell。

非登录就是比如图形界面启动的终端, su切换的用户, 通过bash等命令的启动的shell。


二者启动的条件及顺序

bash的加载顺序如下:

  • 登录式SHELLL配置文件加载顺序:/etc/profile ⇒ ~/.bash_profile ⇒ ~/.bash_login ⇒ ~/.profile ⇒ ~/.bash_logout
  • 非登录式SHELL配置文件加载顺序:/etc/bash.bashrc(/etc/bashrc)⇒ ~/.bashrc

zsh的加载顺序如下(登录式和非登录时都是一样的):

  1. /etc/zshenv
  2. ~/.zshenv
  3. /etc/zprofile
  4. ~/.zprofile
  5. /etc/zshrc
  6. ~/.zshrc
  7. /etc/zlogin
  8. ~/.zlogin
  9. ~/.zlogout
  10. /etc/zlogout

Linux之souce命令

source命令(从 C Shell 而来)是bash shell的内置命令;点命令(.),就是个点符号(从Bourne Shell而来)是source的另一名称。

功能:使Shell读入指定的Shell程序文件并依次执行文件中的所有语句 source命令通常用于重新执行刚修改的初始化文件,使之立即生效,而不必注销并重新登录。


source filename、sh filename、./filename三者之间的区别

  1. source filename:这个命令其实只是简单地读取脚本里面的语句依次在当前shell里面执行,没有建立新的子shell。那么脚本里面所有新建、改变变量的语句都会保存在当前shell里面。
  2. sh filename 重新建立一个子shell,在子shell中执行脚本里面的语句,该子shell继承父shell的环境变量,但子shell新建的、改变的变量不会被带回父shell,除非使用export。
  3. 当shell脚本具有可执行权限时,用sh filename与./filename执行脚本是没有区别得。./filename是因为当前目录没有在PATH中,所有"."是用来表示当前目录的。

举例说明:

  1. 新建一个test.sh脚本,内容为:A=1
  2. 然后使其可执行chmod +x test.sh
  3. 运行sh test.sh后,echo $A,显示为空,因为A=1并未传回给当前shell
  4. 运行./test.sh后,也是一样的效果
  5. 运行source test.sh 或者 . ./test.sh,然后echo $A,则会显示1,说明A=1的变量在当前shell(当前终端)中

Shell之alias别名

语法:alias name=value

语法解释:其中name表示命令别名的名称,value表示命令别名的值。当用户输入name时,系统会自动将其转换为value。

语法注意点:

  • name不能有空格
  • =前后也不能有空格
  • value命令携带参数(或者携带空格时),需要使用单引号或双引号括起来
  • alias只生效于当前shell会话,要想每次一直生效,可以将其放到shell的startup文件中,例如zsh的~/.zshrc,或者bash的~/.bashrc中。

alias命令

  • alias :列出已定义的所有alias别名
  • alias name=value :设置别名
  • unalias name :取消别名(只对当前shell终端生效)