1. 管理整个计算机硬件的其实是操作系统的核心 (kernel),这个核心是需要被保护的,所以一般使用者就只能透过 shell 来跟核心沟通,以让核心达到我们所想要达到的工作。其实壳程序的功能只是提供用户操作系统的一个接口,因此这个壳程序需要可以调用其他软件才行。包括 man, chmod, chown, vi, fdisk, mkfs 等等指令都是独立的应用程序, 我们可以通过壳程序 (就是指令列模式) 来操作这些应用程序,让这些应用程序呼叫核心来运作所需的工作。
2. 只要能够操作应用程序的接口都能够称为壳程序。狭义的壳程序指的是指令列方面的软件。 广义的壳程序则包括图形接口的软件,因为图形接口其实也能够操作各种应用程序来呼叫核心工作。
3. Linux 使用的 shell 称为『 Bourne Again SHell (简称 bash) 』,这个 Shell 是 Bourne Shell 的增强版本,也是基于 GNU 的架构下发展出来的。
4. 第一个流行的 shell 是由 Steven Bourne 开发出来的,为了纪念他所以就称为 Bourne shell ,或直接简称为 sh。后来另一个广为流传的 shell 是由柏克利大学的 Bill Joy 设计依附于 BSD 版的 Unix 系统中的 shell ,这个 shell 的语法有点类似 C 语言,所以叫 C shell ,简称为 csh。
5. 你可以检查一下 /etc/shells 这个档案,可能有以下这几个可以用的 shells:
1) /bin/sh (已经被 /bin/bash 所到代)
2) /bin/bash (就是 Linux 默认的 shell)
3) /bin/ksh (Kornshell 由 AT&T Bell lab. 开发出,兼容于 bash)
4) /bin/tcsh (整合 C Shell ,提供更多的功能)
5) /bin/csh (已经被 /bin/tcsh 所取代)
6) /bin/zsh (基于 ksh 开发出来的,功能更强大的 shell)
系统某些服务在运作过程中,会去检查使用者能够使用的 shells ,而这些 shell 的查询就是借由 /etc/shells 这个档案。
6. 当我们登录系统的时候,系统就会给我们一个 shell 让我们工作。 而这个登录取得的 shell 就记录在 /etc/passwd 这个档案内:
# cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
如上所示,在每一行的最后一个数据,就是你登录后可以取得的默认的 shell。
7. bash 主要有以下几个优点:
1) 命令记忆能力 (history):Bash能记忆使用过的指令。只要在指令列按『上下键』就可以找到前/后一个输入的指令。~/.bash_history 记录了这一次登录以前所执行过的指令, 而这一次登录所执行的指令都被暂存在内存中,当你成功地注销后,这些指令才会记录到 .bash_history 当中。
2) 命令与档案补全功能([tab] 键):使用 [tab] 按键的时机依据 [tab] 接在指令后或参数后而有所不同:
a) [Tab] 接在一串指令的第一个word的后面(只要指令没输完),则为命令补全;
b) [Tab] 接在一串指令的第二个word以后时,则为『档案补齐』。
3) 命令别名设定功能 (alias):你可以在指令列输入 alias 就可以知道目前的命令别名有哪些。也可以直接下达命令来设定别名: alias lm='ls -al'
4) 工作控制、前台后台控制 (job control, foreground, background):工作控制(jobs)可以让我们随时将工作丢到后台中执行,而不怕不小心使用了 [Ctrl] + c 来停掉该程序。
5) 程序化脚本 (shell scripts):可以将你平时管理系统需要下达的连续指令写成一个档案, 该档案还可以通过交互式的方式来进行主机的侦测工作,也可以借由 shell 提供的环境变量及相关指令来进行设计。
6) 通配符 (Wildcard):bash 支持许多的通配符来帮助用户查询与指令下达。
8. 为了方便 shell 的操作,bash 已经『内建』了很多指令,例如 cd ,umask 等等,都是内建在 bash 当中的。利用 type 这个指令可以来察看某个指令是来自外部指令(其他非 bash 所提供的指令) 还是内建在 bash 当中的:
# type [-tpa] name
选项说明如下:
选项 | 功能 |
不加任何选项时,type 会显示出 name 是外部指令还是 bash 内建指令(以一句话的形式表示) | |
-t | type 会将 name 以底下这些字眼显示出他的意义:file :表示为外部指令;alias :表示该指令为命令别名所设定的名称;builtin :表示该指令为 bash 内建的功能; |
-p | 如果后面接的 name 为外部指令时,会显示完整文件名,否则什么都不显示 |
-a | 会由 PATH 变量定义的路径中,将所有含 name 的指令都列出来,包含 alias |
9. 如果指令太长,可以用『 \[Enter] 』来将 [Enter] 这个按键『转意』,让 [Enter] 按键不再具有『开始执行』的功能,好让指令可以继续在下一行输入。 需要特别留意, [Enter] 按键是紧接着反斜杠 (\) 的,两者中间没有其他字符。 因为 \ 仅转意『紧接着的下一个字符』而已。如果顺利转意 [Enter] 后,下一行最前面就会主动出现 > 的符号, 你可以继续输入指令。
10. 每个账号的邮件信箱默认是以 MAIL 这个发量来进行存取的,当 vbird 这个使用者登入时,他便会取得 MAIL 这个变量,而这个变量的内容其实就是 /var/spool/mail/vbird。我们使用信件读取指令 mail 来读取自己的邮件信箱时,这个程序可以直接读取 MAIL 这个变量的内容, 就能够自动地分辨出属于自己的信箱信件。
11. 系统就是通过 PATH 这个变量里面的内容所记录的路径顺序来搜寻指令的。如果在搜寻完 PATH 变量内的路径还找不到要运行的指令,就会在屏幕上显示『 command not found 』的错误讯息了。
12. 你可以利用 echo 这个指令来读取变量, 变量在被读取时,前面必须要加上『 $ 』或者是以 ${变量} 的方式才行:
[root@www ~]# echo $PATH /usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
13. 要『设定』或『修改』 某个变量的内容,可以用『等号(=)』连接变量与他的内容。当一个变量名称尚未被定义时,默认的内容是空的。 变量在设定时,需要符合以下规定:
1) 变量与变量内容只能以一个等号『=』来连接,例如:myname=VBird
2) 等号两边不能接空格符,如下为错误:myname = VBird 或 myname=VBird Tsai
3) 变量名称只能是英文字母(以及下划线)与数字,但是开头字符不能是数字,如下为错误: 2myname=VBird
4) 变量内容若有空格符可使用双引号『"』或单引号『'』将变量内容结合起来,但如果引号中含有$,则双引号会认为$后跟的是变量名,会读取其实际值,而单引号则会把它当成一个字符。
5) 可用转义字符『 \ 』将特殊符号(如 [Enter], $, \, 空格符, '等)变成一般字符:name=VBird\'s\ name
6) 在一串指令中,还需要借由其他的指令提供的信息,可以使用反单引号(数字1左边那个键)『`指令`』或 『$(指令)』。例如想要取得核心版本的设定:『version=$(uname -r)』再『echo $version』
7) 若该变量为扩增变量内容时,则可用 "$变量名称" 或 ${变量} 累加内容,如: 『PATH="$PATH":/home/bin』
8) 若该变量需要在其他子程序中使用(在当前 shell 下,去调用另一个新的 shell ,新的那个shell 就是子程序),则需要以 export 来使变量变成环境变量: 『export PATH』
9) 通常大写字符为系统默认变量,自行设定的变量可以使用小写字符,方便判断。
10) 取消变量的方法为使用 unset :『unset 变量名称』
14. 我们却可以利用 uname -r 这个指令取得Linux核心版本信息。可以用以下命令进入当前核心的模块目录:
[root@www ~]# cd /lib/modules/`uname -r`/kernel
[root@www ~]# cd /lib/modules/$(uname -r)/kernel
15. env 是 environment (环境) 的缩写,可以列出所有的环境变量。常见的环境变量有:
1) HOME: 代表用户的家目录。使用 cd ~ 或者 cd 可以直接回到用户家目录就是利用这个变量。
2) SHELL: 当前环境使用的 SHELL 是个程序,Linux 默认使用 /bin/bash。
3) HISTSIZE: 我们曾经下达过的指令可以被系统记录下来,而记录的『笔数』则是由这个值设定的。
4) MAIL: 当我们使用 mail 这个指令在收信时,系统会去读取这个变量记录的邮件信箱档案 (mailbox)的位置。
5) PATH: 执行文件搜寻的路径,目录与目录中间以冒号(:)分隔。
6) LANG: 记录当前系统所用的语系。
7) RANDOM: 目前大多数的 distributions 都会有随机数生成器,那就是 /dev/random 这个档案。 我们可以通过这个随机数档案相关的发量 ($RANDOM) 来随机取得随机数值。在 BASH 的环境下,这个 RANDOM 变量的内容,介于 0~32767 之间,如果想要使用 0~9 之间的数值,可以利用 declare 声明数值类型:
[root@www ~]# declare -i number=$RANDOM*10/32768 ; echo $number
8
8) PWD: 目前用户所在的工作目录。
9) _: 上一次使用癿挃令癿最后一个参数(戒挃令本身)
10) INPUTRC: 与键盘按键功能有关。可以设定特殊按键。
16. bash 不只有环境变量,还有一些与 bash 操作接口有关的变量,以及用户自己定义的变量。set 除了环境变量外,还会将其他在 bash 内的变量通通显示出来。 shell 操作接口相关的主要变量有:
1) PS1: 存放『命令提示字符』的内容,可以用到以下转义字符:
转义字符 | 含义 |
\d | 可显示出『星期 月 日』的日期格式 |
\H | 完整的主机名 |
\h | 仅取主机名在第一个小数点之前的名字 |
\t | 显示时间,为 24 小时格式的『HH:MM:SS』 |
\T | 显示时间,为 12 小时格式的『HH:MM:SS』 |
\A | 显示时间,为 24 小时格式的『HH:MM』 |
\@ | 显示时间,为 12 小时格式的『am/pm』样式 |
\u | 目前使用者的账号名称 |
\v | BASH 的版本信息 |
\w | 完整的工作目录名称,由根目录写起的目录名称。但家目录会以 ~ 取代; |
\W | 利用 basename 函数取得工作目录名称,所以仅会列出最后一个目录名。 |
\# | 下达的第几个指令。 |
\$ | 提示字符,如果是 root 时,提示字符为 # ,否则就是 $。 |
2) $: 钱字号本身也是个变量,代表的是『目前这个 Shell 的进程代号』,亦即是所谓的 PID (Process ID)。
3) ?: 『上一个执行的指令所返回的值』。当我们执行某些指令时, 这些指令都会返回一个执行后的代码。一般来说,如果成功地执行该指令, 则会返回一个 0 值,如果执行过程发生错误,就会回传『错误代码』,一般是非 0 的数值。
4) OSTYPE, HOSTTYPE, MACHTYPE: 主机硬件与核心的等级。较高阶的硬件通常会向下兼容旧有的软件,但较高阶的软件可能无法在旧机器上面安装。
17. 环境变量与自定义变量的差异在于『 该变量是否会被子程序所继续引用』。你在 bash 底下所下达的任何指令都是由这个 bash 所衍生出来的,那些被下达的指令就被称为子程序。子程序仅会继承父程序的环境变量, 子程序不会继承父程序的自定义变量。如想让自定义变量内容继续在子程序中使用,那么可以执行:
[root@www ~]# export 变量名称
如果仅下达 export 而没有接变量时,那么会显示所有的『环境变量』。
18. 可以用locale指令查询Linux支持哪些语系:
# locale -a
....(前面省略)....
zh_TW zh_TW.big5
zh_TW.euctw
zh_TW.utf8
zu_ZA
zu_ZA.iso88591
zu_ZA.utf8
locale指令不加任何参数和选项时,可以用来显示所有与语系相关的环境变量的值:
# locale
LANG=en_US <==主语言的环境
LC_CTYPE="en_US" <==字符(文字)辨识的编码
LC_NUMERIC="en_US" <==数字系统的显示讯息
LC_TIME="en_US" <==时间系统的显示数据
LC_COLLATE="en_US" <==字符串的比较与排序等
LC_MONETARY="en_US" <==币值格式的显示等
LC_MESSAGES="en_US" <==讯息显示的内容,如菜单、错误讯息等
LC_ALL= <==整体语系的环境
你可以逐一设定每个与语系有关的变量数据,如果其他的语系变量都未设定, 且你有设定了 LANG 或者是 LC_ALL 时,则其他的语系变量就会使用这两个变量的取值。
19. 在 Linux 主机的终端机接口环境下是无法显示像中文这么复杂的编码文字的。
20. 系统默认支持的语系档案都放置在: /usr/lib/locale/ 这个目录中。整体系统默认的语系定义在 /etc/sysconfig/i18n档案中:
# cat /etc/sysconfig/i18n
LANG="zh_TW.UTF-8"
21. 之所以环境变量的数据可以被子程序所引用是因为内存配置的关系:
1) 当启动一个 shell,操作系统会分配一记忆区块给 shell 使用,此内存内的变量可让子程序读取
2) 若在父程序调用 export 功能,可以让自定义变量的内容写到上述的记忆区块当中(环境变量);
3) 当加载另一个 shell 时 (亦即启动子程序,而离开原本的父程序),子 shell 可以将父 shell 的环境变量所在的记忆区块导入自己的环境变量区块当中。
22. 要读取来自键盘输入的变量,可以用 read 这个指令。这个指令最常被用在 shell script 的撰写中:
# read [-pt] variable
-p 选项后面可以接提示字符;-t 选项后面可以接等待的『秒数』。
23. declare 或 typeset 可以用来『申明变量的类型』。如果使用 declare 后面不接任何参数,那么 bash 就将所有的变量都列出,就好像使用 set 一样:
# declare [-aixr] variable
选项说明:
选项 | 说明 |
-a | 将后面名为 variable 的变量定义成为数组 (array) 类型 |
-i | 将后面名为 variable 的变量定义成为整数数字 (integer) 类型 |
-x | 用法与 export 一样,就是将后面的 variable 变成环境变量 |
-r | 将变量设定成为 readonly 类型,该变量不可被更改内容,也不能 unset |
-p | 列出变量的类型 |
# ulimit [-SHacdfltu] [配额]
选项说明如下:
选项 | 说明 |
-H | hard limit ,严格的设定,必定不能超过这个设定值 |
-S | soft limit ,警告的设定,可以超过这个设定值,但是若超过则有警告讯息 |
-a | 后面不接任何选项与参数,可列出所有的限制额度 |
-c |
当程序发生错误时,系统可能会将该程序在内存中的信息写成档案(除错用)。 这种档案就被称为核心档案(core file)。此为限制每个核心档案的最大容量。 |
-f | 此 shell 可以建立的最大档案容量,单位为 Kbytes |
-d | 程序可使用癿最大段内存(segment)容量 |
-l | 可用于锁定 (lock) 的内存量 |
-t | 可使用的最大 CPU 时间 (单位为秒) |
-u | 单一用户可以使用的最大进程(process)数量 |
27. 变量内容的删除和取代:
变量设定方式 | 说明 |
${变量#表达式} | 若变量内容从头开始的数据符合『表达式』,则将最短匹配的数据删除 |
${变量##表达式} | 若变量内容从头开始的数据符合『表达式』,则将最长匹配的数据删除 |
${变量%表达式} | 若变量内容从尾部开始的数据符合『表达式』,则将最短匹配的数据删除 |
${变量%%表达式} |
若变量内容从尾部开始的数据符合『表达式』,则将最长匹配的数据删除 |
${变量/旧字符串/新字符串} | 若变量内容中符合『旧字符串』则『第一个旧字符串会被新字符串取代』 |
${变量//旧字符串/新字符串} | 若变量内容中符合『旧字符串』则『全部旧字符串会被新字符串取代』 |
变量内容的测试与取值:
变量设定方式 | str没有设定 | str为空串 | str为非空串 |
var=${str-expr} | var=expr | var=$str | var=$str |
var=${str:-expr} | var=expr | var=expr | var=$str |
var=${str+expr} | var="" | var=expr | var=expr |
var=${str:+expr} | var="" | var="" | var=expr |
var=${str=expr} |
str=expr var=expr |
str不变 var=$str |
str不变 var=$str |
var=${str:=expr} |
str=expr var=expr |
str=expr var=expr |
str不变
var=$str |
var=${str?expr} | expr 输出至 stderr | var=$str | var=$str |
var=${str:?expr} | expr 输出至 stderr | expr 输出至 stderr | var=$str |
28. 别名命名规则与变量命名规则几乎相同。你可以在 alias 后面加上你的『别名』='指令 选项...' :
# alias lm='ls -al | more'
命令别名的设定可以到代既有的指令:
# alias rm='rm -i'
alias不加任何选项时可以列出现有的命令别名。可以用 unalias 别名 来取消别名。
29. 在正常情况下,历史命令的读取与记录如下:
1) 当我们以 bash 登入 Linux 主机后,系统会从家目录的 ~/.bash_history 读取以前曾经下达过的指令。~/.bash_history 所记录的命令条数由 bash 的 HISTFILESIZE 这个变量的值决定。
2) 历史命令在注销时,会将最近的 HISTFILESIZE 条指令记录到我的记录文件当中。
3) 可以用 history -w 强制立刻写入。~/.bash_history 记录的笔数永远都是 HISTFILESIZE 那么多,旧的讯息会被最新的替换掉。
30. history 指令使用方法如下:
# history [n]
# history [-c]
# history [-raw] histfiles
选项说明如下:
选项 | 说明 |
n | 数字,『列出最近的 n 笔命令』 |
-c | 将目前 shell 中的所有 history 内容全部消除 |
-a | 将目前新增的 history 指令添加到 histfiles 中,若没有 histfiles参数 , 则默认为 ~/.bash_history |
-r |
将 histfiles 的内容读到目前这个 shell 的 history 中 |
-w | 将目前的 history 记忆内容写入 histfiles 中 |
不加任何参数时列出目前内存中所有 history 记忆 |
31. !n 可以执行历史中第n笔指令。!command 可以执行由最近向前搜寻『指令串开头为 command』的那个指令。!!可以执行上一个指令
32. 指令查找的顺序为:
1) 以相对/绝对路径执行指令,例如『 /bin/ls 』或『 ./ls 』;
2) 由 alias 找到该指令来执行;
3) 由 bash 内建的 (builtin) 指令来执行;
4) 通过 $PATH 这个变量定义的路径中顺序搜寻到的第一个指令来执行。
通过 type -a 指令 可以查询到指令执行的顺序:
# alias echo='echo -n' # type -a echo echo is aliased to `echo -n' echo is a shell builtin echo is /bin/echo
33. 在终端机接口 (tty1 ~ tty6) 登录的时候,会有几行提示的字符串,那就是进站画面,其内容保存在 /etc/issue 里面。issue 这个档案的内容也是可以使用反斜杠来转义一些特殊变量的,你可以 man issue 和 man mingetty 来查看:
变量 | 含义 |
\d | 显示本地日期 |
\l | 显示第几个终端机接口 |
\m | 显示硬件的等级 (i386/i486/i586/i686...) |
\n |
显示主机的网络名称 |
\o | 显示 domain name |
\r | 操作系统的版本 (相当于 uname -r) |
\t | 显示本地时间 |
\s | 操作系统的名称 |
\v | 操作系统的版本 |
当我们使用 telnet 连接到主机时,主机的登录画面就会显示 /etc/issue.net 而不是 /etc/issue 的内容。
34. 如果您想要让所有使用者登录后都能看到某个讯息,可以将讯息加入 /etc/motd 里面去。
35. login shell是指取得 bash 时需要完整的登录流程的。比如,你要由 tty1 ~ tty6 登录,需要输入用户的账号与密码,此时取得的 bash 就称为『 login shell 』。non-login shell是指取得 bash 接口时不需要重复登录的举动。比如,(1)你以 X window 登录 Linux 后, 再以 X 的图形化接口启动终端机,此时那个终端接口并不需要再次输入账号与密码。(2)你在原本的 bash 环境下再次下达 bash 这个指令,同样的也没有输入账号密码, 那第二个 bash (子程序) 也是 non-login shell 。
36. login shell 只会读取以下两个配置文件:
1) /etc/profile:这是系统整体的设定,最好不要修改这个档案;
2) ~/.bash_profile 或 ~/.bash_login 或 ~/.profile:使用者个人设定,要改自己的数据,就写入这里。
37. /etc/profile 这个配置文件可以使用登录者的标识符 (UID) 来决定很多重要的变量数据, 这也是每个用户登录取得 bash 时一定会读取的配置文件。它一般会存放整体环境的变量设定,主要有:
1) PATH:会依据 UID 决定 PATH 变量要不要含有 sbin 的系统指令目录;
2) MAIL:依据账号设定用户的 mailbox 到 /var/spool/mail/账号名;
3) USER:设定此变量内容为当前用户标识符(UID);
4) HOSTNAME:设定此变量内容为本主机的 hostname 指令返回的结果;
5) HISTSIZE:历史命令记录笔数。
6) INPUTRC: /etc/profile 会判断用户有没有自定义的按键功能,如果没有, /etc/profile 就会设定『INPUTRC=/etc/inputrc』此档案内容为 bash 的热键、[tab]要不要有声音等等的数据。
7) /etc/profile.d/*.sh: 只要在 /etc/profile.d/ 这个目录内且扩展名为 .sh ,且用户具有 r 的权限, 那么该档案就会被 /etc/profile 调用。这个目录底下的档案规范了 bash 操作接口的颜色、 语系、ll 与 ls 指令的别名、vi 的别名、which 的别名等等。如果你需要帮所有用户设定一些共享的命令别名时, 可以在这个目录底下自行建立扩展名为 .sh 的档案,并将所需要的数据写入即可。
8) /etc/sysconfig/i18n: 这个档案是由 /etc/profile.d/lang.sh 调用的。这也是决定 bash 默认使用何种语系的重要配置文件,档案里最重要的就是 LANG 这个变量的设定。
38. bash 在读完了整体环境设定的 /etc/profile 并借此调用其他配置文件后,则会读取用户个人配置文件。 在 login shell 的 bash 环境中,所读取的个人偏好配置文件为以下三个文件中存在的第一个文件:
1) ~/.bash_profile
2) ~/.bash_login
3) ~/.profile
~/.bash_profile 其实会再调用 ~/.bashrc 的设定内容。
39. 整个 login shell 的配置文件读取流程如下:
实线的方向是主线流程,虚线的方向则是被调用的配置文件。
40. 由于 /etc/profile 与 ~/.bash_profile 都是在取得 login shell 的时候才会读取的配置文件,所以, 如果你将自己的偏好设定写入上述的档案后,通常都是得注销再登入后,该设定才会生效。利用 source 指令或小数点 (.) 都可以直接读取配置文件而不注销登录:
# source 配置文件档名 # . 配置文件档名
41. 当你取得 non-login shell 时,bash 配置文件仅会读取 ~/.bashrc 而已。在CentOS中~/.bashrc还会调用 /etc/bashrc ,它定义了以下数据:
1) 依据不同的 UID 设定出 umask 的值;
2) 依据不同的 UID 设定出提示字符 (就是 PS1 变量);
3) 调用 /etc/profile.d/*.sh 的设定
这个 /etc/bashrc 是 CentOS 特有的 (其实是 Red Hat 系统特有的),其他不同的 distributions 可能会放置在不同的档名就是了。万一你不小心删除了~/.bashrc,那么可以复制 /etc/skel/.bashrc 到你的家目录,再修订一下你所想要的内容, 并使用 source 去调用 ~/.bashrc。
42. /etc/man.config 规范了使用 man 的时候, man page 的路径到哪里去寻找。这个档案在各大版本 Linux distributions 中,档名都不太相同,有的叫/etc/manpath.config。
43. 每次登入 bash 后,bash 会先读取~/.bash_history这个档案,将所有的历史指令读入内存。而这个档案能够记录几笔数据,则与 HISTFILESIZE 这个变量有关。
44. ~/.bash_logout 记录了『当我注销 bash 后,系统再帮我做完什么动作后才离开』。
45 可以利用 stty (setting tty) 来查阅和设定一些按键的功能:
# stty [-a] # stty [功能] [按键]-a 选项表示将目前所有的 stty 参数列出来。几个重要的功能代表的意义:
1) eof : End of file 的意思,代表『结束输入』;
2) erase : 向后删除字符;
3) intr : 送出一个 interrupt (中断) 的信号给目前正在 run 的程序;
4) kill : 删除在目前指令列上的所有文字;
5) quit : 送出一个 quit 的信号给目前正在 run 的程序;
6) start : 在某个程序停止后,重新启动他的 output;
7) stop : 停止目前屏幕的输出;
8) susp : 送出一个 terminal stop 的信号给正在 run 的程序。
46. 除了可以利用 set 来显示变量的内容外,set 还可以设定整个指令输出/输入的环境。 例如记录历史命令、显示错误内容等:
# set [-uvCHhmBx]选项说明如下:
选项 | 功能 |
-u | 默认不启用。启用后,当使用未设定变量时,会显示错误信息 |
-v | 默认不启用。启用后,在信息被输出前,会先显示信息的原始内容 |
-x | 默认不启用。启用后,在指令被执行前,会显示指令内容(前面有 ++ 符号) |
-h |
默认启用。与历史命令有关 |
-H | 默认启用。与历史命令有关; |
-m | 默认启用。与工作管理有关; |
-B | 默认启用。与括号 [] 的作用有关; |
-C | 默认不启用。启用后,若使用 > ,则若档案存在时,该档案不会被覆盖。 |
要取消某选项功能时,只要用“+”代替“-”就行。 $- 的内容就是 set 的所有设定。
47. bash 默认的组合键如下:
组合按键 | 功能 |
Ctrl + C | 终止目前的命令 |
Ctrl + D | 输入结束 (EOF),例如邮件结束的时候 |
Ctrl + M | 就是 Enter |
Ctrl + S |
恢复屏幕的输出 |
Ctrl + U | 在提示字符下,将整列命令删除 |
Ctrl + Z | 『暂停』目前的命令 |
48. 以下列出一些常用的通配符:
符号 | 功能 |
* | 代表『 0 个到无穷多个』任意字符 |
? | 代表『一定有一个』任意字符 |
[ ] |
同样代表『一定有一个在括号内』的字符(非任意字符)。例如 [abcd] 代表『一定有一个字符, 可能是 a, b, c, d 这四个任何一个』 |
[ - ] |
若有减号在中括号内时,代表『在编码顺序内的所有字符』。例如 [0-9] 代表 0 到 9 之间的所 有数字。 |
[^ ] |
若中括号内的第一个字符为指数符号 (^) ,那表示『反向选择』,例如 [^abc] 代表 一定有一个 字符,只要是非 a, b, c 的其他字符就接受的意思。 |
49. bash 环境中的特殊符号的作用如下:
符号 | 功能 |
# | 批注符号:这个最常被使用在 script 当中,视为说明,在后的数据均不执行 |
\ | 转义符号:将『特殊字符或通配符』还原成一般字符 |
| |
管道 (pipe):分隔两个管道具命令的界定 |
; |
连续指令下达分隔符:连续性命令的界定 |
~ |
用户的家目录 |
$ |
取用变数前导符:变量之前需要加的变量取代值 |
& |
工作控制 (job control):将指令变成后台工作 |
! |
逻辑运算意义上的『非』 not 的意思 |
/ |
目录符号:路径分隔的符号 |
>, >> |
数据流重定向:输出定向,分别是『取代』与『累加』 |
<, << |
数据流重定向:输入定向 |
' ' |
单引号,不具有变量置换的功能 |
" " |
具有变量置换的功能 |
` ` |
两个『`』中间为可以先执行的指令,亦可使用 $( ) |
( ) |
在中间为子 shell 的起始与结束 |
{ } |
在中间为命令区块的组合 |
50. 我们执行一个指令的时候,这个指令可能会由档案读入资料,经过处理后,再将数据输出到屏幕上。 在下图中, standard output 与 standard error output 分别代表『标准输出』与『标准错误输出』。标准输出指的是『指令执行所回传的正确的信息』,而标准错误输出则是『 指令执行失败后,所回传的错误信息』。它们都是默认输出到屏幕上。
51. 数据流重定向可以将 standard output (简称 stdout) 与 standard error output (简称 stderr) 分别传送到其他的档案或装置中去:
1) 标准输入 (stdin) :代码为 0 ,使用 < 或 << ;
2) 标准输出 (stdout):代码为 1 ,使用 > 或 >> ;
3) 标准错误输出(stderr):代码为 2 ,使用 2> 或 2>> ;
若以 > 输出到一个已存在的档案中,那个档案就会被覆盖掉。利用两个大于符号 (>>)可以将数据累加而不将旧的数据删除。
52. 如果知道错误信息会发生,而要将错误信息忽略掉不显示或储存,可以用黑洞装置 /dev/null ,这个 装置可以吃掉任何导向这个装置的信息。
53. 如果要将正确与错误数据通通写入同一个档案,可以执行如下命令:
$ find /home -name .bashrc > list 2>&1 $ find /home -name .bashrc &> list
54. < 的作用是『将原本需要由键盘输入的数据,改由档案内容来取代』。<< 代表的是『结束的输入字符』的意思。利用 << 右侧的控制字符,我们可以终止一次输入, 而不必输入 [crtl]+d 来结束。
55. 在指令与指令中间可以用分号 (;) 隔开,这样一来,分号前的指令执行完后就会立刻接着执行后面的指令:
# sync; sync; shutdown -h now
56. 若前一个指令执行的结果为正确,在 Linux 底下会回传一个 $? = 0 的值。&& 与 || 连接的指令之间有相依性,而这个相依性主要判断前一个指令执行的结果是否正确:
1) cmd1 && cmd2 :若 cmd1 执行完毕且正确执行($?=0),则开始执行 cmd2。 否则 cmd2 不执行。
2) cmd1 || cmd2 :若 cmd1 执行完毕且正确执行($?=0),则 cmd2 不执行。 否则开始执行 cmd2。
Linux 底下的指令都是由左往右执行的,&& 与 || 之间不存在优先级关系,返回值也会从左向右传递:
以下命令在 /tmp 存在时会显示 "exist" , 否则显示 "not exist" # ls /tmp && echo "exist" || echo "not exist" 以下命令在 /tmp 不存在时会同时显示 "exist" 与 "not exist" # ls /tmp || echo "not exist" && echo "exist"
57. 管道命令『 | 』仅能处理经由前面一个指令传来的正确信息,也就是 standard output 的信息,对于 stdandard error 并没有直接处理的能力:
在每个管道后面接的第一个参数必定是『指令』,而且这个指令必须要能接受 standard input 的数据才行。
58. cut 指令可以将一段信息的某一段『切』出来~ 处理的信息是以『行』为单位的:
# cut -d '分隔字符' -f fields # cut -c 字符数范围cut 主要的用途在于将每一行里的数据进行分解。-d选项指定每一行以哪个字符(只能是单个)进行分割,与-f一起使用,后接分段的序号列表(序号之间以逗号分隔),表示每一行仅保留哪几个分段(分段之间还是以指定的分隔符连接)。 -c表示以字符 (characters) 为单位取出指定范围内的字符,范围以起始字符序号-结束字符序号表示:
# cat test abc;def;ghi 123;456;789 # cat test | cut -d ';' -f 1,3 abc;ghi 123;789 # cat test | cut -c 6- ef;ghi 56;789
59. grep 指令会分析每一行的信息, 若当中有我们所需要的信息,就将该行取出来:
# grep [-acinv] [--color=auto] '搜寻字符串' filename选项说明如下:
选项 | 功能 |
-a | 将 binary 档案以 text 档案的方式搜寻数据 |
-c | 计算找到 '搜寻字符串' 的次数 |
-i | 忽略大小写的不同,所以大小写视为相同 |
-n |
输出行号 |
-v | 反向选择,亦即显示没有 '搜寻字符串' 内容的那一行 |
--color=auto | 可以将找到的关键词部分加上颜色的显示 |
60. sort 指令可以以行为单位进行排序,而且可以依据不同的数据类型来排序:
# sort [-fbMnrtuk] [file or stdin]选项说明如下:
选项 | 功能 |
-f | 忽略大小写的差异,例如 A 与 a 视为编码相同 |
-b | 忽略最前面的空格符部分 |
-M | 以月份的名字来排序,例如 JAN, DEC 等等的排序方法 |
-n |
使用『纯数字』进行排序(默认是以文字型态来排序的) |
-r | 反向排序 |
-u | 就是 uniq ,相同的数据中,仅出现一行代表 |
-t | 分隔符,默认是用 [tab] 键来分割 |
-k | 分割后以第几个分段来进行排序 |
61. uniq 指令用来将『相邻的重复的行删除掉只显示一个』,一般配合sort使用。-i 选项忽略大小写,-c选项会在行首显示重复的次数。
62. wc 指令可以计算输入信息的统计数据,不加任何参数时为依次显示输入信息的行数,单词数(以空白字符作为单词的间隔)以及字符数,-l 选项仅列出行数; -w 选项仅列出英文单字数;-m 选项仅列出字符数。
63. tee 会同时将数据流分送到档案与屏幕 (screen);而输出到屏幕的,其实就是 stdout ,可以让下个指令继续处理:
# tee [-a] file
-a 选项表示以累加 (append) 的方式,将数据加入 file 当中去。
64. tr 可以用来删除一段信息当中的文字,或是进行文字信息的替换:
# tr -d SET1 # tr OLD NEW-d 选项表示删除信息当中的 SET1 这个字符串。不加参数时表示把OLD字符串替换成NEW字符串。SET1, OLD, NEW都可以是正则表达式。
65. 使用 cat -A 则 [tab] 会以 ^I 来表示。col -x 会将 [tab] 取代为对等的空格键。由于 man page 内有些特殊按键与颜色显示,所以这个档案内会出现一堆怪异字符,col -b 经常被用于将 man page 转存为纯文本文件以方便查阅。
66. join 主要把两个档案当中,对行有 "相同数据" 的连接在一起。join 默认以空格符分隔数据,并比对『第一个分段』的数据, 如果两个档案的对应行的该段数据相同,则将两笔数据联成一行,且提取出该分段放在行首:
# head -n 3 /etc/passwd /etc/shadow ==> /etc/passwd <== root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin ==> /etc/shadow <== root:$1$/3AQpE5e$y9A/D0bh6rElAs:14120:0:99999:7::: bin:*:14126:0:99999:7::: daemon:*:14126:0:99999:7::: # join -t ':' /etc/passwd /etc/shadow root:x:0:0:root:/root:/bin/bash:$1$/3AQpE5e$y9A/D0bh6rElAs:14120:0:99999:7::: bin:x:1:1:bin:/bin:/sbin/nologin:*:14126:0:99999:7::: daemon:x:2:2:daemon:/sbin:/sbin/nologin:*:14126:0:99999:7::: # head -n 3 /etc/passwd /etc/group ==> /etc/passwd <== root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin ==> /etc/group <== root:x:0:root bin:x:1:root,bin,daemon daemon:x:2:root,bin,daemon # join -t ':' -1 4 /etc/passwd -2 3 /etc/group 0:root:x:0:root:/root:/bin/bash:root:x:root 1:bin:x:1:bin:/bin:/sbin/nologin:bin:x:root,bin,daemon 2:daemon:x:2:daemon:/sbin:/sbin/nologin:daemon:x:root,bin,daemon选项说明如下:
选项 | 功能 |
-t | 指定分隔字符 |
-i | 忽略大小写 |
-1 | 代表『第一个档案要用那个分段来比较』 |
-2 |
代表『第二个档案要用那个分段来比较』 |
67. paste 会直接『将两个文件的对应行贴在一起,且中间以 [tab] 键隔开』:
# paste [-d] file1 file2
-d 后面可以指定分隔字符。默认是以 [tab] 来分隔。如果 file 部分写成 - ,表示输入来自 standard input。
68. expand 会将 [tab] 键转成空格键:
expand [-t] file
-t :后面可以指定一个 tab 键用几个空格键取代。如果 file 部分写成 - ,表示输入来自 standard input。unexpand 会将空白转成 [tab]。
69. split 可以将一个大档案,依据档案大小或行数进行分割,将大档案分割成为小档案:
# split [-bl] file PREFIX
-b 选项后面可接欲分割成的档案大小,可加单位,例如 b, k, m 等; -l 选项后面可以跟以多少行数来进行分割。 PREFIX :作为分割档档名的前缀,分割后的档名会以PREFIXaa, PREFIXab, PREFIXac 等形式出现。cat PREFIX* >> file 可以将小档案合并回大档案。
70. xargs 会产生后面所跟指令的参数,它可以读入 stdin 的数据,并以空格符或断行字符作为分隔,将 stdin 的信息分割成为 arguments:
# xargs [-0epn] command
选项说明如下:
选项 | 功能 |
-0 | 如果输入的 stdin 含有特殊字符,例如 `, \, 空格键等字符,可以将它们转义成一般字符 |
-e | EOF (end of file) 。后面紧接(没空格)一个字符串,当 xargs 分析到这个字符串时,就会停止 |
-p | 在执行每个指令的 argument 时,都会询问使用者 |
-n |
指定xargs每次最多传给后面的command多少个参数,参数多于这个数时,command会被执行多次 |
当 xargs 后面没有接任何的指令时,默认是以 echo 进行输出。会使用 xargs 的原因是, 很多指令并不支持管道命令,因此我们可以通过 xargs 来提供该指令引用 standard input 的内容。
71. 在管道命令当中,常常会使用到前一个指令的 stdout 作为这次指令的 stdin , 某些指令需要用到文件作为输入或输出参数 (例如 tar) 时,可以用减号 "-" 替代文件名,来表示 stdin 与 stdout:
# tar -cvf - /home | tar -xvf -
相关推荐
【认识 BASH 这个 Shell】 BASH,全称Bourne-Again SHell,是Linux系统中最常用的Shell之一,尤其对于初学者来说是必须掌握的基础工具。它是一种命令解释器,允许用户通过文本界面与操作系统内核进行交互,执行各种...
第0章 计算机概论 第1章 Linux是什么 第2章 Linux 如何学习 第3章 主机规划与磁盘分区 第4章 安装Centos5.x 与多重引导...第11章 认识与学习BASH 第12章 正规表示法与文件格式化处理 第13章 学习Shell Scripts ........
第11章 认识与学习bash 第12章 正则表达式与文件格式化处理 第13章 学习shell script 第四部分 Linux使用者管理 第14章 Linux账号管理与ACL权限设置 第15章 磁盘配额(Quota)与高级文件系统管理 第16章 例行性...
第11章 认识Bash Shell 第12章 正则表达式 第13章 学习Shell脚本 第四部分 Linux用户管理 第14章 Linux账号与身份管理 第15章 Linux磁盘配额 第16章 例行性命令的建立 第17章 ...
教程名称:老段带你学鸟哥Linux(第三版)视频教程课程目录:【】第10章:vim程序编辑器【】第11章:认识与学习bash【】第12章:正则表达式与文件格式化处理【】第13章:学习shell script【】第14章:Linux...
"第11课认识和学习bash.pptx"将介绍Bash shell,它是Linux中最常用的命令解释器。Bash提供了强大的脚本编写能力,通过学习Bash,用户可以编写自动化任务,提高工作效率。 "第14课Shell编程.pptx"则进一步深入到...
第十一章“Shell重定向”讲解了如何改变程序的标准输入、输出和错误输出,使得数据可以被重定向到文件、管道或其他进程。这是实现数据流程控制的关键,也是Shell强大之处的体现。 第十二章“管道和过滤器”则涉及...
第11章可能是高级主题,如进程调度、内存管理和设备驱动。这部分内容对于系统管理员和开发者来说非常重要,因为它涉及到如何优化系统性能和处理硬件资源。 每个章节都通过PDF文档的形式提供,这使得你可以方便地...
"Linux命令第一部分"可能是对Linux常用命令的详细讲解,包括它们的功能、语法和实际应用场景,这对于熟悉Linux操作至关重要。 "linux.gif"可能是对Linux桌面环境的图形展示,帮助初学者直观地了解Linux的工作界面。...