Bash Shell 的操作环境:

是否记得我们登陆主机的时候,屏幕上头会有一些说明文字,告知我们的 Linux 版本啊什么的, 还有,登陆的时候我们还可以给予用户一些信息或者欢迎文字呢。此外, 我们习惯的环境变量、命令别名等等的,是否可以登陆就主动的帮我配置好? 这些都是需要注意的。另外,这些配置值又可以分为系统整体配置值与各人喜好配置值, 仅是一些文件放置的地点不同啦!这我们后面也会来谈一谈的!


路径与命令搜寻顺序

我们在第六章第七章都曾谈过『相对路径与绝对路径』的关系, 在本章的前几小节也谈到了 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=tty' 』这个命令别名而先使用! 如果想要了解命令搜寻的顺序,其实透过 type -a ls 也可以查询的到啦!上述的顺序最好先了解喔!

例题:

配置 echo 的命令别名成为 echo -n ,然后再观察 echo 运行的顺序

答:

[root@www ~]# alias echo='echo -n'
[root@www ~]# type -a echo
echo is aliased to `echo -n'
echo is a shell builtin
echo is /bin/echo

瞧!很清楚吧!先 alias 再 builtin 再由 $PATH 找到 /bin/echo 啰!


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

什么! bash 也有进站画面与欢迎信息喔?真假?真的啊! 还记得在终端机接口 (tty1 ~ tty6) 登陆的时候,会有几行提示的字符串吗?那就是进站画面啊! 那个字符串写在哪里啊?呵呵!在 /etc/issue 里面啊!先来看看:

[root@www ~]# cat /etc/issue
CentOS release 5.3 (Final)
Kernel \r on an \m

鸟哥是以完全未升级过的 CentOS 5.3 作为范例,里面默认有三行,较有趣的地方在于 \r 与 \m。 就如同 $PS1 这变量一样,issue 这个文件的内容也是可以使用反斜杠作为变量取用喔!你可以 man issue 配合 man mingetty 得到底下的结果:

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

做一下底下这个练习,看看能不能取得你要的进站画面?

例题:

如果你在 tty3 的进站画面看到如下显示,该如何配置才能得到如下画面?

CentOS release 5.3 (Final) (terminal: tty3)
Date: 2009-02-05 17:29:19
Kernel 2.6.18-128.el5 on an i686
Welcome!

注意,tty3 在不同的 tty 有不同显示,日期则是再按下 [enter] 后就会所有不同。

答:

很简单,参考上述的反斜杠功能去修改 /etc/issue 成为如下模样即可(共五行):

CentOS release 5.3 (Final) (terminal: \l)
Date: \d \t
Kernel \r on an \m
Welcome!

曾有鸟哥的学生在这个 /etc/issue 内修改数据,光是利用简单的英文字母作出属于他自己的进站画面, 画面里面有他的中文名字呢!非常厉害!也有学生做成类似很大一个『囧』在进站画面,都非常有趣!

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

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

[root@www ~]# vi /etc/motd
Hello everyone,
Our server will be maintained at 2009/02/28 0:00 ~ 24:00.
Please don't login server at that time. ^_^

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

Last login: Thu Feb  5 22:35:47 2009 from 127.0.0.1
Hello everyone,
Our server will be maintained at 2009/02/28 0:00 ~ 24:00.
Please don't login server at that time. ^_^

bash 的环境配置文件

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


  • 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 5.x 配置为 1000 ;

/etc/profile 可不止会做这些事而已,他还会去呼叫外部的配置数据喔!在 CentOS 5.x 默认的情况下, 底下这些数据会依序的被呼叫进来:

  • /etc/inputrc

    其实这个文件并没有被运行啦!/etc/profile 会主动的判断使用者有没有自定义输入的按键功能,如果没有的话, /etc/profile 就会决定配置『INPUTRC=/etc/inputrc』这个变量!此一文件内容为 bash 的热键啦、[tab]要不要有声音啦等等的数据! 因为鸟哥觉得 bash 默认的环境已经很棒了,所以不建议修改这个文件!

  • /etc/profile.d/*.sh

    其实这是个目录内的众多文件!只要在 /etc/profile.d/ 这个目录内且扩展名为 .sh ,另外,使用者能够具有 r 的权限, 那么该文件就会被 /etc/profile 呼叫进来。在 CentOS 5.x 中,这个目录底下的文件规范了 bash 操作接口的颜色、 语系、ll 与 ls 命令的命令别名、vi 的命令别名、which 的命令别名等等。如果你需要帮所有使用者配置一些共享的命令别名时, 可以在这个目录底下自行创建扩展名为 .sh 的文件,并将所需要的数据写入即可喔!

  • /etc/sysconfig/i18n

    这个文件是由 /etc/profile.d/lang.sh 呼叫进来的!这也是我们决定 bash 默认使用何种语系的重要配置文件! 文件里最重要的就是 LANG 这个变量的配置啦!我们在前面的 locale 讨论过这个文件啰! 自行回去瞧瞧先!

反正你只要记得,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 转换过来的使用者的习惯而已。 先让我们来看一下 root 的 /root/.bash_profile 的内容是怎样呢?

[root@www ~]# cat ~/.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/bin <==底下这几行在处理个人化配置
export PATH
unset USERNAME

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

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


图 4.3.1、login shell 的配置文件读取流程

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


  • source :读入环境配置文件的命令

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

[root@www ~]# source 配置文件档名

范例:将家目录的 ~/.bashrc 的配置读入目前的 bash 环境中
[root@www ~]# source ~/.bashrc <==底下这两个命令是一样的!
[root@www ~]# . ~/.bashrc

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

有没有可能会使用到不同环境配置文件的时候?有啊! 最常发生在一个人的工作环境分为多种情况的时候了!举个例子来说,在鸟哥的大型主机中, 常常需要负责两到三个不同的案子,每个案子所需要处理的环境变量订定并不相同, 那么鸟哥就将这两三个案子分别编写属于该案子的环境变量配置文件案,当需要该环境时,就直接『 source 变量文件 』,如此一来,环境变量的配置就变的更简便而灵活了!


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

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

[root@www ~]# cat ~/.bashrc
# .bashrc # User specific aliases and functions
alias rm='rm -i' <==使用者的个人配置
alias cp='cp -i'
alias mv='mv -i' # Source global definitions
if [ -f /etc/bashrc ]; then <==整体的环境配置
. /etc/bashrc
fi

特别注意一下,由于 root 的身份与一般使用者不同,鸟哥是以 root 的身份取得上述的数据, 如果是一般使用者的 ~/.bashrc 会有些许不同。看一下,你会发现在 root 的 ~/.bashrc 中其实已经规范了较为保险的命令别名了。 此外,咱们的 CentOS 5.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-3.2$ 

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


  • 其他相关配置文件

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

  • /etc/man.config

    这个文件乍看之下好像跟 bash 没相关性,但是对于系统管理员来说, 却也是很重要的一个文件!这的文件的内容『规范了使用 man 的时候, man page 的路径到哪里去寻找!』所以说的简单一点,这个文件规定了下达 man 的时候,该去哪里查看数据的路径配置!

    那么什么时候要来修改这个文件呢?如果你是以 tarball 的方式来安装你的数据,那么你的 man page 可能会放置在 /usr/local/softpackage/man 里头,那个 softpackage 是你的套件名称, 这个时候你就得以手动的方式将该路径加到 /etc/man.config 里头,否则使用 man 的时候就会找不到相关的说明档啰。

    事实上,这个文件内最重要的其实是 MANPATH 这个变量配置啦! 我们搜寻 man page 时,会依据 MANPATH 的路径去分别搜寻啊!另外,要注意的是, 这个文件在各大不同版本 Linux distributions 中,檔名都不太相同,例如 CentOS 用的是 /etc/man.config ,而 SuSE 用的则是 /etc/manpath.config , 可以利用 [tab] 按键来进行文件名的补齐啦!

  • ~/.bash_history

    还记得我们在历史命令提到过这个文件吧?默认的情况下, 我们的历史命令就记录在这里啊!而这个文件能够记录几笔数据,则与 HISTFILESIZE 这个变量有关啊。每次登陆 bash 后,bash 会先读取这个文件,将所有的历史命令读入内存, 因此,当我们登陆 bash 后就可以查知上次使用过哪些命令啰。至于更多的历史命令, 请自行回去参考喔!

  • ~/.bash_logout

    这个文件则记录了『当我注销 bash 后,系统再帮我做完什么动作后才离开』的意思。 你可以去读取一下这个文件的内容,默认的情况下,注销时, bash 只是帮我们清掉屏幕的信息而已。 不过,你也可以将一些备份或者是其他你认为重要的工作写在这个文件中 (例如清空缓存盘), 那么当你离开 Linux 的时候,就可以解决一些烦人的事情啰!


终端机的环境配置: stty, set

我们在第五章首次登陆 Linux 时就提过,可以在 tty1 ~ tty6 这六个文字接口的终端机 (terminal) 环境中登陆,登陆的时候我们可以取得一些字符配置的功能喔! 举例来说,我们可以利用退格键 (backspace,就是那个←符号的按键) 来删除命令行上的字符, 也可以使用 [ctrl]+c 来强制终止一个命令的运行,当输入错误时,就会有声音跑出来警告。这是怎么办到的呢? 很简单啊!因为登陆终端机的时候,会自动的取得一些终端机的输入环境的配置啊!

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

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

[root@www ~]# stty [-a]
选项与参数:
-a :将目前所有的 stty 参数列出来; 范例一:列出所有的按键与按键内容
[root@www ~]# stty -a
speed 38400 baud; rows 24; columns 80; 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 来达成的。几个重要的代表意义是:

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

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

[root@www ~]# stty erase ^h

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

除了 stty 之外,其实我们的 bash 还有自己的一些终端机配置值呢!那就是利用 set 来配置的! 我们之前提到一些变量时,可以利用 set 来显示,除此之外,其实 set 还可以帮我们配置整个命令输出/输入的环境。 例如记录历史命令、显示错误内容等等。

[root@www ~]# set [-uvCHhmBx]
选项与参数:
-u :默认不激活。若激活后,当使用未配置变量时,会显示错误信息;
-v :默认不激活。若激活后,在信息被输出前,会先显示信息的原始内容;
-x :默认不激活。若激活后,在命令被运行前,会显示命令内容(前面有 ++ 符号)
-h :默认激活。与历史命令有关;
-H :默认激活。与历史命令有关;
-m :默认激活。与工作管理有关;
-B :默认激活。与刮号 [] 的作用有关;
-C :默认不激活。若使用 > 等,则若文件存在时,该文件不会被覆盖。 范例一:显示目前所有的 set 配置值
[root@www ~]# echo $-
himBH
# 那个 $- 变量内容就是 set 的所有配置啦! bash 默认是 himBH 喔! 范例二:配置 "若使用未定义变量时,则显示错误信息"
[root@www ~]# set -u
[root@www ~]# echo $vbirding
-bash: vbirding: unbound variable
# 默认情况下,未配置/未宣告 的变量都会是『空的』,不过,若配置 -u 参数,
# 那么当使用未配置的变量时,就会有问题啦!很多的 shell 都默认激活 -u 参数。
# 若要取消这个参数,输入 set +u 即可! 范例三:运行前,显示该命令内容。
[root@www ~]# set -x
[root@www ~]# echo $HOME
+ echo /root
/root
++ echo -ne '\033]0;root@www:~'
# 看见否?要输出的命令都会先被打印到屏幕上喔!前面会多出 + 的符号!

另外,其实我们还有其他的按键配置功能呢!就是在前一小节提到的 /etc/inputrc 这个文件里面配置。

[root@www ~]# cat /etc/inputrc
# do not bell on tab-completion
#set bell-style none set meta-flag on
set input-meta on
set convert-meta off
set output-meta on
.....以下省略.....

还有例如 /etc/DIR_COLORS* 与 /etc/termcap 等,也都是与终端机有关的环境配置文件案呢! 不过,事实上,鸟哥并不建议您修改 tty 的环境呢,这是因为 bash 的环境已经配置的很亲和了, 我们不需要额外的配置或者修改,否则反而会产生一些困扰。不过,写在这里的数据, 只是希望大家能够清楚的知道我们的终端机是如何进行配置的喔! ^_^! 最后,我们将 bash 默认的组合键给他汇整如下:

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

通配符与特殊符号

在 bash 的操作环境中还有一个非常有用的功能,那就是通配符 (wildcard) ! 我们利用 bash 处理数据就更方便了!底下我们列出一些常用的通配符喔:

符号 意义
* 代表『 0 个到无穷多个』任意字符
? 代表『一定有一个』任意字符
[ ] 同样代表『一定有一个在括号内』的字符(非任意字符)。例如 [abcd] 代表『一定有一个字符, 可能是 a, b, c, d 这四个任何一个』
[ - ] 若有减号在中括号内时,代表『在编码顺序内的所有字符』。例如 [0-9] 代表 0 到 9 之间的所有数字,因为数字的语系编码是连续的!
[^ ] 若中括号内的第一个字符为指数符号 (^) ,那表示『反向选择』,例如 [^abc] 代表 一定有一个字符,只要是非 a, b, c 的其他字符就接受的意思。

接下来让我们利用通配符来玩些东西吧!首先,利用通配符配合 ls 找檔名看看:

[root@www ~]# LANG=C              <==由于与编码有关,先配置语系一下

范例一:找出 /etc/ 底下以 cron 为开头的档名
[root@www ~]# ll -d /etc/cron* <==加上 -d 是为了仅显示目录而已 范例二:找出 /etc/ 底下文件名『刚好是五个字母』的文件名
[root@www ~]# ll -d /etc/????? <==由于 ? 一定有一个,所以五个 ? 就对了 范例三:找出 /etc/ 底下文件名含有数字的文件名
[root@www ~]# ll -d /etc/*[0-9]* <==记得中括号左右两边均需 * 范例四:找出 /etc/ 底下,档名开头非为小写字母的文件名:
[root@www ~]# ll -d /etc/[^a-z]* <==注意中括号左边没有 * 范例五:将范例四找到的文件复制到 /tmp 中
[root@www ~]# cp -a /etc/[^a-z]* /tmp

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

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

以上为 bash 环境中常见的特殊符号汇整!理论上,你的『档名』尽量不要使用到上述的字符啦!


 
     

bash的操作环境[转]的更多相关文章

  1. 第十一章、认识与学习 BASH Bash Shell 的操作环境

    bash中的变量动不动就说环境变量,真是奇怪,bash只是一个c语言编写的程序而已,跟环境变量有什么关系?如果知道dos的历史的话就知道有个时代是只有命令行界面而没有图形用户界面,这只小小的程序就包揽 ...

  2. shell 编程 && bash 简介(shell 变量、shell操作环境、数据流重导向、管线命令、shell script)

    如何学习一门编程语言 数据类型 运算符 关键字 1 认识BASH 这个shell linux是操作系统核心,用户通过shell与核心进行沟通,达到我们想要的目的.硬件.核心.用户之间的关系: 原理:所 ...

  3. [Ruby on Rails系列]4、专题:Rails应用的国际化[i18n]

    1. 什么是internationalization(i18n)? 国际化,英文简称i18n,按照维基百科的定义:国际化是指在设计软件,将软件与特定语言及地区脱钩的过程.当软件被移植到不同的语言及地区 ...

  4. Git之(一)Git是什么[转]

    为什么使用Git 孔子曾经曰过的,名正则言顺 言顺则事成. 我们在学习一项新技术之前,弄清楚为什么要学它至关重要,至于为什么要学习Git,我用一段if-else语句告诉你原因: if(你相信我){ 我 ...

  5. 【纸模】六角大王 Super 5.6 CHS 简体中文版 U20080725+[手册]窗口与工具的概要(PDF格式)

    六角大王5.6简体中文版中文化:star21 主界面<ignore_js_op> 人体生成模式<ignore_js_op> 动画<ignore_js_op> < ...

  6. 理解及操作环境变量(基于Mac操作)

    通过本文,简单的了解下环境变量及其操作,与便于遇到相关问题时能够准确快捷的解决. 什么是环境变量 An environment variable is a dynamic-named value th ...

  7. Java基础 之软引用、弱引用、虚引用 ·[转载]

    Java基础 之软引用.弱引用.虚引用 ·[转载] 2011-11-24 14:43:41 Java基础 之软引用.弱引用.虚引用 浏览(509)|评论(1)   交流分类:Java|笔记分类: Ja ...

  8. [干货]2017已来,最全面试总结——这些Android面试题你一定需要

        地址.http://blog.csdn.net/xhmj12/article/details/54730883 相关阅读: 吊炸天!74款APP完整源码! [干货精品,值得收藏]超全的一线互联 ...

  9. Linux Bash文本操作之sed篇其二

    上一篇总结了sed的基础应用(Linux Bash文本操作之sed篇其一),内容实在有够多,这里再对稍微高级一些的用法做一个整理,以方便使用时查阅. 查看文本内容 示例1表示在第一到第四行匹配到的行后 ...

随机推荐

  1. c#入门笔记(1)数据类型

    1.c#有三种数据类型,分别是数值型,引用类型,指针类型. 2.数值类型 2.1整数类型:sbyte,byte,short,ushort ,int uint,long,ulong(u开头是无符号,范围 ...

  2. php总结 --- 4. 对象

    一. 恩聪 设计模式 因为php本身的问题,所以他能做的模式有限,就在这边列出了

  3. JSP 中EL表达式用法详解

    EL 全名为Expression Language EL 语法很简单,它最大的特点就是使用上很方便.接下来介绍EL主要的语法结构: ${sessionScope.user.sex} 所有EL都是以${ ...

  4. bootstrap selectpicker

    mark 一下使用 bootstrap selectpicker 遇到的一个小issue,作为下次查错使用 $('.selectpicker').selectpicker('val', 'Mustar ...

  5. pfile 与 spfile

    启动方式与顺序: 启动顺序:dbs 下的 init --> dbs 下的 spfile 如果 pfile 中没有指定 spfile 参数,那么数据库以 pfile 方式启动 如果 pfile 中 ...

  6. Web1.0、Web2.0、Web3.0的主要区别

    Web1.0:以静态.单向阅读为主,网站内信息可以直接和其他网站信息进行交互,能通过第三方信息平台同时对多家网站信息进行整合使用. Web2.0:以分享为特征的实时网络,用户在互联网上拥有自己的数据, ...

  7. session没有过期,其保存的数据无故丢失的原因

    问题: 我们经常会做到的一个功能,将登录用户信息保存到session中,在页面上显示登录用户名.但是,如果很短时间内甚至几秒没有刷新这个页面的话,这个用户名就消失了,其实就是session中保存的用户 ...

  8. 转摘: CSDN linxianliang5201314 的 blog ------sql解释执行顺序

    我们做软件开发的,大部分人都离不开跟数据库打交道,特别是erp开发的,跟数据库打交道更是频繁,存储过程动不动就是上千行,如果数据量大,人员流动 大,那么我么还能保证下一段时间系统还能流畅的运行吗?我么 ...

  9. Xcode6.1标准Framework静态库制作方法。工程转Framework,静态库加xib和图片。完美解决方案。

    http://www.cocoachina.com/bbs/read.php?tid-282490.html Xcode6.1标准Framework静态库制作方法.工程转Framework,静态库加x ...

  10. python3登录极路由并读取宽带帐号帐号密码.py

    python3登录极路由并读取宽带帐号帐号密码,fiddler抓包分析过程略... 步骤:1.登录路由,提取stok. 2.用stok拼成url,post请求 3.解析json数据 代码: " ...