龙之介大人

bash和shell的入门中
7.1 命令别名与历史命令7.1.1 命令别名设定: alias,unalias命令别名是一个很有趣的东西,特别是...
扫描右侧二维码阅读全文
17
2019/08

bash和shell的入门中

7.1 命令别名与历史命令

7.1.1 命令别名设定: alias,unalias

命令别名是一个很有趣的东西,特别是你的惯用指令特别长的时候!还有, 增设默认的选项在一些惯用的指令上面,可以预防一些不小心误杀文件的情况发生的时候!

举个例子来说,如果你要查询 隐藏档,并且需要长的列出与一页一页翻看,那么需要下达『 ls -al | more 』这个指令,要输入好几个单字!那可不可以使用 lm 来简化呢?当然可以,你可以在命令行下面下达:

[root@study ~]# alias lm='ls -al | more'

[root@study ~]# type lm
lm 是 `ls -al | more' 的别名
立刻多出了一个可以执行的指令喔!这个指令名称为 lm ,且其实他是执行 ls -al | more .

不过, 要注意的是:『alias的定义规则与变量定义规则几乎相同』,所以你只要在 alias 后 面加上你的 {『别名』='指令 选项...' },以后你只要输入lm就相当于输入了 ls -al|more 这一串指令!

另外,命令别名的设定还可以取代既有的指令喔!举例来说,我们知道 root 可以移除 (rm) 任何数 据!所以当你以 root 的身份在进行工作时,需要特别小心,但是总有失手的时候,那么 rm 提供了一个选项来让我们确认是否要移除该文件,那就是 -i 这个选项!所以,你可以这样做:

[root@study ~]# alias rm='rm -i'
[root@study ~]# type rm
rm 是 `rm -i' 的别名
  • 如果要取消命令别名的话,那么就使用 unalias 吧!例如要将刚刚的 lm 命令别名拿掉,就使用:
[root@study ~]# unalias lm
那么命令别名与变量有什么不同呢?命令别名是『新创一个新的指令, 你可以直接下达该指令』的,至于变量则需要使用类似『 echo 』指令才能够呼叫出变量的内容!

7.1.2 历史命令:history

[dmtsai@study ~]$ history [n] 
[dmtsai@study ~]$ history [-c] 
[dmtsai@study ~]$ history [-raw] histfiles
选项与参数:
n :数字,意思是『要列出最近的 n 笔命令行表』的意思!
-c :将目前的 shell 中的所有 history 内容全部消除
-a :将目前新增的 history 指令新增入 histfiles 中,若没有加 histfiles ,
则预设写入 ~/.bash_history
-r :将 histfiles 的内容读到目前这个 shell 的 history 记忆中; 
-w :将目前的 history 记忆内容写入 histfiles 中!

范例一:列出目前内存内的所有 history 记忆
[root@study ~]# history 
    1  cd 
    2  ls
    3  pwd
    4  yum install wget vim
    5  ls
    6  df -h
    ......
  353  type rm
  354  unalias lm
  355  history 
# 列出的信息当中,共分两栏,第一栏为该指令在这个 shell 当中的代码,
# 另一个则是指令本身的内容!至于会秀出几笔指令记录,则与 HISTSIZE 有关!

范例二:列出目前最近的 3 笔资料
[root@study ~]# history 3
  354  unalias lm
  355  history 
  356  history 3

范例三:立刻将目前的资料写入 histfile 当中
[root@study ~]# history -w
# 在默认的情况下,会将历史纪录写入 ~/.bash_history 当中!

[root@study ~]# echo ${HISTSIZE}
1000
在正常的情况下,历史命令的读取与记录是这样的:
  • 当我们以 bash 登入 Linux 主机之后,系统会主动的由家目录的 ~/.bash_history 读取以前曾经下过的指令, 那么 ~/.bash_history 会记录几笔数据呢?这就与你 bash 的 HISTFILESIZE 这个变量设定值有关了!
  • 假设我这次登入主机后,共下达过 100 次指令,『等我注销时, 系统就会将 101~1100 这总共 1000 笔历 史命令更新到 ~/.bash_history 当中。』 也就是说,历史命令在我注销时,会将最近的 HISTFILESIZE 笔记 录到我的纪录文件当中啦!
  • 当然,也可以用 history -w 强制立刻写入的!那为何用『更新』两个字呢? 因为 ~/.bash_history 记录的笔 数永远都是 HISTFILESIZE 那么多,旧的讯息会被主动的拿掉! 仅保留最新的!
那么 history 这个历史命令只可以让我查询命令而已吗?
我们可以利用相关的 功能来帮我们执行命令呢!举例来说:
[dmtsai@study ~]$ !number 
[dmtsai@study ~]$ !command 
[dmtsai@study ~]$ !! 
选项与参数:
number :执行第几笔指令的意思;
command :由最近的指令向前搜寻『指令串开头为 command』的那个指令,并执行; 
!! :就是执行上一个指令(相当于按↑按键后,按 Enter)

[dmtsai@study ~]$ history
66  man rm
67 alias
68  man history
69 history
[dmtsai@study ~]$ !66 <==执行第 66 笔指令
[dmtsai@study ~]$ !! <==执行上一个指令,本例中亦即 !66
[dmtsai@study ~]$ !al <==执行最近以 al 为开头的指令(上头列出的第 67 个)
经过上面的介绍,历史命令用法可多了!如果我想要执行上一个指令,除了使用上下键之外, 我可以直接以『 !! 』 来下达上个指令的内容,

此外, 我也可以直接选择下达第 n 个指令,『 !n 』 来执行,也可以使用指令标头,例如 『 !vi 』来执行最近指令开头是 vi 的指令列.

7.1.3 同一账号同时多次登入的 history 写入问题

有些朋友在练习 linux 的时候喜欢同时开好几个 bash 接口,这些 bash 的身份都是 root 。 这样会 有 ~/.bash_history 的写入问题吗?想一想,因为这些 bash 在同时以 root 的身份登入, 因此所有的 bash 都有自己的 1000 笔记录在内存中。因为等到注销时才会更新记录文件,所以,最后注 销的那个 bash 才会是最后写入的数据.
  • 无法记录时间
历史命令还有一个问题,那就是无法记录指令下达的时间。由于这 1000 笔历史命令是依序记录的, 但是并没有记录时间,所以在查询方面会有一些不方便。如果读者们有兴趣,其实可以透过 ~/.bash_logout 来进行 history 的记录,并加上 date 来增加时间参数,也是一个可以应用的方向

7.2 Shell 的操作环境

是否记得我们登入主机的时候,屏幕上头会有一些说明文字,告知我们的 Linux 版本啊什么的, 还有,登入的时候我们还可以给予用户一些讯息或者欢迎文字呢。此外,我们习惯的环境变量、命令 别名等等的,是否可以登入就主动的帮我设定好? 这些都是需要注意的

7.2.1 路径与指令搜寻顺序

『相对路径与绝对路径』的关系, 在本章的前几小节也谈到了 alias 与 bash 的内建命令。

现在我们知道系统里面其实有不少的 ls 指令,或者是包括内建的 echo 指令,那么来想一想,如果一个指令 (例如 ls) 被下达时, 到底是哪一个 ls 被拿来运行?

  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 也可以查询的到.

[root@study ~]# alias echo='echo -n'
[root@study ~]# type -a echo
echo 是 `echo -n' 的别名
echo 是 shell 内嵌
echo 是 /usr/bin/echo
  • 先 alias 再 builtin 再由 $PATH 找到 /bin/echo

7.2.2 bash 的进站与欢迎讯息: /etc/issue, /etc/motd

  • bash 也有进站画面与欢迎讯息,那个字符串写在 /etc/issue 里面.
[root@study ~]# cat /etc/issue
\S
Kernel \r on an \m

里面默认有三行,较有趣的地方在于 r 与 m。 就 如同 $PS1 这变量一样,issue 这个文件的内容也是可以使用反斜杠作为变量取用!你可以 man issue 配合 man agetty 得到底下的结果:

  • issue 内的各代码意义
\d 本地端时间的日期;
\l 显示第几个终端机接口;
\m 显示硬件的等级 (i386/i486/i586/i686...); \n 显示主机的网络名称;
\O 显示 domain name;
\r 操作系统的版本 (相当于 uname -r)
\t 显示本地端时间的时间;
\S 操作系统的名称;
\v 操作系统的版本。
  • 例题

如果你在 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 成为如下模样即可:

\S (terminal:\l)
Date: \d \t
Kernel \r on an \m

除了 /etc/issue 之外还有个 /etc/issue.net !这个是提供给 telnet 这个远 程登录程序用的。当我们使用 telnet 连接到主机时,主机的登入画面就会显示 /etc/issue.net 而不是 /etc/issue !

至于如果您想要让使用者登入后取得一些讯息,例如您想要让大家都知道的讯息, 那么可以将讯息加入 /etc/motd 里面去!例如:当登入后,告诉登入者, 系统将会在某个固定时间进行维护工作,可以这样做 (一定要用 root 的身份才能修改!):

[root@study ~]# vim /etc/motd
Hello everyone,
Our server will be maintained at 2015/07/10 0:00 ~ 24:00. Please don't login server at that time. ^_^

那么当你的使用者(包括所有的一般账号与 root)登入主机后,就会显示这样的讯息出来:

Hello everyone,
Our server will be maintained at 2019/08/16 0:00 ~ 24:00. 
Please don't login server at that time. ^_^

那么当你的使用者(包括所有的一般账号与 root)登入主机后,就会显示这样的讯息出来:

Last login: Sat Aug 17 21:02:18 2019 from macbookpro.lan
Hello everyone,
Our server will be maintained at 2019/08/16 0:00 ~ 24:00. 
Please don't login server at that time. ^_^

7.3 bash 的环境配置文件

你是否会觉得奇怪,怎么我们什么动作都没有进行,但是一进入 bash 就取得一堆有用的变量了? 这 是因为系统有一些环境配置文件案的存在,让 bash 在启动时直接读取这些配置文件,以规划好 bash 的操作环境啦! 而这些配置文件又可以分为全体系统的配置文件以及用户个人偏好配置文件。要注 意的是, 我们前几个小节谈到的命令别名啦、自定义的变数啦,在你注销 bash 后就会失效,所以 你想要保留你的设定, 就得要将这些设定写入配置文件才行.

7.3.1 login 与 non-login shell

在开始介绍 bash 的配置文件前,我们一定要先知道的就是 login shell 与 non-login shell! 重点在于 有没有登入 (login).

  • login shell:取得 bash 时需要完整的登入流程的,就称为 login shell。举例来说,你要由 tty1 ~ tty6 登入, 需要输入用户的账号与密码,此时取得的 bash 就称为『 login shell 』;
  • non-login shell:取得 bash 接口的方法不需要重复登入的举动,举例来说,(1)你以 X window 登入 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 这些个变量的设定!我们在前面的 locale 讨 论过这个文件!

  • /usr/share/bash-completion/completions/*

记得我们上头谈过 [tab] 的妙用吧?除了命令补齐、档名补齐之外,还可以进行指令的选项/参数 补齐功能!那就是从这个目录里面找到相对应的指令来处理的! 其实这个目录底下的内容是由 /etc/profile.d/bash_completion.sh 这个文件载入的!

反正你只要记得,bash 的 login shell 情况下所读取的整体环境配置文件其实只有 /etc/profile,但是 /etc/profile 还会呼叫出其他的配置文件,所以让我们的 bash 操作接口变的非常的友善!接下来, 让我们来瞧瞧,那么个人偏好的配置文件又是怎么回事?

~/.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 转换过来的使用者的习惯而已。

  • 先让我们来看一下 xiaoqi 的 /home/dmtsai/.bash_profile 的内容是怎样呢?
# .bash_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then     <==底下这三行在判断并读取 ~/.bashrc
        . ~/.bashrc
fi

# User specific environment and startup programs

PATH=$PATH:$HOME/.local/bin:$HOME/bin    <==底下这几行在处理个人化设定

export PATH

这个文件内有设定 PATH 这个变量喔!而且还使用了 export 将 PATH 变成环境变量呢! 由于 PATH 在 /etc/profile 当中已经设定过,所以在这里就以累加的方式增加用户家目录下的 ~/bin/ 为额 外的执行文件放置目录。这也就是说,你可以将自己建立的执行档放置到你自己家目录下的 ~/bin/ 目 录啦! 那就可以直接执行该执行档而不需要使用绝对/相对路径来执行该文件。

这个文件的内容比较有趣的地方在于 if ... then ... 那一段!那一段程序代码我们会在下一章 shell script 谈到,假设你现在是看不懂的。 该段的内容指的是『判断家目录下的 ~/.bashrc 存在否,若存 在则读入 ~/.bashrc 的设定』。bash 配置文件的读入方式比较有趣,主要是透过一个指令『 source 』 来读取的! 也就是说 ~/.bash_profile 其实会再呼叫 ~/.bashrc 的设定内容喔!最后,我们来看看整 个 login shell 的读取流程:

实线的的方向是主线流程,虚线的方向则是被呼叫的配置文件!从上面我们也可以清楚的知道,在 CentOS 的 login shell 环境下,最终被读取的配置文件是『 ~/.bashrc 』这个文件喔!所以,你当然 可以将自己的偏好设定写入该文件即可。 底下我们还要讨论一下 source 与 ~/.bashrc.

7.3.2 source :读入环境配置文件的指令

由于 /etc/profile 与 ~/.bash_profile 都是在取得 login shell 的时候才会读取的配置文件,所以, 如 果你将自己的偏好设定写入上述的文件后,通常都是得注销再登入后,该设定才会生效。那么,能不 能直接读取配置文件而不注销登入呢? 可以的!那就得要利用 source 这个指令了!

[xiaoqi@study ~]$ source  配置文件档名


范例:将家目录的 ~/.bashrc 的设定读入目前的 bash 环境中
[xiaoqi@study ~]$ source ~/.bashrc     <==底下这两个指令是一样的!
[xiaoqi@study ~]$ . ~/.bashrc 

利用 source 或小数点 (.) 都可以将配置文件的内容读进来目前的 shell 环境中! 举例来说,我修改 了 ~/.bashrc ,那么不需要注销,立即以 source ~/.bashrc 就可以将刚刚最新设定的内容读进来目前 的环境中!很不错吧!还有,包括 ~/bash_profile 以及 /etc/profile 的设定中, 很多时候也都是利用 到这个 source (或小数点) 的功能

7.3.3 ~/.bashrc (non-login shell 会读)

谈完了 login shell 后,那么 non-login shell 这种非登入情况取得 bash 操作接口的环境配置文件又是 什么? 当你取得 non-login shell 时,该 bash 配置文件仅会读取 ~/.bashrc 而已.

  • 那么预设的 ~/.bashrc 内容是如何?
[xiaoqi@study ~]$ cat ~/.bashrc 
# .bashrc

# Source global definitions
if [ -f /etc/bashrc ]; then    <==整体的环境设定
        . /etc/bashrc
fi

# Uncomment the following line if you don't like systemctl's auto-paging feature:
# export SYSTEMD_PAGER=

# User specific aliases and functions
alias rm='rm -i' <==使用者的个人设定 
alias cp='cp -i'
alias mv='mv -i'

看一下,你会发现在 root 的 ~/.bashrc 中其实已经规范了 较为保险的命令别名了。 此外,咱们的 CentOS 7.x 还会主动的呼叫 /etc/bashrc 这个文件喔!为什 么需要呼叫 /etc/bashrc 呢? 因为 /etc/bashrc 帮我们的 bash 定义出底下的数据:

  • 依据不同的 UID 规范出 umask 的值;
  • 依据不同的 UID 规范出提示字符 (就是 PS1 变量);
  • 呼叫 /etc/profile.d/*.sh 的设定

要注意的是,这个 /etc/bashrc 是 CentOS 特有的 (其实是 Red Hat 系统特有的),其他不同的 distributions 可能会放置在不同的档名就是了。由于这个 ~/.bashrc 会呼叫 /etc/bashrc 及 /etc/profile.d/*.sh , 所以,万一你没有 ~/.bashrc (可能自己不小心将他删除了),那么你会发现你的 bash 提示字符可能会变成这个样子:

-bash-4.2$

不要太担心啦!这是正常的,因为你并没有呼叫 /etc/bashrc 来规范 PS1 变量啦!而且这样的情况也 不会影响你的 bash 使用。 如果你想要将命令提示字符捉回来,那么可以复制 /etc/skel/.bashrc 到你 的家目录,再修订一下你所想要的内容, 并使用 source 去呼叫 ~/.bashrc ,那你的命令提示字符就会回来了.

7.3.4 其他相关配置文件

事实上还有一些配置文件可能会影响到你的 bash 操作的,底下就来谈一谈:

  • /etc/man_db.conf
这个文件乍看之下好像跟 bash 没相关性,但是对于系统管理员来说,却也是很重要的一个文件! 这的文件的内容『规范了使用 man 的时候, man page 的路径到哪里去寻找!』所以说的简单一 点,这个文件规定了下达 man 的时候,该去哪里查看数据的路径设定!
那么什么时候要来修改这个文件呢?如果你是以 tarball 的方式来安装你的数据,那么你的 man page 可能会放置在 /usr/local/softpackage/man 里头,那个 softpackage 是你的套件名称, 这个时候你就得以手动的方式将该路径加到 /etc/man_db.conf 里头,否则使用 man 的时候就会找不到相 关的说明档!
  • ~/.bash_history
还记得我们在历史命令提到过这个文件吧?预设的情况下, 我们的历史命令就记录在这里啊!而 这个文件能够记录几笔数据,则与 HISTFILESIZE 这个变数有关啊。每次登入 bash 后,bash 会 先读取这个文件,将所有的历史指令读入内存, 因此,当我们登入 bash 后就可以查知上次使用 过哪些指令啰。至于更多的历史指令, 请自行回去参考!
  • ~/.bash_logout
这个文件则记录了『当我注销 bash 后,系统再帮我做完什么动作后才离开』的意思。 你可以去读取一下这个文件的内容,预设的情况下,注销时, bash 只是帮我们清掉屏幕的讯息而已。 不 过,你也可以将一些备份或者是其他你认为重要的工作写在这个文件中 (例如清空暂存盘), 那么 当你离开 Linux 的时候,就可以解决一些烦人的事情

7.4 终端机的环境设定:stty,set

事实上,目前我们使用的 Linux distributions 都帮我们作了最棒的使用者环境了, 所以大家可以不 用担心操作环境的问题。不过,在某些 Unix like 的机器中,还是可能需要动用一些手脚, 才能够 让我们的输入比较快乐~举例来说,利用 [backspace] 删除,要比利用 [Del] 按键来的顺手吧! 但 是某些 Unix 偏偏是以 [del] 来进行字符的删除啊!所以,这个时候就可以动动手脚~

那么如何查阅目前的一些按键内容呢?可以利用 stty (setting tty 终端机的意思) 呢! stty 也可以帮 助设定终端机的输入按键代表意义!

[xiaoqi@study ~]$ stty [-a]
选项与参数:
-a :将目前所有的 stty 参数列出来;

范例一:列出所有的按键与按键内容
[xiaoqi@study ~]$ stty -a
speed 38400 baud; rows 48; columns 155; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R;
werase = ^W; lnext = ^V; flush = ^O; min = 1; time = 0;
......

我们可以利用 stty -a 来列出目前环境中所有的按键列表,在上头的列表当中,需要注意的是特殊字 体那几个, 此外,如果出现 ^ 表示 [Ctrl] 那个按键的意思。举例来说, intr = ^C 表示利用 [ctrl] + c 来达成的。几个重要的代表意义是:

  • intr : 送出一个 interrupt (中断) 的讯号给目前正在 run 的程序 (就是终止啰!);
  • quit : 送出一个 quit 的讯号给目前正在 run 的程序;
  • erase : 向后删除字符,
  • kill : 删除在目前指令列上的所有文字;
  • eof : End of file 的意思,代表『结束输入』。
  • start : 在某个程序停止后,重新启动他的 output
  • stop : 停止目前屏幕的输出;
  • susp : 送出一个 terminal stop 的讯号给正在 run 的程序。

记不记得我们在第四章讲过几个 Linux 热键啊?没错! 就是这个 stty 设定值内的 intr([ctrl]+c) / eof([ctrl]+d) 啰~至于删除字符,就是 erase 那个设定值啦! 如果你想要用 [ctrl]+h 来进行字符的 删除,那么可以下达:

[xiaoqi@study ~]$ stty eraase ^h

那么从此之后,你的删除字符就得要使用 [ctrl]+h 啰,按下 [backspace] 则会出现 ^? 字样呢! 如 果想要回复利用 [backspace] ,就下达 stty erase ^? 即可啊! 至于更多的 stty 说明,记得参考一下 man stty 的内容.

  • 除了 stty 之外
其实我们的 bash 还有自己的一些终端机设定值呢!那就是利用 set 来设定的! 我 们之前提到一些变量时,可以利用 set 来显示,除此之外,其实 set 还可以帮我们设定整个指令输 出/输入的环境。 例如记录历史命令、显示错误内容等等。
[dmtsai@study ~]$ set [-uvCHhmBx]
选项与参数:
-u :预设不启用。若启用后,当使用未设定变量时,会显示错误讯息;
-v :预设不启用。若启用后,在讯息被输出前,会先显示讯息的原始内容;
-x :预设不启用。若启用后,在指令被执行前,会显示指令内容(前面有 ++ 符号) 
-h :预设启用。与历史命令有关;
-H :预设启用。与历史命令有关;
-m :预设启用。与工作管理有关;
-B :预设启用。与刮号 [] 的作用有关;
-C :预设不启用。若使用 > 等,则若文件存在时,该文件不会被覆盖。


范例一:显示目前所有的 set 设定值
[dmtsai@study ~]$ echo $-
himBH
# 那个 $- 变量内容就是 set 的所有设定啦! bash 预设是 himBH 喔!

[dmtsai@study ~]$ set -u
[dmtsai@study ~]$ echo $vbirding
-bash: vbirding: unbound variable
# 预设情况下,未设定/未宣告 的变量都会是『空的』,不过,若设定 -u 参数,
# 那么当使用未设定的变量时,就会有问题啦!很多的 shell 都预设启用 -u 参数。 
# 若要取消这个参数,输入 set +u 即可!

范例三:执行前,显示该指令内容。
[xiaoqi@study ~]$ set -x
++ printf '\033]0;%s@%s:%s\007' xiaoqi study '~'
[xiaoqi@study ~]$ echo ${HOME}
+ echo /home/xiaoqi
/home/xiaoqi
++ printf '\033]0;%s@%s:%s\007' xiaoqi study '~'
# 要输出的指令都会先被打印到屏幕上!前面会多出 + 的符号!

另外,其实我们还有其他的按键设定功能呢!就是在前一小节提到的 /etc/inputrc 这个文件里面设定。 还有例如 /etc/DIR_COLORS 与 /usr/share/terminfo/ 等,也都是与终端机有关的环境配置文件案呢! 不过,事实上,并不建议您修改 tty 的环境呢,这是因为 bash 的环境已经设定的很亲和了, 我 们不需要额外的设定或者修改,否则反而会产生一些困扰。不过,写在这里的数据, 只是希望大家能够清楚的知道我们的终端机是如何进行设定的.

  • bash 默认的组合键表
组合按键执行结果
Ctrl + C终止目前的命令
Ctrl + D输入结束 (EOF),例如邮件结束的时候;
Ctrl + M就是 Enter 啦!
Ctrl + S暂停屏幕的输出
Ctrl + Q恢复屏幕的输出
Ctrl + U在提示字符下,将整列命令删除
Ctrl + Z『暂停』目前的命令

7.5 通配符与特殊符号

  • 在 bash 的操作环境中还有一个非常有用的功能,那就是通配符 (wildcard) ! 我们利用 bash 处理 数据就更方便了!底下我们列出一些常用的通配符喔:
符号意义
*代表『 0 个到无穷多个』任意字符
?代表『一定有一个』任意字符
[]同样代表『一定有一个在括号内』的字符(非任意字符)。例如 [abcd] 代表『一定有一个字符, 可能是 a, b, c, d 这四个任何一个』
[-]若有减号在中括号内时,代表『在编码顺序内的所有字符』。例如 [0-9] 代表 0 到 9 之间的所有数字, 因为数字的语系编码是连续的!
1若中括号内的第一个字符为指数符号 (^) ,那表示『反向选择』,例如 2 代表 一定有一个字符,只 要是非 a, b, c 的其他字符就接受的意思。

除了通配符之外,bash 环境中的特殊符号有哪些呢?底下我们先汇整一下:

符号意义
#批注符号:这个最常被使用在 script 当中,视为说明!在后的数据均不执行
\跳脱符号:将『特殊字符或通配符』还原成一般字符
管线(pipe):分隔两个管线命令的界定(后两节介绍);
;连续指令下达分隔符:连续性命令的界定 (注意!与管线命令并不相同)
~用户的家目录
$取用变数前导符:亦即是变量之前需要加的变量取代值
&工作控制 (job control):将指令变成背景下工作
!逻辑运算意义上的『非』 not 的意思!
/目录符号:路径分隔的符号
>,>>数据流重导向:输出导向,分别是『取代』与『累加』
<,<<数据流重导向:输入导向 (这两个留待下节介绍)
''单引号,不具有变量置换的功能 ($ 变为纯文本)
""具有变量置换的功能! ($ 可保留相关功能)
``两个『 ` 』中间为可以先执行的指令,亦可使用 $( )
()在中间为子 shell 的起始与结束
{}在中间为命令区块的组合!
以上为 bash 环境中常见的特殊符号汇整!理论上,你的『文件名』尽量不要使用到上述的字符!

  1. abc
最后修改:2019 年 08 月 19 日 02 : 15 PM

发表评论