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 ........
《学习 bash 第二版(英文版)》.chm,作者:Cameron Newbam & Bill Rosenblatt。...第十一章:用户系统 bash。 附录一:相关 shell。 附录二:参考列表。 附录三:可载入命令。 附录四:语法。 附录五:获得示例程序。
第11章 认识与学习bash 第12章 正则表达式与文件格式化处理 第13章 学习shell script 第四部分 Linux使用者管理 第14章 Linux账号管理与ACL权限设置 第15章 磁盘配额(Quota)与高级文件系统管理 第16章 例行性...
【标题】:“认识与学习 BASH,Shell 的变量功能” 【描述】:“影响 bash 环境操作的变量[root@www ~]# echo $variable[root@www ~]# echo $PATH/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/...
然而,由于标题明确指出了文档内容是关于学习Bash(第二版)中文版,我们可以根据这方面的知识进行扩展。 Bash是Bourne Again SHell的缩写,它是基于Unix操作系统的流行命令行界面。Bash作为免费和开源的软件,已经...
《学习Bash(第二版)中文版》这本书深入浅出地介绍了如何有效地利用Bash进行系统管理、自动化任务执行以及编写复杂脚本。 **1. Bash基础知识** Bash提供了丰富的命令行交互功能,包括基本的文件操作(如创建、...
《学习 bash 第二版》,作者:Cameron Newbam & Bill Rosenblatt。 本书教授了如何使用bash的高级命令行特性,如命令历史、命令行编辑和命令完成。
O'Relly 出版的Bash书,非常不错。
**Bash 入门学习实例** Bash,全称是“Bourne-Again SHell”,是Unix和类Unix系统中最常用的命令行解释器。它不仅是一个交互式shell,还是脚本编程语言,广泛用于Linux和macOS系统。这篇教程将通过一系列实例,帮助...
bash非常好的教程,自学很棒
第一章节是介绍,讲解什么是 Bash 和 shell,以及基本概念定义。第二章节是基本 shell 特性,涵盖了 shell 语法、shell 操作、变量、命令、函数等。 在基本 shell 特性章节中,讲解了 shell 语法,包括 shell 操作...
总之,《学习Bash》这本书是一部全面而详尽的Bash指南,不仅适合新手入门,也适用于高级用户进一步探索Bash的强大功能。通过本书的学习,读者能够熟练掌握Bash的各种特性和编程技术,从而提高日常工作的效率。
### Bash Shell 学习笔记知识点概览 #### 1. 引言 - **Shell**:作为用户与操作系统之间的桥梁,Shell提供了一种与系统进行交互的方式,支持用户执行命令和编写脚本来自动化任务。 - **Bash**:是Bourne-Again ...
本书详细介绍了bash的安装配置使用及编程,还介绍了shell编程
Bash参考手册.pdf是Bash shell的官方参考手册,涵盖了Bash shell的所有方面,包括基本语法、变量、命令、函数、文件处理、...通过学习Bash参考手册.pdf,用户可以深入了解Bash shell的所有方面,从基本语法到高级特性。
学习 bash (第二版)中文版.pdf O'Reily经典教材
第二版还加入了一些新命令,增强了安全性,也加入了readline,增强了配置和安装过程,并且增加了附助编程的bash shell调试器。 经过不懈的实践和对实例及问题进行深入的研究后,你会发现《学习bash》对Linux和其他...
高级BASH脚本学习是一项技能,对于掌握Linux系统和进行自动化操作至关重要。BASH(Bourne Again SHell)是UNIX和Linux系统中最流行的shell之一,几乎所有Linux发行版和大部分UNIX系统都支持BASH。由于其强大的功能和...
**Bash高级编程详解** Bash(Bourne-Again SHell)是Unix/Linux系统中最常用的命令行解释器,也是脚本编程的强大工具...因此,无论你是初学者还是经验丰富的开发者,深入学习Bash都是一个值得投入的时间和精力的投资。