[dmtsai@study ~]$ alias h='history'
在正常的情况下,历史命令的读取与记录是这样的:
当我们以 bash 登陆 Linux 主机之后,系统会主动的由主文件夹的 ~/.bash_history 读取以前曾经下过的指令,那么 ~/.bash_history 会记录几笔数据呢?这就与你 bash 的HISTFILESIZE 这个变量设置值有关了!
假设我这次登陆主机后,共下达过 100 次指令,“等我登出时, 系统就会将 101~1100 这总共 1000 笔历史命令更新到 ~/.bash_history 当中。” 也就是说,历史命令在我登出时,会将最近的 HISTFILESIZE 笔记录到我的纪录档当中。
当然,也可以用 history -w 强制立刻写入的!那为何用“更新”两个字呢? 因为~/.bash_history 记录的笔数永远都是 HISTFILESIZE 那么多,旧的讯息会被主动的拿掉! 仅保留最新的!
10.4 Bash Shell的操作环境:
10.4.1 路径与指令搜寻顺序
指令运行的顺序可以这样看:
1. 以相对/绝对路径执行指令,例如“ /bin/ls ”或“ ./ls ”;
2. 由 alias 找到该指令来执行;
3. 由 bash 内置的 (builtin) 指令来执行;
4. 通过 $PATH 这个变量的顺序搜寻到的第一个指令来执行。
举例来说,你可以下达 /bin/ls 及单纯的 ls 看看,会发现使用 ls 有颜色但是 /bin/ls 则没有颜色。 因为 /bin/ls 是直接取用该指令来下达,而 ls 会因为“ alias ls='ls --color=auto' ”这个命令别名而先使用! 如果想要了解指令搜寻的顺序,其实通过 type -a ls 也可以查询的到。
例题:设置 echo 的命令别名成为 echo -n ,然后再观察 echo 执行的顺序答:
先 alias 再 builtin 再由 $PATH 找到 /bin/echo。
10.4.2 bash 的进站与欢迎讯息: /etc/issue, /etc/motd
以CentOS 7.1 作为范例,里面默认有三行,较有趣的地方在于 \r 与\m。 就如同 $PS1 这变量一样,issue 这个文件的内容也是可以使用反斜线作为变量取用喔!你可以 man issue 配合 man agetty 得到下面的结果:
例题:如果你在 tty3 的进站画面看到如下显示,该如何设置才能得到如下画面?
> CentOS Linux 7 (Core) (terminal: tty3) > Date: 2015-07-08 17:29:19 > Kernel 3.10.0-229.el7.x86_64 on an x86_64 > Welcome!
注意,tty3 在不同的 tty 有不同显示,日期则是再按下 [enter] 后就会所有不同。答:很简单,用 root 的身份,并参考上述的反斜线功能去修改 /etc/issue 成为如下模样即可(共五行):
10.4.3 bash的环境配置文件
login 与 non-login shell
login shell:取得 bash 时需要完整的登陆流程的,就称为 login shell。举例来说,你要由tty1 ~ tty6 登陆,需要输入使用者的帐号与密码,此时取得的 bash 就称为“ login shell。
non-login shell:取得 bash 接口的方法不需要重复登陆的举动,举例来说,(1)你以 Xwindow 登陆 Linux 后, 再以 X 的图形化接口启动终端机,此时那个终端接口并没有需要再次的输入帐号与密码,那个 bash 的环境就称为 non-login shell了。(2)你在原本的 bash 环境下再次下达 bash 这个指令,同样的也没有输入帐号密码, 那第二个 bash(子程序) 也是 non-login shell 。
为什么要介绍 login, non-login shell 呢?这是因为这两个取得 bash 的情况中,读取的配置文件数据并不一样所致。 由于我们需要登陆系统,所以先谈谈 login shell 会读取哪些配置文件?一般来说,login shell 其实只会读取这两个配置文件:
1. /etc/profile:这是系统整体的设置,你最好不要修改这个文件;
2. ~/.bash_profile 或 ~/.bash_login 或 ~/.profile:属于使用者个人设置,你要改自己的数据,就写入这里!
/etc/profile (login shell 才会读)
你可以使用 vim 去阅读一下这个文件的内容。这个配置文件可以利用使用者的识别码(UID) 来决定很多重要的变量数据, 这也是每个使用者登陆取得 bash 时一定会读取的配置文件! 所以如果你想要帮所有使用者设置整体环境,那就是改这里。不过,没事还是不要随便改这个文件,这个文件设置的变量主要有:
PATH:会依据 UID 决定 PATH 变量要不要含有 sbin 的系统指令目录;
MAIL:依据帐号设置好使用者的 mailbox 到 /var/spool/mail/帐号名;
USER:根据使用者的帐号设置此一变量内容;
HOSTNAME:依据主机的 hostname 指令决定此一变量内容;
HISTSIZE:历史命令记录笔数。CentOS 7.x 设置为 1000 ;
umask:包括 root 默认为 022 而一般用户为 002 等!
/etc/profile 可不止会做这些事而已,他还会去调用外部的设置数据!在 CentOS 7.x 默认的情况下,下面这些数据会依序的被调用进来:
/etc/profile.d/*.sh
其实这是个目录内的众多文件!只要在 /etc/profile.d/ 这个目录内且扩展名为 .sh ,另外,使用者能够具有 r 的权限, 那么该文件就会被 /etc/profile 调用进来。在 CentOS 7.x 中,这个目录下面的文件规范了 bash 操作接口的颜色、 语系、ll 与 ls 指令的命令别名、vi 的命令别名、which 的命令别名等等。如果你需要帮所有使用者设置一些共享的命令别名时, 可以在这个目录下面自行创建扩展名为 .sh 的文件,并将所需要的数据写入即可。
/etc/locale.conf
这个文件是由 /etc/profile.d/lang.sh 调用进来的!这也是我们决定 bash 默认使用何种语系的重要配置文件! 文件里最重要的就是 LANG/LC_ALL 这些个变量的设置。
/usr/share/bash-completion/completions/*
目录下面的内容是由 /etc/profile.d/bash_completion.sh 这个文件载入的。
~/.bash_profile (login shell 才会读)
bash 在读完了整体环境设置的 /etc/profile 并借此调用其他配置文件后,接下来则是会读取使用者的个人配置文件。 在 login shell 的 bash 环境中,所读取的个人偏好配置文件其实主要有三个,依序分别是:
1. ~/.bash_profile
2. ~/.bash_login
3. ~/.profile
bash 的 login shell 设置只会读取上面三个文件的其中一个, 而读取的顺序则是依照上面的顺序。也就是说,如果 ~/.bash_profile 存在,那么其他两个文件不论有无存在,都不会被读取。 如果 ~/.bash_profile 不存在才会去读取 ~/.bash_login,而前两者都不存在才会读取~/.profile 的意思。 会有这么多的文件,其实是因应其他 shell 转换过来的使用者的习惯而已。 先让我们来看一下 dmtsai 的 /home/dmtsai/.bash_profile 的内容是怎样呢?
文件内有设置 PATH 这个变量。而且还使用了 export 将 PATH 变成环境变量。由于PATH 在 /etc/profile 当中已经设置过,所以在这里就以累加的方式增加使用者主文件夹下的~/bin/ 为额外的可执行文件放置目录。这也就是说,你可以将自己创建的可执行文件放置到你自己主文件夹下的 ~/bin/ 目录。那就可以直接执行该可执行文件而不需要使用绝对/相对路径来执行该文件。
其他相关配置文件
事实上还有一些配置文件可能会影响到你的 bash 操作的,下面就来谈一谈:
/etc/man_db.conf
如果你是以 tarball 的方式来安装你的数据,那么你的man page 可能会放置在 /usr/local/softpackage/man 里头,那个 softpackage 是你的套件名称, 这个时候你就得以手动的方式将该路径加到 /etc/man_db.conf 里头,否则使用 man 的时候就会找不到相关的说明文档。
~/.bash_history
默认历史命令就记录在这里。这个文件能够记录几笔数据,则与 HISTFILESIZE 这个变量有关,每次登陆 bash后,bash 会先读取这个文件,将所有的历史指令读入内存, 因此,当我们登陆 bash 后就可以查知上次使用过哪些指令。
~/.bash_logout
这个文件则记录了“当我登出 bash 后,系统再帮我做完什么动作后才离开”的意思。 你可以去读取一下这个文件的内容,默认的情况下,登出时, bash 只是帮我们清掉屏幕的讯息而已。不过,你也可以将一些备份或者是其他你认为重要的工作写在这个文件中 (例如清空暂存盘), 那么当你离开 Linux 的时候,就可以解决一些烦人的事情。