linux shell 学习笔记--内部命令学习

时间:2021-12-05 00:25:51
.基本命令
新手必须要掌握的初级命令
ls
基本的列出所有文件的命令.但是往往就是因为这个命令太简单,所以我们总是低估它.比如
,用 -R 选项,这是递归选项,ls 将会以目录树的形式列出所有文件, 另一个很有用的选项
是 -S ,将会按照文件尺寸列出所有文件, -t, 将会按照修改时间来列出文件,-i 选项会显
示文件的 inode
cat, tac
cat, 是单词 concatenate 的缩写, 把文件的内容输出到stdout. 当与重定向操作符 (> 或
>>)结合使用时, 一般都是用来将多个文件连接起来.
rev
把每一行中的内容反转, 并且输出到 stdout 上. 这个命令与 tac 命令的效果是不同的, 因
为它并不反转行序, 而是把每行的内容反转.
cp
这是文件拷贝命令. cp file1 file2 把 file1 拷贝到 file2, 如果存在 file2 的话,那
file2 将被覆盖 (见 Example -).
注意: 特别有用的选项就是 -a 归档选项 (为了copy 一个完整的目录树), -u 是更新选
项, 和 -r 与 -R 递归选项.
mv
这是文件移动命令. 它等价于 cp 与 rm 命令的组合. 它可以把多个文件移动到目录中,甚
至将目录重命名. 想查看 mv 在脚本中使用的例子, 见 Example - 和 Example A-.
注意: 当使用非交互脚本时,可以使用 mv 的-f (强制) 选项来避免用户的输入.
当一个目录被移动到一个已存在的目录时,那么它将成为目标目录的子目录.
rm
删除(清除)一个或多个文件. -f 选项将强制删除文件,即使这个文件是只读的.并且可以
用来避免用户输入(在非交互脚本中使用).
rmdir
删除目录. 但是只有这个目录中没有文件 -- 当然会包含不可见的点文件 [] -- 的
时候这个命令才会成功.
mkdir
生成目录, 创建一个空目录. 比如, mkdir -p project/programs/December 将会创建出
这个指定的目录, 即使project 目录和programs 目录都不存在. -p 选项将会自动产生必要
的父目录, 这样也就同时创建了多个目录.
chmod
修改一个现存文件的属性 (见 Example -).
chmod +x filename
# 使得文件filename 对所有用户都可执行.
chattr
修改文件属性. 这个命令与上边的 chmod 命令相类似, 但是有不同的选项和不同的调用语
法, 并且这个命令只能工作在ext2 文件系统中.
chattr 命令的一个特别有趣的选项是i. chattr +i filename 将使得这个文件被标记为
永远不变. 这个文件将不能被修改, 连接, 或删除, 即使是root 也不行. 这个文件属性只
能被 root 设置和删除. 类似的, a 选项将会把文件标记为只能追加数据.
ln
创建文件链接, 前提是这个文件是存在的. "链接" 就是一个文件的引用, 也就是这个文
件的另一个名字. ln 命令允许对同一个文件引用多个链接,并且是避免混淆的一个很好的
方法 (见 Example -).
ln 对于文件来说只不过是创建了一个引用, 一个指针而已, 因为创建出来的连接文件只有
几个字节.
绝大多数使用 ln 命令时使用是 -s 选项, 可以称为符号链接, 或软链接.使用 -s 选项的
一个优点是它可以穿越文件系统来链接目录.
关于使用这个命令的语法还是有点小技巧的. 比如: ln -s oldfile newfile 将对老文件
产生一个新的文件链接.
注意: 如果之前就存在newfile 的话, 那么将会产生一个错误消息.
使用链接中的哪种类型?
就像 John Macdonald 解释的那样:
不论是那种类型的链接, 都提供了一种双向引用的手段 -- 也就是说, 不管你用文件
的那个名字对文件内容进行修改, 你修改的效果都即会反映到原始名字的文件, 也会
反映到链接名字的文件.当你工作在更高层次的时候, 才会发生软硬链接的不同. 硬链
接的优点是, 原始文件与链接文件之间是相互独立的 -- 如果你删除或者重命名老文
件, 那么这种操作将不会影响硬链接的文件, 硬链接的文件讲还是原来文件的内容.
然而如果你使用软链接的, 当你把老文件删除或重命名后, 软链接将再也找不到原来
文件的内容了. 而软链接的优点是它可以跨越文件系统(因为它只不过是文件名的一个
引用, 而并不是真正的数据). 与硬链接的另一个不同是, 一个符号链接可以指向一个
目录.
链接给出了一种可以用多个名字来调用脚本的能力(当然这也适用于任何可执行的类型),
并且脚本的行为将依赖于脚本是如何被调用的.
man, info
These 这两个命令用来查看系统命令或安装工具的手册和信息.当两者都可用时, info 页
一般比 man 也会包含更多的细节描述.
注意事项:
[] Dotfiles 就是文件名以"."开头的文件, 比如 ~/.Xdefaults. 这样的文件在一般的 l
s 命令使用中将不会被显示出来 (当然 ls -a 将会显示它们), 并且它们也不会被一
个意外的 rm -rf *删除. 在用户的home 目录中,Dotfiles 一般被用来当作安装和配置
文件.
复杂命令
-------------
更高级的用户命令
更高级的用户命令
find
-exec COMMAND \;
在每一个 find 匹配到的文件执行 COMMAND 命令. 命令序列以 ; 结束( ";" 是转义符 以
保证 shell 传递到find 命令中的字符不会被解释为其他的特殊字符).
bash$ find ~/ -name '*.txt'
/home/bozo/.kde/share/apps/karm/karmdata.txt
/home/bozo/misc/irmeyc.txt
/home/bozo/test-scripts/.txt
如果 COMMAND 中包含 {}, 那么 find 命令将会用所有匹配文件的路径名来替换 "{}" .
find ~/ -name 'core*' -exec rm {} \;
# 从用户的 home 目录中删除所有的 core dump 文件.
xargs
这是给命令传递参数的一个过滤器, 也是组合多个命令的一个工具.它把一个数据流分割为
一些足够小的块, 以方便过滤器和命令进行处理. 由此这个命令也是后置引用的一个强有
力的替换. 在一般使用过多参数的命令替换失败的时候,用xargs 来替换它一般都能成功.
[] 通常情况下, xargs 从管道或者stdin 中读取数据, 但是它也能够从文件的输出中读取
数据.
xargs 的默认命令是 echo. 这意味着通过管道传递给xargs 的输入将会包含换行和空白, 不
过通过 xargs 的处理, 换行和空白将被空格取代.
expr
通用求值表达式: 通过给定的操作(参数必须以空格分开)连接参数,并对参数求值.可以使
算术操作, 比较操作, 字符串操作或者是逻辑操作.
expr +
返回
expr %
返回
expr /
返回错误消息, expr: division by zero
不允许非法的算术操作.
expr \*
返回
在算术表达式 expr 中使用乘法操作时, 乘法符号必须被转义.
y=`expr $y + `
substr: 从指定位置提取指定长度的字串.
b=`expr substr $a `
echo "Substring of \"$a\", starting at position 2,\
and chars long is \"$b\"."
时间/日期命令
date
直接调用, date 就会打印日期和时间到 stdout 上. 这个命令有趣的地方在于它的格式化
和分析选项上.
zdump
查看特定时区的当前时间.
bash$ zdump EST
EST Tue Sep :: EST
time
输出统计出来的命令执行的时间.
time ls -l / 给出的输出大概是如下格式:
.00user .01system :.05elapsed %CPU (0avgtext+0avgdata 0maxresident)k
0inputs+0outputs (149major+27minor)pagefaults 0swaps
touch
这是一个用来更新文件被存取或修改的时间的工具,这个时间可以是当前系统的时间,也可
以是指定的时间, 这个命令也用来产生一个新文件.命令 touch zzz 将产生一个以zzz 为名
字的 字节长度文件, 当然前提是zzz 文件不存在. 为了存储时间信息, 就需要一个时间戳
为空的文件, 比如当你想跟踪一个工程的修改时间的时候,这就非常有用了.
at
at 命令是一个作业控制命令, 用来在指定时间执行给定的命令集合.它有点像 cron 命令,
然而, at 命令主要还是用来执行那种一次性执行的命令集合.
at 2pm January 将会提示让你输入需要在这个时间你要执行的命令序列. 这些命令应
该是可以和 shell 脚本兼容的,因为, 实际上, 在一个可执行的脚本中, 用户每次只能敲一
行. 输入以 Ctl-D 结束.
你可以使用-f 选项或者使用 (<)重定向操作符, 来让 at 命令从一个文件中读取命令
集合. 这个文件其实就一个可执行的的脚本, 虽然它是一个不可交互的脚本. 在文件中包
含一个 run-parts 命令, 对于执行一套不同的脚本来说是非常聪明的做法.
bash$ at : am Friday < at-jobs.list
job at -- :
batch
batch 作业控制命令与 at 命令的行为很相像, 但 batch 命令被用来在系统平均载量降到
0.8 以下时执行一次性的任务. 与 at 命令相似的是, 它也可以使用 -f 选项来从文件中
读取命令.
cal
从 stdout 中输出一个格式比较整齐的日历. 也可以指定年和月来显示那个月的日历.
sleep
这个命令与一个等待循环的效果一样. 你可以指定需要暂停的秒数, 这段时间将什么都不
干.当一个后台运行的进程需要偶尔检测一个事件时,这个功能很有用. 也可用于计时. 参
见 Example -.
sleep # Pauses seconds.
注意: sleep 命令默认为秒, 但是你也可以指定天数, 小时数或分钟数.
sleep h # Pauses hours!
注意: 如果你想每隔一段时间来运行一个命令的话, 那么 watch 命令将比 sleep 命令好
得多.
usleep
Microsleep 睡眠微秒( "u" 会被希腊人读成 "mu", 或者是 micro- 前缀). 与上边的 sl
eep 命令作用相同, 但这个命令是以百万分之一秒为单位的. 当需要精确计时, 或者需要
非常频繁的监控一个正在运行的进程的时候, 这个命令非常有用.
usleep # 暂停 microseconds.
hwclock, clock
hwclock 命令可以存取或调整硬件时钟. 这个命令的一些选项需要 root 权限. 在系统启
动的时候, /etc/rc.d/rc.sysinit 这个启动文件,会使用 hwclock 来从硬件时钟中读取
并设置系统时间.clock at bootup.
clock 命令与 hwclock 命令完全相同. 文本处理命令
处理文本和文本文件的命令
sort
文件排序, 通常用在管道中当过滤器来使用. 这个命令可以依据指定的关键字或指定的字
符位置, 对文件行进行排序. 使用 -m 选项, 它将会合并预排序的输入文件. 想了解这个
命令的全部参数请参考这个命令的 info 页. 见 Example -, Example -, 和
Example A-.
tsort
拓扑排序 ,读取以空格分隔的有序对, 并且依靠输入模式进行排序.
uniq
这个过滤器将会删除一个已排序文件中的重复行.这个命令经常出现在 sort 命令的管道后
边.
cat list- list- list- | sort | uniq > final.list
# 将3 个文件连接起来,
# 将它们排序,
# 删除其中重复的行,
# 最后将结果重定向到一个文件中.
-c 选项的意思是在输出行前面加上每行在输入文件中出现的次数.
expand, unexpand
expand 将会把每个tab 转化为一个空格.这个命令经常用在管道中.
unexpand 将会把每个空格转化为一个tab.效果与 expand 相反.
cut
一个从文件中提取特定域的工具. 这个命令与 awk 中使用的 print $N 命令很相似, 但是
更受限. 在脚本中使用cut 命令会比使用 awk 命令来得容易一些. 最重要的选项就是 -d
(字段定界符) 和 -f (域分隔符) 选项.
使用 cut 来获得所有mount 上的文件系统的列表:
cut -d ' ' -f1, /etc/mtab
使用 cut 命令列出 OS 和 kernel 的版本:
uname -a | cut -d" " -f1,,,
paste
将多个文件,以每个文件一列的形式合并到一个文件中, 合并后的文件没列就是原来的一个
文件.对于创建系统log 文件来说, 使用 cut 命令与 paste 命令相结合是非常有用的.
join
这个命令与 paste 命令属于同类命令, 但是它能够完成某些特殊的目地. 这个强力工具能
够以一种特殊的形式来合并 个文件, 这种特殊的形式本质上就是一个关联数据库的简单版
本.
join 命令只能够操作2 个文件, 它可以将那些具有特定标记域(通常是一个数字标签)的行
合并起来, 并且将结果输出到stdout. 被加入的文件应该事先根据标记域进行排序以便于
能够正确的匹配.
head
将一个文件的头打印到 stdout 上 ( 默认为10 行, 可以自己修改 ). 这个命令也有一些有趣
的选项.
grep
使用 正则表达式的一个多用途文本搜索工具. 这个命令本来是 ed 行编辑器中的一个命
令/过滤器: g/re/p -- global - regular expression - print.
grep pattern [file...]
在文件中搜索所有 pattern 出现的位置, pattern 既可以是要搜索的字符串,也可以是一
个正则表达式.
egrep - 扩展的 grep - 这个命令与 grep -E 等价. 这个命令用起来有些不同, 由于正
则表达式扩展, 将会使得搜索更具灵活性.
fgrep - 快速的 grep - 这个命令与 grep -F 等价. 这是一种按照字符串字面意思进行
的搜索(即不允许使用正则表达式), 这样有时候会使搜索变得容易一些.
sed, awk
这个两个命令都是独立的脚本语言, 尤其适合分析文本文件和命令输出. 既可以单独使用,
也可以结合管道和在 shell 脚本中使用.
sed
非交互式的 "流编辑器", 在批量模式下, 允许使用许多 ex 命令.你会发现它在shell 脚本
中非常有用.
awk
可编程的文件提取器和文件格式化工具, 在结构化的文本文件中,处理或提取特定域(特定
列)具有非常好的表现.它的语法与 C 语言很类似.
wc
wc 可以统计文件或 I/O 流中的单词数量.
bash $ wc /usr/share/doc/sed-4.1./README
README
[ lines words characters]
wc -w 统计单词数量.
wc -l 统计行数量.
wc -c 统计字节数量.
wc -m 统计字符数量.
wc -L 给出文件中最长行的长度.
tr
字符转换过滤器.
注意: 必须使用引用或中括号, 这样做才是合理的. 引用可以阻止 shell 重新解释出现在
tr 命令序列中的特殊字符.中括号应该被引用起来防止被shell 扩展.
无论 tr "A-Z" "*" <filename 还是 tr A-Z \* <filename 都可以将 filename 中的大
写字符修改为星号(写到 stdout).但是在某些系统上可能就不能正常工作了, 而 tr A-Z '
[**]' 在任何系统上都可以正常工作.
fold
将输入按照指定宽度进行折行. 这里有一个非常有用的选项 -s ,这个选项可以使用空格进
行断行.(译者: 事实上只有外文才需要使用空格断行, 中文是不需要的) (参见 Example
- 和 Example A-).
fmt
一个简单的文件格式器, 通常用在管道中, 将一个比较长的文本行输出进行折行.
col
这个命令用来滤除标准输入的反向换行符号. 这个工具还可以将空白用等价的 tab 来替
换. col 工具最主要的应用还是从特定的文本处理工具中过滤输出, 比如 groff 和 tbl.
(译者: 主要用来将man 页转化为文本)
column
列格式化工具. 这个过滤工具将会将列类型的文本转化为"易于打印"的表格式进行输出,
通过在合适的位置插入 tab.
colrm
列删除过滤器. 这个工具将会从文件中删除指定的列(列中的字符串)并且写到文件中, 如
果指定的列不存在,那么就回到 stdout. colrm <filename 将会在filename 文件中对
每行删除第 到第4 列之间的所有字符.
注意: 如果这个文件包含tab 和不可打印字符, 那将会引起不可预期的行为. 在这种情况下
, 应该通过管道的手段使用 expand 和 unexpand 命令来预处理 colrm.
nl
计算行号过滤器. nl filename 将会在 stdout 中列出文件的所有内容, 但是会在每个非
空行的前面加上连续的行号. 如果没有 filename 参数, 那么就操作 stdin.
nl 命令的输出与 cat -n 非常相似, 然而, 默认情况下 nl 不会列出空行.
pr
格式化打印过滤器. 这个命令会将文件(或stdout)分页, 将它们分成合适的小块以便于硬
拷贝打印或者在屏幕上浏览.使用这个命令的不同的参数可以完成好多任务, 比如对行和列
的操作,加入行, 设置页边, 计算行号, 添加页眉, 合并文件等等. pr 命令集合了许多命
令的功能, 比如 nl, paste, fold, column, 和 expand.
pr -o --width= fileZZZ | more 这个命令对fileZZZ 进行了比较好的分页,并且打印
到屏幕上.文件的缩进被设置为5, 总宽度设置为65.
一个特定的使用选项 -d, 强制隔行打印 (与 sed -G 效果相同).
gettext
GNU gettext 包是专门用来将程序的输出翻译或者本地化为不同国家语言的工具集.在最开
始的时候仅仅支持 C 语言, 现在已经支持了相当数量的其它程序语言和脚本语言.
要想查看 gettext 程序如何在 shell 脚本中工作. 参见 info 页.
msgfmt
一个产生2 进制消息目录的程序. 这个命令主要用来本地化.
iconv
一个可以将文件转化为不同编码格式(字符集)的工具. 这个命令主要用来本地化.
# 将字符符串由 UTF- 格式转换为 UTF- 并且打印到 BookList 中
function write_utf8_string {
STRING=$
BOOKLIST=$
echo -n "$STRING" | iconv -f UTF8 -t UTF16 | cut -b - | tr -d \\n >> "$BOOKLIST"
} # 来自于 Peter Knowles' "booklistgen.sh" 脚本
#+ 目的是把文件转换为 Sony Librie 格式.
# (http://booklistgensh.peterknowles.com)
recode
可以认为这个命令时上边 iconv 命令的一个空想家版本. 这个非常灵活的并可以把整个文
件都转换为不同编码格式的工具并不是 Linux 标准安装的一部分.
TeX, gs
TeX 和 Postscript 都是文本标记语言, 用来对打印和格式化的视频显示进行预拷贝.
TeX 是 Donald Knuth 精心制作的排版系统. 通常情况下, 通过编写脚本的手段来把所有
的选项和参数封装起来一起传到标记语言中是一件很方便的事情.
Ghostscript (gs) 是一个遵循 GPL 的Postscript 解释器.
enscript
将纯文本文件转换为 PostScript 的工具
比如, enscript filename.txt -p filename.ps 产生一个 PostScript 输出文件
groff, tbl, eqn
另一种文本标记和显示格式化语言是 groff. 这是一个对传统 UNIX roff/troff 显示和排
版包的 GNU 增强版本.Man 页使用的就是 groff.
tbl 表处理工具可以认为是 groff 的一部分, 它的功能就是将表标记转化到 groff
命令中.
eqn 等式处理工具也是 groff 的一部分, 它的功能是将等式标记转化到 groff 命令中.
文件与归档命令
归档命令
tar
标准的 UNIX 归档工具. [] 起初这只是一个磁带 归档 程序, 而现在这个工具已经被开
发为通用打包程序, 它能够处理所有设备的所有类型的归档文件, 包括磁带设备, 正常文
件, 甚至是 stdout (参见Example -). GNU 的tar 工具现在可以接受不同种类的压缩过
滤器, 比如tar czvf archive_name.tar.gz *, 并且可以递归的处理归档文件, 还可以用
gzip 压缩目录下的所有文件, 除了当前目录下($PWD)的点文件 . []
一些有用的 tar 命令选项:
. -c 创建 (一个新的归档文件)
. -x 解压文件 (从存在的归档文件中)
. --delete 删除文件 (从存在的归档文件中)
注意: 这个选项不能用于磁带类型设备.
. -r 将文件添加到现存的归档文件的尾部
. -A 将 tar 文件添加到现存的归档文件的尾部
. -t 列出现存的归档文件中包含的内容
. -u 更新归档文件
. -d 使用指定的文件系统比较归档文件
. -z 用 gzip 压缩归档文件
(压缩还是解压, 依赖于是否组合了 -c 或 -x)选项
. -j 用 bzip2 压缩归档文件
注意: 如果想从损坏的用 gzip 压缩过的 tar 文件中取得数据, 那将是很困难的. 所有当
我们归档重要的文件的时候, 一定要保留多个备份.
shar
Shell 归档工具. 存在于 shell 归档文件中的所有文件都是未经压缩的, 并且本质上是一
个 shell 脚本,以 #!/bin/sh 开头, 并且包含所有必要的解档命令. Shar 归档文件至今
还在 Internet 新闻组中使用, 否则的话 shar 早就被 tar/gzip 所取代了. unshar 命令
用来解档 shar 归档文件.
ar
创建和操作归档文件的工具, 主要在对2 进制目标文件打包成库时才会用到.
rpm
Red Hat 包管理器, 或者说 rpm 工具提供了一种对源文件或2 进制文件进行打包的方法.
除此之外, 它还包括安装命令, 并且还检查包的完整性.
一个简单的 rpm -i package_name.rpm 命令对于安装一个包来说就足够了, 虽然这个命
令还有好多其它的选项.
注意: rpm -qf 列出一个文件属于那个包.
bash$ rpm -qf /bin/ls
coreutils-5.2.-
注意: rpm -qa 将会列出给定系统上所有安装了的 rpm 包. rpm -qa package_name 命令
将会列出于给定名字匹配的包.
bash$ rpm -qa
redhat-logos-1.1.-
glibc-2.2.-
cracklib-2.7-
dosfstools-2.7-
gdbm-1.8.-
ksymoops-2.4.-
mktemp-1.5-
perl-5.6.-
reiserfs-utils-.x.0j-
...
bash$ rpm -qa docbook-utils
docbook-utils-0.6.-
bash$ rpm -qa docbook | grep docbook
docbook-dtd31-sgml-1.0-
docbook-style-dsssl-1.64-
docbook-dtd30-sgml-1.0-
docbook-dtd40-sgml-1.0-
docbook-utils-pdf-0.6.-
docbook-dtd41-sgml-1.0-
docbook-utils-0.6.-
cpio
这个特殊的归档拷贝命令(拷贝输入和输出)现在已经很少能见到了, 因为它已经被 tar/gz
ip 所替代了.现在这个命令只在一些比较特殊的地方还在使用,比如拷贝一个目录树.
rpm2cpio
这个命令可以从 rpm 归档文件中解出一个 cpio 归档文件.
压缩命令
gzip
标准的 GNU/UNIX 压缩工具, 取代了比较差的 compress 命令. 相应的解压命令是gunzip,
gzip -d 是等价的.
zcat 过滤器可以将一个 gzip 文件解压到 stdout, 所以尽可能的使用管道和重定向. 这
个命令事实上就是一个可以工作于压缩文件(包括一些的使用老的 compress 工具压缩的文
件)的 cat 命令. zcat 命令等价于 gzip -dc.
注意: 在某些商业的 UNIX 系统上, zcat 与 uncompress -c 等价, 并且不能工作于
gzip 文件.
bzip2
用来压缩的一个可选的工具, 通常比 gzip 命令压缩率更高(所以更慢), 适用于比较大的
文件. 相应的解压命令是 bunzip2.
注意: 新版本的 tar 命令已经直接支持 bzip2 了.
compress, uncompress
这是一个老的, 私有的压缩工具, 一般的商业 UNIX 发行版都会有这个工具. 更有效率的
gzip 工具早就把这个工具替换掉了. Linux 发行版一般也会包含一个兼容的 compress 命
令, 虽然 gunzip 也可以加压用 compress 工具压缩的文件.
注意: znew 命令可以将 compress 压缩的文件转换为 gzip 压缩的文件.
sq
另一种压缩工具, 一个只能工作于排过序的 ASCII 单词列表的过滤器.这个命令使用过滤
器标准的调用语法, sq < input-file > output-file. 速度很快, 但是效率远不及
gzip. 相应的解压命令为 unsq, 调用方法与 sq 相同.
注意: sq 的输出可以通过管道传递给 gzip 以便于进一步的压缩.
zip, unzip
跨平台的文件归档和压缩工具, 与 DOS 下的 pkzip.exe 兼容. zip 归档文件看起来在互
联网上比 tar 包更流行.
unarc, unarj, unrar
这些 Linux 工具可以用来解档那些用 DOS 下的 arc.exe, arj.exe, 和 rar.exe 程序进
行归档的文件.
文件信息
file
确定文件类型的工具. 命令 file file-name 将会用 ascii 文本或数据的形式返回
file-name 文件的详细描述. 这个命令会使用 /usr/share/magic, /etc/magic, 或
/usr/lib/magic 中定义的魔法数字 来标识包含某种魔法数字的文件, 上边所举出的这
3个文件需要依赖于具体的 Linux/UNIX 发行版.
-f 选项将会让 file 命令运行于批处理模式, 也就是说它会分析 -f 后边所指定的文件,
从中读取需要处理的文件列表, 然后依次执行 file 命令. -z 选项, 当对压缩过的目标文
件使用时, 将会强制分析压缩的文件类型.
bash$ file test.tar.gz
test.tar.gz: gzip compressed data, deflated, last modified: Sun Sep :: , os:
Unix
bash file -z test.tar.gz
test.tar.gz: GNU tar archive (gzip compressed data, deflated, last modified: Sun Sep
:: , os: Unix)
which
which command-xxx 将会给出 "command-xxx" 的完整路径. 当你想在系统中准确定位一个
特定的命令或工具的时候, 这个命令就非常有用了.
$bash which rm
/usr/bin/rm
whereis
与上边的 which 很相似, whereis command-xxx 不只会给出 "command-xxx" 的完整路径,
而且还会给出这个命令的 man 页的完整路径.
$bash whereis rm
rm: /bin/rm /usr/share/man/man1/rm..bz2
whatis
whatis filexxx 将会在 whatis 数据库中查询 "filexxx". 当你想确认系统命令和重要的
配置文件的时候, 这个命令就非常重要了. 可以把这个命令认为是一个简单的 man 命令.
$bash whatis whatis
whatis () - search the whatis database for complete words
vdir
显示详细的目录列表. 与 ls -l 的效果类似.
这是一个 GNU fileutils.
bash$ vdir
total
-rw-r--r-- bozo bozo Jul : data1.xrolo
-rw-r--r-- bozo bozo May : data1.xrolo.bak
-rw-r--r-- bozo bozo Dec employment.xrolo
bash ls -l
total
-rw-r--r-- bozo bozo Jul : data1.xrolo
-rw-r--r-- bozo bozo May : data1.xrolo.bak
-rw-r--r-- bozo bozo Dec employment.xrolo
locate, slocate
locate 命令将会在预先建立好的档案数据库中查询文件. slocate 命令是 locate 的安全
版本( locate 命令可能已经被关联到 slocate 命令上了).
$bash locate hickson
/usr/lib/xephem/catalogs/hickson.edb
readlink
显示符号连接所指向的文件.
strings
使用 strings 命令在二进制或数据文件中找出可打印字符. 它将在目标文件中列出所有找
到的可打印字符的序列. 这个命令对于想进行快速查找一个 n 个字符的打印检查来说是很
方便的,也可以用来检查一个未知格式的图片文件 (strings image-file | more 可能会搜
索出像 JFIF 这样的字符串, 那么这就意味着这个文件是一个 jpeg 格式的图片文件).
在脚本中, 你可能会使用 grep 或 sed 命令来分析 strings 命令的输出.
比较命令
diff, patch
diff: 一个非常灵活的文件比较工具. 这个工具将会以一行接一行的形式来比较目标文件.
在某些应用中, 比如说比较单词词典, 在通过管道将结果传递给 diff 命令之前, 使用诸
如 sort 和 uniq 命令来对文件进行过滤将是非常有用的.diff file- file- 将会输出
2个文件不同的行,并会通过符号标识出每个不同行所属的文件.
diff 命令的 --side-by-side 选项将会把2 个比较中的文件全部输出, 按照左右分隔的形
式, 并会把不同的行标记出来. -c 和 -u 选项也会使得 diff 命令的输出变得容易解释
一些.
还有一些 diff 命令的变种, 比如 sdiff, wdiff, xdiff, 和 mgdiff.
注意: 如果比较的两个文件是完全一样的话, 那么 diff 命令会返回 作为退出码, 如果
不同的话就返回 作为退出码. 这样 diff 命令就可以用在 shell 脚本的测试结构
中了. (见下边)
diff 命令的一个重要用法就是产生区别文件, 这个文件将用作 patch 命令的 -e 选项的
参数, -e 选项接受 ed 或 ex 脚本.
patch: 灵活的版本工具.给出一个用 diff 命令产生的区别文件, patch 命令可以将一个
老版本的包更新为一个新版本的包. 因为你发布一个小的区别文件远比重新发布一个大的
软件包来的容易得多.对于频繁更新的 Linux 内核来说, 使用补丁包的形式来发布将是一
种很好的方法.
patch -p1 <patch-file
# 在'patch-file'中取得所有的修改列表
# 然后把它们应用于其中索引到的文件上.
# 那么这个包就被更新为新版本了.
diff3
一个 diff 命令的扩展版本, 可以同时比较3 个文件. 如果成功执行那么这个命令就返回0,
但是不幸的是这个命令不给出比较结果的信息.
sdiff
比较 和/或编辑 个文件, 将它们合并到一个输出文件中. 因为这个命令的交互特性, 所
以在脚本中很少使用这个命令.
cmp
cmp 命令是上边 diff 命令的一个简单版本. diff 命令会报告两个文件的不同之处, 而
cmp 命令仅仅指出那些位置有不同, 而不会显示不同的具体细节.
comm
多功能的文件比较工具. 使用这个命令之前必须先排序.
comm -options first-file second-file
comm file- file- 将会输出3 列:
basename
从文件名中去掉路径信息, 只打印出文件名. 结构 basename $ 可以让脚本知道它自己的
名字, 也就是, 它被调用的名字. 可以用来显示用法信息, 比如如果你调用脚本的时候缺
少参数, 可以使用如下语句:
echo "Usage: `basename $0` arg1 arg2 ... argn"
dirname
从带路径的文件名中去掉文件名, 只打印出路径信息.
注意: basename 和 dirname 可以操作任意字符串.
split, csplit
将一个文件分割为几个小段的工具. 这些命令通常用来将大的文件分割, 并备份到软盘上,
或者是为了切成合适的尺寸用 email 上传.
csplit 根据上下文 来切割文件, 切割的位置将会发生在模式匹配的地方.
sum, cksum, md5sum, sha1sum
这些都是用来产生 checksum 的工具. checksum 的目的是用来检验文件的完整性, 是对文
件的内容进行数学计算而得到的. 出于安全目的一个脚本可能会有一个 checksum 列表,
这样可以确保关键系统文件的内容不会被修改或损坏. 对于需要安全性的应用来说, 应该
使用 md5sum (message digest checksum) 命令, 或者更好的更新的 sha1sum
(安全 Hash 算法).
shred
用随机字符填充文件, 使得文件无法恢复, 这样就可以保证文件安全的被删除. 这个命令
的效果与 Example - 一样, 但是使用这个命令是一种更优雅更彻底的方法.
这是一个 GNU fileutils.
注意: 即使使用了 shred 命令, 高级的(forensic)辩论技术还是能够恢复文件的内容.
编码和解码
uuencode
这个工具用来把二进制文件编码成 ASCII 字符串,这个工具适用于编码e-mail 消息体,或者
新闻组消息.
uudecode
这个工具用来把 uuencode 后的 ASCII 字符串恢复为二进制文件.
crypt
这个工具曾经是标准的 UNIX 文件加密工具. [] *由于政策上的动机规定禁止加密软
件的输出, 这样导致了 crypt 命令从 UNIX 世界消失, 并且在大多数的 Linux 发行版中
也没有这个命令. 幸运的是, 程序员们想出了一些替代它的方法, 在这些方法中有作者自
己的 cruft (参见 Example A-).
一些杂项工具
mktemp
使用一个"唯一"的文件名来创建一个临时文件 [] . 如果不带参数的在命令行下调用
这个命令时, 将会在 /tmp 目录下产生一个零长度的文件.
make
build 和 compile 二进制包的工具. 当源文件被增加或修改时就会触发一些操作, 这个工
具用来控制这些操作.
make 命令将会检查 Makefile, makefile 是文件的依赖和操作列表.
install
特殊目的的文件拷贝命令, 与 cp 命令相似, 但是具有设置拷贝文件的权限和属性的能力.
这个命令看起来是为了安装软件包所定制的, 而且就其本身而言, 这个命令经常出现在
Makefile 中(在 make install : 区中). 在安装脚本中也会看到这个命令的使用.
dos2unix
这个工具是由 Benjamin Lin 和其同事编写的, 目的是将 DOS 格式的文本文件
(以 CR-LF 为行结束符) 转换为 UNIX 格式 (以 LF 为行结束符), 反过来也一样.
ptx
ptx [targetfile] 命令将会输出目标文件的序列改变的索引(交叉引用列表). 如果必要的
话, 这个命令可以在管道中进行更深层次的过滤和格式化.
more, less
分页显示文本文件或 stdout, 一次一屏.可以用来过滤 stdout 的输出 . . . 或一个脚本
的输出.
more 命令的一个有趣的应用就是测试一个命令序列的执行, 来避免可能发生的糟糕的
结果.
通讯命令
-------------
下边命令中的某几个命令你会在 "追踪垃圾邮件" 练习中找到其用法, 用来进行网络数
据的转换和分析.
信息与统计
host
通过名字或 IP 地址来搜索一个互联网主机的信息, 使用 DNS.
bash$ host surfacemail.com
surfacemail.com. has address 202.92.42.236
ipcalc
显示一个主机 IP 信息. 使用 -h 选项, ipcalc 将会做一个 DNS 的反向查询, 通过 IP
地址找到主机(服务器)名.
bash$ ipcalc -h 202.92.42.236
HOSTNAME=surfacemail.com
nslookup
通过 IP 地址在一个主机上做一个互联网的 "名字服务查询". 事实上这与 ipcalc -h 或
dig -x 等价. 这个命令既可以交互运行也可以非交互运行, 换句话说, 就是在脚本中运
行.
nslookup 命令据说已经慢慢被"忽视"了, 但是它还是有它的用处.
bash$ nslookup -sil 66.97.104.180
nslookup kuhleersparnis.ch
Server: 135.116.137.2
Address: 135.116.137.2#
Non-authoritative answer:
Name: kuhleersparnis.ch
dig
域信息查询. 与 nslookup 很相似, dig 在一个主机上做一个互联网的 "名字服务查询".
这个命令既可以交互运行也可以非交互运行, 换句话说, 就是在脚本中运行.
下边是一些 dig 命令有趣的选项, +time=N 选项用来设置查询超时为 N 秒, +nofail
选项用来持续查询服务器直到收到一个响应, -x 选项会做反向地址查询.
比较下边这 个命令的输出, dig -x , ipcalc -h 和 nslookup.
traceroute
跟踪包发送到远端主机过程中的路由信息. 这个命令在 LAN, WAN, 或者在 Internet 上都
可以正常工作. 远端主机可以通过 IP 地址来指定. 这个命令的输出也可以通过管道中的
grep 或 sed 命令来过滤.
bash$ traceroute 81.9.6.2
traceroute to 81.9.6.2 (81.9.6.2), hops max, byte packets
ping
广播一个 "ICMP ECHO_REQUEST" 包到其他主机上, 既可以是本地网络也可以使远端网络.
这是一个测试网络连接的诊断工具, 应该小心使用.
一个成功的 ping 返回的退出码 为 . 可以用在脚本的测试语句中.
bash$ ping localhost
whois
执行 DNS (域名系统) 查询lookup. -h 选项允许指定需要查询的特定的 whois 服务器.
参见 Example - 和 Example -.
finger
取得网络上的用户信息. 另外这个命令可以显示一个用户的~/.plan, ~/.project, 和
~/.forward 文件, 如果存在的话.
chfn
修改 finger 命令所显示出来的用户信息.
vrfy
验证一个互联网的 e-mail 地址.
远端主机接入
sx, rx
sx 和 rx 命令使用 xmodem 协议, 设置服务来向远端主机传输文件和接收文件. 这些都
是通讯安装包的一般部分, 比如 minicom.
sz, rz
sz 和 rz 命令使用 zmodem 协议, 设置服务来向远端主机传输文件和接收文件. zmodem
协议在某些方面比 xmodem 强, 比如使用更快的的传输波特率, 并且可以对中断的文件进
行续传.与 sx 一样 rx, 这些都是通讯安装包的一般部分.
ftp
向远端服务器上传或下载的工具和协议. 一个ftp 会话可以写到脚本中自动运行. (见
Example -, Example A-, 和 Example A-).
uucp, uux, cu
uucp: UNIX 到 UNIX 拷贝. 这是一个通讯安装包, 目的是为了在 UNIX 服务器之间传输
文件. 使用 shell 脚本来处理 uucp 命令序列是一种有效的方法.
因为互联网和电子邮件的出现, uucp 现在看起来已经很落伍了, 但是这个命令在互联网
连接不可用或者不适合使用的地方, 这个命令还是可以完美的运行. uucp 的优点就是它
的容错性, 即使有一个服务将拷贝操作中断了, 那么当连接恢复的时候, 这个命令还是
可以在中断的地方续传.
telnet
连接远端主机的工具和协议.
注意:telnet 协议本身包含安全漏洞, 因此我们应该适当的避免使用.
wget
wget 工具使用非交互的形式从 web 或 ftp 站点上取得或下载文件. 在脚本中使用正好.
wget -p http://www.xyz23.com/file01.html
# The -p or --page-requisite 选项将会使得 wget 取得显示指定页时
#+ 所需要的所有文件.(译者: 比如内嵌图片和样式表等). wget -r ftp://ftp.xyz24.net/~bozo/project_files/ -O $SAVEFILE
# -r 选项将会递归的从指定站点
#+ 上下载所有连接.
lynx
lynx 是一个网页浏览器, 也是一个文件浏览器. 它可以(通过使用 -dump 选项)在脚本中
使用. 它的作用是可以从 Web 或 ftp 站点上非交互的获得文件.
lynx -dump http://www.xyz23.com/file01.html >$SAVEFILE
使用 -traversal 选项, lynx 将从参数中指定的 HTTP URL 开始, 遍历指定服务器上的
所有链接. 如果与 -crawl 选项一起用的话, 将会把每个输出的页面文本都放到一个 log
文件中.
rlogin
远端登陆, 在远端的主机上开启一个会话. 这个命令存在安全隐患, 所以要使用 ssh 来
代替.
rsh
远端 shell, 在远端的主机上执行命令. 这个命令存在安全隐患, 所以要使用 ssh 来代
替.
rcp
远端拷贝, 在网络上的不同主机间拷贝文件.
rsync
远端同步, 在网络上的不同主机间(同步)更新文件.
bash$ rsync -a ~/sourcedir/*txt /node1/subdirectory/
ssh
安全 shell, 登陆远端主机并在其上运行命令. 这个工具具有身份认证和加密的功能, 可
以安全的替换 telnet, rlogin, rcp, 和 rsh 等工具. 参见 man 页来获取详细信息.
scp
安全拷贝, 在功能上与 rcp 很相似, 就是在2 个不同的网络主机之间拷贝文件, 但是要通
过鉴权的方式, 并且使用与 ssh 类似的安全层.
Local Network
write
这是一个端到端通讯的工具. 这个工具可以从你的终端上(console 或者 xterm)发送整行
到另一个用户的终端上. mesg 命令当然也可以用来对于一个终端的写权限
因为 write 是需要交互的, 所以这个命令通常不使用在脚本中.
netconfig
用来配置网络适配器(使用 DHCP)的命令行工具. 这个命令对于红帽发行版来说是内置的.
Mail
mail
发送或读取 e-mail 消息.
如果把这个命令行的 mail 客户端当成一个脚本中的命令来使用的话, 效果非常好.
mailto
与 mail 命令很相似, mailto 命令可以使用命令行或在脚本中发送 e-mail 消息. 然而,
mailto 命令也允许发送 MIME (多媒体) 消息.
vacation
这个工具可以自动回复 e-mail 给发送者, 表示邮件的接受者正在度假暂时无法收到邮件.
这个工具与 sendmail 一起运行于网络上, 并且这个工具不支持拨号的 POPmail 帐号.
7 终端控制命令
-----------------
tput
初始化终端或者从 terminfo data 中取得终端信息. 不同的选项允许特定的终端操作.
tput clear 与下边的 clear 等价. tput reset 与下边的 reset 等价. tput sgr0 也可
以重置终端, 但是并不清除屏幕.
infocmp
这个命令会打印出大量的当前终端的信息. 事实上它是引用了 terminfo 数据库.
reset
重置终端参数并且清除屏幕. 与 clear 命令一样, 光标和提示符将会重新出现在终端的
左上角.
clear
clear 命令只不过是简单的清除控制台或者 xterm 的屏幕. 光标和提示符将会重新出现
在屏幕或者 xterm window 的左上角. 这个命令既可以用在命令行中也可以用在脚本中.
参见 Example 10-25.
script
这个工具将会记录(保存到一个文件中)所有的用户在控制台下的或在 xterm window 下的
按键信息. 这其实就是创建了一个会话记录.
8 数学计算命令 factor
将一个正数分解为多个素数.
bc
Bash 不能处理浮点运算, 并且缺乏特定的一些操作,这些操作都是一些重要的计算功能.
幸运的是, bc 可以解决这个问题.
bc 不仅仅是个多功能灵活的精确的工具, 而且它还提供许多编程语言才具备的一些方便
的功能.
9 混杂命令
-------------
一些不好归类的命令
jot, seq
这些工具通过用户指定的范围和增量来产生一系列的整数.
每个产生出来的整数一般都占一行, 但是可以使用 -s 选项来改变这种设置.
bash$ seq 5
getopt
getopt 命令将会分析以破折号开头的命令行选项. 这个外部命令与Bash 的内建命令
getopts 作用相同. 通过使用 -l 标志, getopt 可以处理长(多字符)选项, 并且也允许参
数重置.
run-parts
run-parts 命令 [1] 将会执行目标目录中所有的脚本, 这些将本会以 ASCII 的循序进行
排列. 当然, 这些脚本都需要具有可执行权限.
cron 幽灵进程会调用 run-parts 来运行 /etc/cron.* 下的所有脚本.
yes
yes 命令的默认行为是向 stdout 中连续不断的输出字符 y,每个y 占一行.使用control-c
来结束运行. 如果想换一个输出字符的话, 可以使用 yes 其他的字符串, 这样就会连续
不同的输出你指定的字符串. 那么这样的命令究竟能做什么呢? 在命令行或者脚本中,
yes 的输出可以通过重定向或管道来传递给一些需要用户输入进行交互的命令. 事实上,
这个命令可以说是 expect 命令(译者注: 这个命令本书未介绍, 一个自动实现交互的命
令)的一个简化版本.
yes | fsck /dev/hda1 将会以非交互的形式运行fsck(因为需要用户输入的 y 全由yes
命令搞定了)(小心使用!).
yes | rm -r dirname 与 rm -rf dirname 效果相同(小心使用!).
注意: 当用 yes 的管道形式来使用一些可能具有潜在危险的系统命令的时候一定要深思
熟虑, 比如 fsck 或 fdisk. 可能会产生一些意外的副作用.
banner
将会把字符串用一个 ASCII 字符(默认是 '#')来画出来(就是将多个'#'拼出一副字符的
图形).可以作为硬拷贝重定向到打印机上(译者注: 可以使用-w 选项设置宽度).
printenv
对于某个特定的用户, 显示出所有的环境变量.
bash$ printenv | grep HOME
HOME=/home/bozo
lp
lp 和 lpr 命令将会把文件发送到打印队列中, 并且作为硬拷贝来打印. [2] 这些命令
会纪录它们名字的起始位置并传递到行打印机的另一个位置.<rojy bug>
bash$ lp file1.txt 或者 bash lp <file1.txt
通常情况下都是将 pr 的格式化的输出传递到 lp
tee
[UNIX 从管道行业借来的主意.]
这是一个重定向操作, 但是有些不同. 就像管道中的"三通"一样, 这个命令可以将命令或
者管道命令的输出抽出到一个文件中,而且并不影响结果. 当你想将一个正在运行的进程
的输出保存到文件中时, 或者为了debug 而保存输出记录的时候, 这个命令就非常有用了.
(重定向)
|----> to file
|
==========================|====================
command ---> command ---> |tee ---> command ---> ---> output of pipe
===============================================
1 cat listfile* | sort | tee check.file | uniq > result.file
(在对排序的结果进行 uniq (去掉重复行) 之前,文件 check.file 中保存了排过序的
"listfiles".)
mkfifo
这个不大引人注意的命令可以创建一个命名管道, 并产生一个临时的先进先出的buffer
用来在两个进程间传输数据. [3] 典型的使用是一个进程向FIFO 中写数据, 另一个进程读
出来. 参见 Example A-15.
pathchk
这个命令用来检查文件名的有效性. 如果文件名超过了最大允许长度(255 个字符), 或者
它所在的一个或多个路径搜索不到, 那么就会产生一个错误结果.
不幸的是,并不能够返回一个可识别的错误码, 因此它在脚本中几乎没有什么用. 一般都
使用文件测试操作.
dd
这也是一个不太出名的工具, 但却是一个令人恐惧的 "数据复制" 命令. 最开始, 这个命
令是被用来在 UNIX 微机和IBM 大型机之间通过磁带来交换数据, 这个命令现在仍然有它的
用途. dd 命令只不过是简单的拷贝一个文件 (或者 stdin/stdout), 但是它会做一些转
换. 下边是一些可能的转换, 比如 ASCII/EBCDIC, [4] 大写/小写, 在输入和输出之间
的字节对的交换, 还有对输入文件做一些截头去尾的工作. dd --help 列出了所有转换,
还有这个强力工具的一些其他选项.
od
od(octal dump)过滤器, 将会把输入(或文件)转换为8 进制或者其他进制. 在你需要查看
或处理一些二进制数据文件或者一个不可读的系统设备文件的时候, 这个命令非常有用,
比如/dev/urandom,或者是一个二进制数据过滤器. 参见 Example 9-28 和
Example 12-13.
hexdump
对二进制文件进行 16 进制, 8 进制, 10 进制, 或者 ASCII 码的查阅动作. 这个命令大体
上与上边的 od 命令作用相同, 但是远不及 od 命令有用.
objdump
显示编译后的 2 进制文件或2 进制可执行文件的信息, 以16 进制的形式显示, 或者显示反汇
编列表(使用-d 选项).
mcookie
这个命令会产生一个"magic cookie", 这是一个128-bit (32-字符) 的伪随机16 进制数字,
这个数字一般都用来作为 X server 的鉴权"签名". 这个命令还可以用来在脚本中作为一
种生成随机数的手段, 当然这是一种"小吃店"(虽然不太正统, 但是很方便)的风格.
1 random000=$(mcookie)
units
这个工具用来在不同的计量单位之间互相转换. 当你在交互模式下正常调用时, 会发现在
脚本中 units 也很有用.
m4
一个隐藏的财宝, m4 是一个强力的宏处理过滤器, [5] 差不多可以说是一种语言了. 虽
然最开始这个工具是用来作为 RatFor 的预处理器而编写的, 但是后来证明 m4 作为独
立的工具也是非常有用的. 事实上, m4 结合了许多工具的功能, 比如 eval, tr, 和 awk,
除此之外, 它还使得宏扩展变得容易.
doexec
doexec 命令允许将一个随便的参数列表传递到一个二进制可执行文件中. 特别的, 甚至
可以传递 arg[0] (相当于脚本中的 $0 ), 这样可以使用不同的名字来调用这个可执行
文件, 并且通过不同的调用的名字, 可以让这个可执行文件执行不同的动作. 这也可以
说是一种将参数传递到可执行文件中的比较绕圈子的做法.
dialog
dialog 工具集提供了一种从脚本中调用交互对话框的方法.
sox
sox 命令, "sound exchange" (声音转换)命令, 可以进行声音文件的转换. 事实上,可执
行文件 /usr/bin/play (现在不建议使用) 只不过是 sox 的一个 shell 包装器而已.