`
leonzhx
  • 浏览: 802195 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论
阅读更多

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 列出变量的类型
 
24.  在默认的情况底下, bash 对于变量有几个基本的定义:
    1)  变量类型默认为『字符串』,所以若不指定变量类型,则 1+2 为一个『字符串』而不是『计算式』。
    2)  bash 环境中的数值运算,默认最多仅能到达整数形态,所以 1/3 结果是 0;
 
25.  在 bash 里头,数组的设定方式是: var[index]=contentindex为数组下标位置,content为该位置上的内容。bash 提供的是一维数组。
 
26.  bash 是可以『限制用户的某些系统资源』的,包括可以打开的档案数量, 可以使用的 CPU 时间,可以使用的内存总量等等:
# 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, PREFIXabPREFIXac 等形式出现。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 -

  

 

  • 大小: 88.5 KB
  • 大小: 19.8 KB
  • 大小: 17.3 KB
  • 大小: 3.6 KB
  • 大小: 3.1 KB
分享到:
评论

相关推荐

    鸟哥的 Linux 私房菜第11章-认识与学习 BASH1

    【认识 BASH 这个 Shell】 BASH,全称Bourne-Again SHell,是Linux系统中最常用的Shell之一,尤其对于初学者来说是必须掌握的基础工具。它是一种命令解释器,允许用户通过文本界面与操作系统内核进行交互,执行各种...

    Linux操作系统学习

    第0章 计算机概论 第1章 Linux是什么 第2章 Linux 如何学习 第3章 主机规划与磁盘分区 第4章 安装Centos5.x 与多重引导...第11章 认识与学习BASH 第12章 正规表示法与文件格式化处理 第13章 学习Shell Scripts ........

    学习 bash 第二版(英文版).chm

    《学习 bash 第二版(英文版)》.chm,作者:Cameron Newbam & Bill Rosenblatt。...第十一章:用户系统 bash。 附录一:相关 shell。 附录二:参考列表。 附录三:可载入命令。 附录四:语法。 附录五:获得示例程序。

    鸟哥的私房菜.pdf

    第11章 认识与学习bash 第12章 正则表达式与文件格式化处理 第13章 学习shell script 第四部分 Linux使用者管理 第14章 Linux账号管理与ACL权限设置 第15章 磁盘配额(Quota)与高级文件系统管理 第16章 例行性...

    认识与学习 BASH,Shell 的变量功能

    【标题】:“认识与学习 BASH,Shell 的变量功能” 【描述】:“影响 bash 环境操作的变量[root@www ~]# echo $variable[root@www ~]# echo $PATH/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/...

    学习Bash(第二版)中文版.pdf

    然而,由于标题明确指出了文档内容是关于学习Bash(第二版)中文版,我们可以根据这方面的知识进行扩展。 Bash是Bourne Again SHell的缩写,它是基于Unix操作系统的流行命令行界面。Bash作为免费和开源的软件,已经...

    学习 bash (第二版)中文版

    《学习Bash(第二版)中文版》这本书深入浅出地介绍了如何有效地利用Bash进行系统管理、自动化任务执行以及编写复杂脚本。 **1. Bash基础知识** Bash提供了丰富的命令行交互功能,包括基本的文件操作(如创建、...

    学习bash(第二版本)

    《学习 bash 第二版》,作者:Cameron Newbam & Bill Rosenblatt。 本书教授了如何使用bash的高级命令行特性,如命令历史、命令行编辑和命令完成。

    学习Bash(第二版)

    O'Relly 出版的Bash书,非常不错。

    bash入门学习实例

    **Bash 入门学习实例** Bash,全称是“Bourne-Again SHell”,是Unix和类Unix系统中最常用的命令行解释器。它不仅是一个交互式shell,还是脚本编程语言,广泛用于Linux和macOS系统。这篇教程将通过一系列实例,帮助...

    学习 bash.pdf

    bash非常好的教程,自学很棒

    bash官方手册/Bash Reference Manual

    第一章节是介绍,讲解什么是 Bash 和 shell,以及基本概念定义。第二章节是基本 shell 特性,涵盖了 shell 语法、shell 操作、变量、命令、函数等。 在基本 shell 特性章节中,讲解了 shell 语法,包括 shell 操作...

    学习bash(第三版)_英文版

    总之,《学习Bash》这本书是一部全面而详尽的Bash指南,不仅适合新手入门,也适用于高级用户进一步探索Bash的强大功能。通过本书的学习,读者能够熟练掌握Bash的各种特性和编程技术,从而提高日常工作的效率。

    Bash shell 学习笔记

    ### Bash Shell 学习笔记知识点概览 #### 1. 引言 - **Shell**:作为用户与操作系统之间的桥梁,Shell提供了一种与系统进行交互的方式,支持用户执行命令和编写脚本来自动化任务。 - **Bash**:是Bourne-Again ...

    学习bash(第二版中文)

    本书详细介绍了bash的安装配置使用及编程,还介绍了shell编程

    Bash参考手册.pdf

    Bash参考手册.pdf是Bash shell的官方参考手册,涵盖了Bash shell的所有方面,包括基本语法、变量、命令、函数、文件处理、...通过学习Bash参考手册.pdf,用户可以深入了解Bash shell的所有方面,从基本语法到高级特性。

    学习 bash (第二版)中文版.pdf

    学习 bash (第二版)中文版.pdf O'Reily经典教材

    学习bash 中文第二版

    第二版还加入了一些新命令,增强了安全性,也加入了readline,增强了配置和安装过程,并且增加了附助编程的bash shell调试器。 经过不懈的实践和对实例及问题进行深入的研究后,你会发现《学习bash》对Linux和其他...

    高级BASH脚本学习

    高级BASH脚本学习是一项技能,对于掌握Linux系统和进行自动化操作至关重要。BASH(Bourne Again SHell)是UNIX和Linux系统中最流行的shell之一,几乎所有Linux发行版和大部分UNIX系统都支持BASH。由于其强大的功能和...

    bash高级编程 advanced bash script

    **Bash高级编程详解** Bash(Bourne-Again SHell)是Unix/Linux系统中最常用的命令行解释器,也是脚本编程的强大工具...因此,无论你是初学者还是经验丰富的开发者,深入学习Bash都是一个值得投入的时间和精力的投资。

Global site tag (gtag.js) - Google Analytics