第22节-Bash Shell 的操作环境

来源:互联网 发布:java素数的判断 编辑:程序博客网 时间:2024/06/03 22:48

路径与命令搜寻顺序

    执行一个命令有4种运行方式:        1.以相对/绝对路径运行命令,例如『 /bin/ls 』或『 ./ls 』;        2.由 alias 找到该命令来运行;        3.由 bash 内建的 (builtin) 命令来运行;        4.透过 $PATH 这个变量的顺序搜寻到的第一个命令来运行。    例题:        配置 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

        终端机接口 (tty1 ~ tty6) 登陆进站画面设置            [root@node1 ~]# cat /etc/issue(本机登录画面)            \S            Kernel \r on an \m            [跟着上面这句添加要显示的内容]            [root@node1 ~]# cat /etc/issue.net(远程登录画面)            \S            Kernel \r on an \m            [跟着上面这句添加要显示的内容]            issue 内的各代码意义                \d 本地端时间的日期;                \l 显示第几个终端机接口;                \m 显示硬件的等级 (i386/i486/i586/i686...);                \n 显示主机的网络名称;                \o 显示 domain name;                \r 操作系统的版本 (相当于 uname -r)                \t 显示本地端时间的时间;                \s 操作系统的名称;                \v 操作系统的版本。

bash 的环境配置文件

    login 与 non-login shell        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 shell 其实只会读取这两个配置文件:        1./etc/profile:这是系统整体的配置,你最好不要修改这个文件;        2.~/.bash_profile 或 ~/.bash_login 或 ~/.profile:属于使用者个人配置,你要改自己的数据,就写入这里!

/etc/profile (login shell 才会读)

这是每个使用者登陆取得 bash 时一定会读取的配置文件!    这个文件配置的变量主要有:        PATH:会依据 UID 决定 PATH 变量要不要含有 sbin 的系统命令目录;        MAIL:依据账号配置好使用者的 mailbox 到 /var/spool/mail/账号名;        USER:根据用户的账号配置此一变量内容;        HOSTNAME:依据主机的 hostname 命令决定此一变量内容;        HISTSIZE:历史命令记录笔数。CentOS 5.x 配置为 1000 ;    /etc/profile 可不止会做这些事而已,他还会去呼叫外部的配置数据,底下这些数据会依序的被呼叫进来:        /etc/inputrc            /etc/profile 会主动的判断使用者有没有自定义输入的按键功能        /etc/profile.d/*.sh            这个目录底下的文件规范了 bash 操作接口的颜色、 语系、ll 与 ls 命令的命令别名、vi 的命令别名、which 的命令别名等等        /etc/sysconfig/i18n            这个文件是由 /etc/profile.d/lang.sh 呼叫进来的!这也是我们决定 bash 默认使用何种语系的重要配置文件!

~/.bash_profile (login shell 才会读)

    bash 在读完了整体环境配置的 /etc/profile 并藉此呼叫其他配置文件后,接下来则是会读取使用者的个人配置文件。 在 login shell 的 bash 环境中,所读取的个人偏好配置文件其实主要有三个,依序分别是:        1.~/.bash_profile        2.~/.bash_login        3.~/.profile

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

    由于 /etc/profile 与 ~/.bash_profile 都是在取得 login shell 的时候才会读取的配置文件,所以, 如果你将自己的偏好配置写入上述的文件后,通常都是得注销再登陆后,该配置才会生效。那么,能不能直接读取配置文件而不注销登陆呢? 可以的!那就得要利用 source 这个命令了!       [root@www ~]# source 配置文件档名    范例:将家目录的 ~/.bashrc 的配置读入目前的 bash 环境中    [root@www ~]# source ~/.bashrc  <==底下这两个命令是一样的!    [root@www ~]#  .  ~/.bashrc

~/.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

其他相关配置文件

    /etc/man.config    ~/.bash_history    ~/.bash_logout

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

    [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;    ....(以下省略)....    eof   : End of file 的意思,代表『结束输入』。    erase : 向后删除字符,    intr  : 送出一个 interrupt (中断) 的讯号给目前正在 run 的程序;    kill  : 删除在目前命令列上的所有文字;    quit  : 送出一个 quit 的讯号给目前正在 run 的程序;    start : 在某个程序停止后,重新启动他的 output    stop  : 停止目前屏幕的输出;    susp  : 送出一个 terminal stop 的讯号给正在 run 的程序。    [root@www ~]# set [-uvCHhmBx]    选项与参数:    -u  :默认不激活。若激活后,当使用未配置变量时,会显示错误信息;    -v  :默认不激活。若激活后,在信息被输出前,会先显示信息的原始内容;    -x  :默认不激活。若激活后,在命令被运行前,会显示命令内容(前面有 ++ 符号)    -h  :默认激活。与历史命令有关;    -H  :默认激活。与历史命令有关;    -m  :默认激活。与工作管理有关;    -B  :默认激活。与刮号 [] 的作用有关;    -C  :默认不激活。若使用 > 等,则若文件存在时,该文件不会被覆盖。    范例一:显示目前所有的 set 配置值    [root@www ~]# echo $-    himBH    # 那个 $- 变量内容就是 set 的所有配置啦! bash 默认是 himBH     另外,其实我们还有其他的按键配置功能呢!就是在前一小节提到的 /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
组合按键 运行结果 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
符号 内容 # 批注符号:这个最常被使用在 script 当中,视为说明!在后的数据均不运行 “\” 跳脱符号:将『特殊字符或通配符』还原成一般字符 | 管线 (pipe):分隔两个管线命令的界定(后两节介绍); ; 连续命令下达分隔符:连续性命令的界定 (注意!与管线命令并不相同) ~ 用户的家目录 $ 取用变量前导符:亦即是变量之前需要加的变量取代值 & 工作控制 (job control):将命令变成背景下工作 ! 逻辑运算意义上的『非』 not 的意思! / 目录符号:路径分隔的符号 >, >> 数据流重导向:输出导向,分别是『取代』与『累加』 <, << 数据流重导向:输入导向 (这两个留待下节介绍) ’ ‘ 单引号,不具有变量置换的功能 ” “ 具有变量置换的功能! ` ` 两个『 ` 』中间为可以先运行的命令,亦可使用 $( ) ( ) 在中间为子 shell 的起始与结束 { } 在中间为命令区块的组合!