11 认识与学习 BASH

来源:互联网 发布:网络上吃辣条什么意思 编辑:程序博客网 时间:2024/06/05 17:48

shell的概念:

shell程序的功能只是提供用户操作系统的一个接口,因此这个shell程序需要可以调用其他软件才好。 很多命令,包括 man, chmod, chown, vi, fdisk, mkfs 等,这些命令都是独立的应用程序, 但是我们可以透过shell程序 (就是命令行模式) 来操作这些应用程序,让这些应用程序调用内核来运行所需的工作! 也就是说,只要能够操作应用程序的接口都能够称为shell程序。狭义的shell程序指的是命令行方面的软件,包括本章要介绍的 bash 等。 广义的shell程序则包括图形接口的软件!因为图形接口其实也能够操作各种应用程序来调用内核工作! 我们主要还是讨论 bash !


由于 Linux 为 C 程序语言撰写的,很多程序设计师使用 C 来开发软件,因此 C shell 相对的就很热门。 
bash 是 GNU 计划中重要的工具软件之一,目前也是 Linux distributions 的标准 shell 。 bash 主要兼容于 sh ,并且依据一些使用者需求,而加强的 shell 版本。

history命令记录在你的主目录内的 .bash_history。~/.bash_history 记录的是前一次登陆以前所运行过的命令, 而至于这一次登陆所运行的命令都被缓存在内存中,当你成功的注销系统后,该命令记忆才会记录到 .bash_history 当中!

命令别名配置功能: (alias)  e.g.alias lm='ls -al'

为了方便 shell 的操作,其实 bash 已经『内建』了很多命令了,例如上面提到的 cd , 还有例如 umask 等等的命令,都是内建在 bash 当中的呢!

type [-tpa] name
选项与参数:
    :不加任何选项与参数时,type 会显示出 name 是外部命令还是 bash 内建命令
-t :当加入 -t 参数时,type 会将 name 以底下这些字眼显示出他的意义:
       file      :表示为外部命令;
       alias    :表示该命令为命令别名所配置的名称;
       builtin :表示该命令为 bash 内建的命令功能;
-p :如果后面接的 name 为外部命令时,才会显示完整文件名;
-a :会由 PATH 变量定义的路径中,将所有含 name 的命令都列出来,包含 alias

当用户成功在终端机 (tty) 上面登陆后, Linux 就会依据 /etc/passwd 文件的配置一个 shell (默认是 bash),之后就可以依据命令下达方式来操作 shell。


利用 echo 就能够读出变量,只是需要在变量名称前面加上 $ , 或者是以 ${变量} 的方式来取用都可以!在 bash 当中,当一个变量名称尚未被配置时,默认的内容是『空』的。变量内容若有空格符可使用双引号『"』或单引号『'』将变量内容结合起来。

双引号内的特殊字符如 $ 等,可以保有原本的特性。e.g.『var="lang is $LANG"』则『echo $var』可得『lang is en_US』

单引号内的特殊字符则仅为一般字符 (纯文本)。e.g.『var='lang is $LANG'』则『echo $var』可得『lang is $LANG』

可用转义字符『 \ 』将特殊符号(如 [Enter], $, \, 空格符, ' 等)变成一般字符

在一串命令中,还需要藉由其他的命令提供的信息,可以使用反单引号『`命令`』或 『$(命令)』。特别注意,那个 ` 是键盘上方的数字键 1 左边那个按键,而不是单引号! 例如想要取得核心版本的配置:『version=$(uname -r)』再『echo $version』可得『2.6.18-128.el5』。
若变量为扩增变量内容时,则可用 "$变量名称" 或 ${变量} 累加内容,例如:『PATH="$PATH":/home/bin』
若变量需要在其他子程序运行,则需要以 export 来使变量变成环境变量:『export PATH』
取消变量的方法为使用 unset :『unset 变量名称』例如取消 myname 的配置:『unset myname』
注意:
在一串命令中,在 ` 之内的命令将会被先运行,而其运行出来的结果将做为外部的输入信息!e.g. 
ls -l `locate crontab` 先以 locate 将文件名数据都列出来,再以 ls 命令来处理.

envexport 查看目前shell 环境中, 有多少默认的环境变量。

set 查看所有变量 (含环境变量与自定义变量)。 除了环境变量之外, 还会将其他在 bash 内的变量通通显示出来!


echo $RANDOM系统就会主动的随机取出一个介于 0~32767 的数值。e.g.  使用 0~9 之间的数值 declare -i number=$RANDOM*10/32768 ; echo $number


$:此符号是个变量!代表的是『目前这个 Shell 的线程代号』,亦即是所谓的 PID (Process ID)。 e.g.  echo $$   即为shell 的 PID 。
?: 当我们运行某些命令时, 这些命令都会回传一个运行后的代码。一般来说,如果成功的运行该命令, 则会回传一个 0 值,如果运行过程发生错误,就会回传『错误代码』!一般就是以非为 0 的数值来取代。
e.g.12name=VBird
      -bash: 12name=VBird: command not found     <==发生错误了!bash回报有问题
       echo $?
       127                                        <==因为有问题,回传错误代码(非为0)
       # 错误代码回传值依据软件而有不同,我们可以利用这个代码来搜寻错误的原因!
       echo $?
       0
       #因为 "?" 只与『上一个运行命令』有关,所以,我们上一个命令是运行『 echo $? 』,当然没有错误,所以是 0 没错!

较高阶的硬件通常会向下兼容旧有的软件,但较高阶的软件可能无法在旧机器上面安装! 可以在 x86_64 的硬件上安装 i386 的 Linux 操作系统,但是无法在 i686 的硬件上安装 x86_64 的 Linux 操作系统!

环境变量与自定义变量两者之间差异在于『 该变量是否会被子程序所继续引用』,子程序仅会继承父程序的环境变量, 不会继承父程序的自定义变量!所以原本 bash 的自定义变量在进入了子程序后就会消失不见, 一直到离开子程序并回到原本的父程序后,这个变量才会又出现! 即:环境变量=全局变量,自定义变量=局部变量。
原理:当启动一个 shell,操作系统会分配一记忆区块给 shell 使用,此内存的变量可让子程序取用,若在父程序利用 export 功能,可以让自定义变量的内容写到上述的记忆区块当中(环境变量);当加载另一个 shell 时 (亦即启动子程序,而离开原本的父程序了),子 shell 可以将父 shell 的环境变量所在的记忆区块导入自己的环境变量区块当中。

read:读取来自键盘输入的变量。常被用在 shell script 的撰写当中,。
read [-pt] variable
选项与参数:
-p  :后面可以接提示字符!
-t  :后面可以接等待的『秒数』
e.g.
提示使用者 30 秒内输入自己的大名,将该输入字符串作为名为 named 的变量内容
read -p "Please keyin your name: " -t 30 named
Please keyin your name: VBird Tsai   <==注意看,会有提示字符!
echo $named
VBird Tsai        <==输入的数据又变成一个变量的内容了!

declare 或 typeset:声明变量的类型。如果使用 declare 后面并没有接任何参数,那么 bash 就会主动的将所有的变量名称与内容都显示出来,就好像使用 set 一样! 
declare [-aixr] variable
选项与参数:
-a  :将后面名为 variable 的变量定义成为数组 (array) 类型
-i  :将后面名为 variable 的变量定义成为整数数字 (integer) 类型
-x  :用法与 export 一样,就是将后面的 variable 变成环境变量;
-r  :将变量配置成为 readonly 类型,该变量不可被更改内容,也不能 unset

由于在默认的情况底下, bash 对于变量有几个基本的定义:
变量类型默认为『字符串』,所以若不指定变量类型,则 1+2 为一个『字符串』而不是『计算式』。 
bash 环境中的数值运算,默认最多仅能到达整数形态,所以 1/3 结果是 0;

bash 是可以『限制用户的某些系统资源』的,包括可以开启的文件数量, 可以使用的 CPU 时间,可以使用的内存总量等等:
ulimit[-SHacdfltu] [配额]
选项与参数:
-H :hard limit,严格的配置,必定不能超过这个配置的数值;
-S  :soft limit ,警告的配置,可以超过这个配置值,但是若超过则有警告信息。 在配置上,通常 soft 会比 hard 小,举例来说,soft 可配置为 80 而 hard  配置为 100,那么你可以使用到 90 (因为没有超过 100),但介于 80~100 之间时,系统会有警告信息通知你!
-a  :后面不接任何选项与参数,可列出所有的限制额度;
-c  :当某些程序发生错误时,系统可能会将该程序在内存中的信息写成文件(除错用),
      这种文件就被称为核心文件(core file)。此为限制每个核心文件的最大容量。
-f  :此 shell 可以创建的最大文件容量(一般可能配置为 2GB)单位为 Kbytes
-d  :程序可使用的最大断裂内存(segment)容量;
-l  :可用于锁定 (lock) 的内存量
-t  :可使用的最大 CPU 时间 (单位为秒)
-u  :单一用户可以使用的最大程序(process)数量。
e.g.限制用户仅能创建 10MBytes 以下的容量的文件:
ulimit -f 10240
ulimit -a
file size               (blocks, -f) 10240 <==最大量为10240Kbyes,相当10Mbytes
dd if=/dev/zero of=123 bs=1M count=20
File size limit exceeded <==尝试创建 20MB 的文件,结果失败了!

变量内容的删除、取代与替换
变量配置方式说明
${变量#关键词}若变量内容从头开始的数据符合『关键词』,则将符合的最短数据删除
${变量##关键词}若变量内容从头开始的数据符合『关键词』,则将符合的最长数据删除
${变量%关键词}若变量内容从尾向前的数据符合『关键词』,则将符合的最短数据删除
${变量%%关键词}若变量内容从尾向前的数据符合『关键词』,则将符合的最长数据删除
${变量/旧字符串/新字符串}若变量内容符合『旧字符串』则『第一个旧字符串会被新字符串取代』
${变量//旧字符串/新字符串}若变量内容符合『旧字符串』则『全部的旧字符串会被新字符串取代』

历史命令: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 中!

命令运行的顺序

  1. 以相对/绝对路径运行命令,例如『 /bin/ls 』或『 ./ls 』;
  2. 由 alias 找到该命令来运行;
  3. 由 bash 内建的 (builtin) 命令来运行;
  4. 透过 $PATH 这个变量的顺序搜寻到的第一个命令来运行。


bash 的登录与欢迎信息: /etc/issue, /etc/motd
\d 本地端时间的日期;
\l 显示第几个终端机接口;
\m 显示硬件的等级 (i386/i486/i586/i686...);
\n 显示主机的网络名称;
\o 显示 domain name;
\r 操作系统的版本 (相当于 uname -r)
\t 显示本地端时间的时间;
\s 操作系统的名称;
\v 操作系统的版本。
  除了 /etc/issue 之外还有个 /etc/issue.net 呢!这个是提供给 telnet 这个远程登录程序用的。 当我们使用 telnet 连接到主机时,主机的登陆画面就会显示 /etc/issue.net 而不是 /etc/issue!
  至于如果您想要让使用者登陆后取得一些信息,例如您想要让大家都知道的信息, 那么可以将信息加入 /etc/motd 里面去!例如:当登陆后,告诉登陆者, 系统将会在某个固定时间进行维护工作,可以这样做:
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. ^_^

bash 的环境配置文件
系统有一些环境配置文件案的存在,让 bash 在启动时直接读取这些配置文件,以规划好 bash 的操作环境! 而这些配置文件分为全体系统的配置文件以及用户个人偏好配置文件。


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 只会读取这两个配置文件:

  • /etc/profile:这是系统整体的配置,最好不要修改这个文件;
  • ~/.bash_profile 或 ~/.bash_login 或 ~/.profile:属于使用者个人配置,你要改自己的数据,就写入这里!

login shell的配置文件读取流程:

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

~/.bashrc (non-login shell 会读)
取得 non-login shell 时,该 bash 配置文件仅会读取 ~/.bashrc!

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

终端机的环境配置: stty, set
stty [-a]
选项与参数:
-a  :将目前所有的 stty 参数列出来;
bash 默认的组合键给他汇整如下:
组合按键 运行结果
Ctrl + C 终止目前的命令
Ctrl + D 输入结束 (EOF),例如邮件结束的时候;
Ctrl + M 就是 Enter 啦!
Ctrl + S 暂停屏幕的输出
Ctrl + Q 恢复屏幕的输出
Ctrl + U 在提示字符下,将整列命令删除
Ctrl + Z 『暂停』目前的命令

通配符:
* 代表『 0 个到无穷多个』任意字符
? 代表『一定有一个』任意字符
[ ] 同样代表『一定有一个在括号内』的字符(非任意字符)。例如 [abcd] 代表『一定有一个字符, 可能是 a, b, c, d 这四个任何一个』
[ - ] 若有减号在中括号内时,代表『在编码顺序内的所有字符』。例如 [0-9] 代表 0 到 9 之间的所有数字,因为数字的语系编码是连续的!
[^ ] 若中括号内的第一个字符为指数符号 (^) ,那表示『反向选择』,例如 [^abc] 代表 一定有一个字符,只要是非 a, b, c 的其他字符就接受的意思。
特殊符号:
# 批注符号:这个最常被使用在 script 当中,视为说明!在后的数据均不运行
\ 转义符号:将『特殊字符或通配符』还原成一般字符
| 管线 (pipe):分隔两个管线命令的界定;
; 连续命令下达分隔符:连续性命令的界定 (注意!与管线命令并不相同)
~ 用户的主目录
$ 取用变量前导符:亦即是变量之前需要加的变量取代值
& 工作控制 (job control):将命令变成背景下工作
! 逻辑运算意义上的『非』 not 的意思!
/ 目录符号:路径分隔的符号
>, >> 数据流重导向:输出导向,分别是『取代』与『累加』
<, << 数据流重导向:输入导向
' ' 单引号,不具有变量置换的功能
" " 具有变量置换的功能!
` ` 两个『 ` 』中间为可以先运行的命令,亦可使用 $( )
( ) 在中间为子 shell 的起始与结束
{ } 在中间为命令区块的组合!
以上为 bash 环境中常见的特殊符号汇整!理论上,『文件名』尽量不要使用到上述的字符!

数据流重导向
数据流重导向就是将某个命令运行后应该要出现在屏幕上的数据, 传输到其他的地方,例如文件或者是装置 (例如打印机之类的)! 如果我们想要将某些数据储存下来时,很有用!
标准输出指的是『命令运行所回传的正确的信息』,而标准错误输出可理解为『 命令运行失败后,所回传的错误信息』
数据流重导向可以将 standard output (简称 stdout) 与 standard error output (简称 stderr) 分别传送到其他的文件或装置去,而分别传送所用的特殊字符则如下所示:
  • 标准输入  (stdin) :代码为 0 ,使用 < 或 << ;
  • 标准输出  (stdout):代码为 1 ,使用 > 或 >> ;
  • 标准错误输出(stderr):代码为 2 ,使用 2> 或 2>> ;
而如果仅存在 > 时,则代表默认的代码 1 !也就是说:

1> :以覆盖的方法将『正确的数据』输出到指定的文件或装置上;
1>>:以累加的方法将『正确的数据』输出到指定的文件或装置上;
2> :以覆盖的方法将『错误的数据』输出到指定的文件或装置上;
2>>:以累加的方法将『错误的数据』输出到指定的文件或装置上;
注意,『 1>> 』以及『 2>> 』中间是没有空格的!
e.g.将 stdout 与 stderr 分存到不同的文件去:find /home -name .bashrc > list_right 2> list_error

/dev/null 垃圾桶黑洞装置与特殊写法
/dev/null 才可以吃掉任何导向这个装置的信息
将错误的数据丢弃,屏幕上显示正确的数据
find /home -name .bashrc 2> /dev/null
/home/dmtsai/.bashrc  <==只有 stdout 会显示到屏幕上, stderr 被丢弃了

命令的数据全部写入名为 list 的文件中
 find /home -name .bashrc > list 2> list  <==错误
find /home -name .bashrc > list 2>&1     <==正确
find /home -name .bashrc &> list         <==正确
第一行错误的原因是,由于两股数据同时写入一个文件,又没有使用特殊的语法, 此时两股数据可能会交叉写入该文件内,造成次序的错乱。所以虽然最终 list 文件还是会产生,但是里面的数据排列就会怪怪的,而不是原本屏幕上的输出排序。 至于写入同一个文件的特殊语法如上表所示,你可以使用 2>&1 也可以使用 &> ! 

standard input : < 与 <<
将原本需要由键盘输入的数据,改由文件内容来取代


命令运行的判断依据: ; , &&, ||

cmd1 && cmd2

1. 若 cmd1 运行完毕且正确运行($?=0),则开始运行 cmd2。

2. 若 cmd1 运行完毕且为错误 ($?≠0),则 cmd2 不运行。

cmd1 || cmd2 

1. 若 cmd1 运行完毕且正确运行($?=0),则 cmd2 不运行。

2. 若 cmd1 运行完毕且为错误 ($?≠0),则开始运行 cmd2。
Linux 底下的命令都是由左往右运行。由于命令是一个接着一个去运行的,因此,如果真要使用判断, 那么这个 && 与 || 的顺序就不能搞错。一般来说,假设判断式有三个,也就是:
command1 && command2 || command3
而且顺序通常不会变,因为一般来说, command2 与 command3 会放置肯定可以运行成功的命令。

管道命令 (pipe)
在每个管道后面接的第一个数据必定是『命令』!而且这个命令必须要能够接受 standard input 的数据才行,这样的命令才可以是为『管命令』,例如 less, more, head, tail 等都是可以接受 standard input 的管命令啦。至于例如 ls, cp, mv 等就不是管命令了!因为 ls, cp, mv 并不会接受来自 stdin 的数据。 也就是说,管线命令主要有两个比较需要注意的地方:
  • 管线命令仅会处理 standard output,对于 standard error output 会予以忽略
  • 管线命令必须要能够接受来自前一个命令的数据成为 standard input 继续处理才行。
选取命令: cut, grep
cut -d'分隔字符' -f fields <==用于有特定分隔字符
cut -c 字符区间            <==用于排列整齐的信息
选项与参数:
-d  :后面接分隔字符。与 -f 一起使用;
-f  :依据 -d 的分隔字符将一段信息分割成为数段,用 -f 取出第几段的意思;
-c  :以字符 (characters) 的单位取出固定字符区间;

grep [-acinv] [--color=auto] '搜寻字符串' filename
选项与参数:
-a :将 binary 文件以 text 文件的方式搜寻数据
-c :计算找到 '搜寻字符串' 的次数
-i :忽略大小写的不同,所以大小写视为相同
-n :顺便输出行号
-v :反向选择,亦即显示出没有 '搜寻字符串' 内容的那一行!
--color=auto :可以将找到的关键词部分加上颜色的显示喔!

排序命令: sort, wc, uniq
sort [-fbMnrtuk] [file or stdin]
选项与参数:
-f  :忽略大小写的差异,例如 A 与 a 视为编码相同;
-b  :忽略最前面的空格符部分;
-M  :以月份的名字来排序,例如 JAN, DEC 等等的排序方法;
-n  :使用『纯数字』进行排序(默认是以文字型态来排序的);
-r  :反向排序;
-u  :就是 uniq ,相同的数据中,仅出现一行代表;
-t  :分隔符,默认是用 [tab] 键来分隔;
-k  :以那个区间 (field) 来进行排序的意思

uniq [-ic]
选项与参数:
-i  :忽略大小写字符的不同;

-c  :进行计数

e.g.

使用 last 将账号列出,仅取出账号栏,进行排序后仅取出一位;
 last | cut -d ' ' -f 1 | sort | uniq
如果我还想要知道每个人的登陆总次数呢?
 last | cut -d ' ' -f 1 | sort | uniq -c

wc
如果我想要知道 /etc/man.config 这个文件里面有多少字?多少行?多少字符的话, 可以怎么做呢?其实可以利用 wc 这个命令来达成!他可以帮我们计算输出的信息的整体数据!
wc [-lwm]
选项与参数:
-l  :仅列出行;
-w  :仅列出多少字(英文单字);
-m  :多少字符;
e.g.
那个 /etc/man.config 里面到底有多少相关字、行、字符数?
cat /etc/man.config | wc 
    141     722    4617

# 输出的三个数字中,分别代表: 『行、字数、字符数』

使用 last 可以输出登陆者,但是 last 最后两行并非账号内容, 那么请问,我该如何以一行命令串取得这个月份登陆系统的总人次?
 last | grep [a-zA-Z] | grep -v 'wtmp' | wc -l 
# 由于 last 会输出空白行与 wtmp 字样在最底下两行,因此,我利用
# grep 取出非空白行,以及去除 wtmp 那一行,在计算行数,就能够了解!

当你要知道目前你的账号文件中有多少个账号

 cat /etc/passwd | wc -l 


双向重导向: tee
tee 会同时将数据流分送到文件去与屏幕 (screen);而输出到屏幕的,其实就是 stdout ,可以让下个命令继续处理喔!
 tee [-a] file
选项与参数:
-a  :以累加 (append) 的方式,将数据加入 file 当中!
last | tee last.list | cut -d " " -f 1
# 这个范例可以让我们将 last 的输出存一份到 last.list 文件中;
 ls -l /home | tee ~/homefile | more
# 这个范例则是将 ls 的数据存一份到 ~/homefile ,同时屏幕也有输出信息!
 ls -l / | tee -a ~/homefile | more
# 要注意! tee 后接的文件会被覆盖,若加上 -a 这个选项则能将信息累加。
tee 可以让 standard output 转存一份到文件内并将同样的数据继续送到屏幕去处理! 这样除了可以让我们同时分析一份数据并记录下来之外,还可以作为处理一份数据的中间缓存盘记录之用! 

字符转换命令: tr, col, join, paste, expand
tr可以用来删除一段信息当中的文字,或者是进行文字信息的替换!
 tr [-ds] SET1 ...
选项与参数:
-d  :删除信息当中的 SET1 这个字符串;
-s  :取代掉重复的字符!
e.g.将 last 输出的信息中,所有的小写变成大写字符:
 last | tr '[a-z]' '[A-Z]'
# 事实上,没有加上单引号也是可以运行的,如:『 last | tr [a-z] [A-Z] 』
将 /etc/passwd 输出的信息中,将冒号 (:) 删除
 cat /etc/passwd | tr -d ':'

col [-xb]
选项与参数:
-x  :将 tab 键转换成对等的空格键
-b  :在文字内有反斜杠 (/) 时,仅保留反斜杠最后接的那个字符
e.g.利用 cat -A 显示出所有特殊按键,最后以 col 将 [tab] 转成空白
cat -A /etc/man.config  <==此时会看到很多 ^I 的符号,那就是 tab
cat /etc/man.config | col -x | cat -A | more
#如此一来, [tab] 按键会被取代成为空格键,输出就美观多了!

join [-ti12] file1 file2
选项与参数:
-t  :join 默认以空格符分隔数据,并且比对『第一个字段』的数据,
      如果两个文件相同,则将两笔数据联成一行,且第一个字段放在第一个!
-i  :忽略大小写的差异;
-1  :这个是数字的 1 ,代表『第一个文件要用那个字段来分析』的意思;
-2  :代表『第二个文件要用那个字段来分析』的意思。

 paste [-d] file1 file2
选项与参数:
-d  :后面可以接分隔字符。默认是以 [tab] 来分隔的!
-   :如果 file 部分写成 - ,表示来自 standard input 的数据的意思。

expand [-t] file
选项与参数:
-t  :后面可以接数字。一般来说,一个 tab 按键可以用 8 个空格键取代。
      我们也可以自行定义一个 [tab] 按键代表多少个字符呢!

分割命令: split
split[-bl] file PREFIX
选项与参数:
-b  :后面可接欲分割成的文件大小,可加单位,例如 b, k, m 等;
-l  :以行数来进行分割。
PREFIX :代表前导符的意思,可作为分割文件的前导文字。

参数代换: xargs
xargs [-0epn] command
选项与参数:
-0  :如果输入的 stdin 含有特殊字符,例如 `, \, 空格键等等字符时,这个 -0 参数
      可以将他还原成一般字符。这个参数可以用于特殊状态喔!
-e  :这个是 EOF (end of file) 的意思。后面可以接一个字符串,当 xargs 分析到
      这个字符串时,就会停止继续工作!
-p  :在运行每个命令的 argument 时,都会询问使用者的意思;
-n  :后面接次数,每次 command 命令运行时,要使用几个参数的意思。看范例三。
当 xargs 后面没有接任何的命令时,默认是以 echo 来进行输出喔!

总结:
由于核心在内存中是受保护的区块,因此我们必须要透过『 Shell 』将我们输入的命令与 Kernel 沟通,好让 Kernel 可以控制硬件来正确无误的工作

set 可以观察目前 bash 环境下的所有变量;

bash 的配置文件主要分为 login shell 与 non-login shell。login shell 主要读取 /etc/profile 与 ~/.bash_profile, non-login shell 则仅读取 ~/.bashrc

介绍的管线命令主要有:cut, grep, sort, wc, uniq, tee, tr, col, join, paste, expand, split, xargs 等。

原创粉丝点击