shell 知:外部命令

文章目录

1. 介绍

本文作为《shell 知:bash》的外部命令链接,只简单讲述了相关的外部命令,各命令的详细使用读者需要自行解锁。

2. 外部过滤器,程序和命令

标准的UNIX命令使得shell脚本更加灵活。通过简单的编程结构把shell指令和系统命令结合起来,这才是脚本能力的所在。

2.1. 基本命令

2.1.1. ls

"列出"文件的额节本命令。但是往往就是因为这个命令态简单,所以我们总是低估它。比如,使用-R选项,递归选项,ls将会以目录树的形式流出所有文件。另一个很有用的选项-S,将会按照文件尺寸列出所有文件,-t将会按照修改时间来列出文件,-i选项会显示文件inode。

2.1.2. cat,tac

cat,是单词concatenate的缩写,把文件的内容输出到stdout。当与重定向操作符(>或>>),一般都是用来将多个文件连接起来。

cat命令的-n选项是为了在目标文件中的所有行前面插入行号。-b也是用来加行号的,但是不对空行进行编号。
-v选项可以使用^标记法来echo出不可打印字符。-s选项可以把多个空行压缩成一个空行。

tac命令,就是cat命令的反转,这个命令将会从文件结尾部分列出文件的内容。

2.1.3. rev

把每一行中的内容反转,并且输出到stdout上。这个命令与tac命令的效果是不同的,因为它并不反转行序,而是把每行的内容反转。

2.1.4. cp

这是文件拷贝命令。cp file1 file2把文件file1拷贝到file2,如果file2存在的换,那么file2将被覆盖。

特别有用的选项就是-a选项,这是归档标志(目的是为了copy一个完整的目录书),-u是更新选项,-r和-R选项是递归标志。

2.1.5. mv

这是文件移动命令。它等价于cp和rm命令的组合。它可以把多个文件移动到目录中,甚至将目录重命名。

当使用非交互脚本时,可以使用mv的-f(强制)选项来避免用户的输入。当一个目录被移动到一个已存在的目录时,那么它将成为目标目录的子目录。

2.1.6. rm

删除(清除)一个或多个文件。-f选项将强制删除文件,即使这个文件是只读的。并且可以用来避免用户输入(在非交互脚本中使用)。

rm将无法删除以破折号开头的文件。
解决这个问题的一个方法就是在要删除的文件的前边加上./。

rm ./-badname

另一种解决的方法是在文件名前边加上“–"。

rm -- -badname

当使用递归参数-r时,这个命令将会删除整个目录书。如果不慎的使用rm -rf *的话,那整个目录树就真的完了。

2.1.7. rmdir

删除目录。但是只有这个目录中没有文件的时候,当然会包含“不可见”点文件,这个命令才会成功。

2.1.8. mkdir

生成目录,创建一个空目录。比如,mkdir -p project/programs/December将会创建指定的目录,即使project目录和programs目录都不存在。-p选项将会自动产生必要的父目录,这样也就同时创建了多个目录。

2.1.9. chmod

修改一个现存文件的属性。

2.1.10. chattr

修改文件属性。这个命令与上边的chmod命令项类似,但是有不同的选项和不同的调用语法,并且这个命令智能工作载ext2文件系统中。

chattr命令的一个特别有趣的选项是i。chattr +i filename将使得这个文件被标记为永远不变。这个文件将不能被修改,连接,或删除,即使是root也不行。这个文件属性智能被root设置和删除。类似的,a选项将会把文件标记为只能追加数据。

如果文件设置了s(安全)属性,那么当这个文件被删除时,这个文件所在磁盘的块将全部被0填充。

如果文件设置了u(不可删除)属性,那么当这个文件被删除后,这个文件的内容还可以被恢复(不可删除)。

如果文件设置了c(压缩)属性,那么当这个文件在进行写操作时,它将自动被压缩,并且在读的时候,自动解压。

使用chattr命令设置过属性的文件将不会显示在文件列表中(ls -l)。

2.1.11. ln

创建文件链接,前提是这个文件是存在的。“链接”就是一个文件的引用,也就是这个文件的另一个名字。ln命令允许对同一个文件引用多个链接,并且是避免混淆的一个很好的方法。

ln对于文件来说只不过是创建了一个引用,一个指针而已,因为创建出来的的链接文件只有几个字节。

绝大多数使用ln命令时,使用的是-s选项,可以成为符号链接,或“软”链接。使用-s标志的一个优点是它可以穿越文件系统来链接目录。

关于使用这个命令的语法还是有点小技巧的。比如:ln -s oldfile newfile将对之前存在的oldfile产生一个显得链接newfile。如果之前newfile已经存在的话,将会产生一个错误信息。

2.1.12. man,info

这两个命令来查看系统命令或安装工具的手册和信息。当两者都可用时,info页一般会比man页包含更多的细节描述。

2.2. 复杂命令

更高级的用户命令

2.2.1. find

-exec COMMAND \;

在每一个find匹配到的文件执行COMMAND命令。命令序列以;结束(";"是转义符以保证shell传递到find命令中的字符不会被解释为其它字符)。

如果COMMAND中包含{},那么find命令将会用所有匹配文件的路径名来替换“{}”。

find ~/ -name 'core*' -exec rm {} \;
# 从用户的home目录中删除所有的core dump文件。

find命令的-exec选项不应该与shell中的內建命令exec项混淆。

2.2.2. xargs

这是给命令传递参数的一个过滤器,也是组合多个命令的一个工具。它把一个数据流分割为一些足够小的块,以方便过滤器和命令进行处理。由此这个命令也是后置引用的一个强有力的替换。当在一般情况下使用过多参数的命令替换都会产生失败的现象,这时候使用xargs命令来替换,一般都能成功。一般的,xargs从stdin或者管道中读取数据,但是它也能够从文件的输出中读取数据。

xargs的默认命令是echo。这意味着通过管道传递给xargs的输入将会包含换行和空白,不过通过xargs的处理,换行和空白将被空格取代。

ls | xargs -p -1 gzip 使用gzips压缩当前目录下的每个文件,每次压缩一个,并且在每次压缩前都提示用户。

一个有趣的xargs选项是-n NN,NN用来限制每次传递进来参数的个数。ls | xargs -n 8 echo 以每行8列的形式列出当前目录下的素有文件。

另一个有用的选项是-0,使用find -print0 grep -lZ这两种组合方式。这允许处理包含空白或引号的参数。

find / -type f -print0 | xargs -0 grep -liwZ GUI | xargs -i rm -f
grep -rliwZ GUI / | xargs -0 rm -f

上边两行都可用来删除任何包含“GUI”的文件。

-i参数是xargs命令的“替换字符串”选项,大括号对的地方就是替换点。

ps ax | grep "$PROCESS_NAME" | awk '{print $1}' | xargs -i kill {}

2.2.3. expr

通用求值表达式:通过给定的操作(参数必须以空格分开)连接参数,并对参数求值。可以使算术操作,比较操作,字符串操作或者是逻辑操作。

expr 3 + 5
    返回8
expr 5 % 3
    返回2
expr 1 / 0
    返回错误消息,expr: division by zero
    不允许非法的算术操作
expr 5 \* 3
    返回15。在算术表达式exprt中使用乘法操作时,乘法符号必须被转义。
y=`expr $y + 1`
    增加变量的值,与let y=y+1和y=$(($y+1))的效果相同。这是使用算术表达式的一个例子。
z=`expr substr $string $position $length`
    在位置$position上提取$length长度的子串。

:操作可以替换match命令,比如,b=`expr $a : [0-9]*`与b=`expr match $a [0-9]*`完全等价。

2.3. 时间/日期命令

时间/日期和计时

2.3.1. date

直接调用date命令就会把日期和时间输出到stdout上。这个命令有趣的地方在于它的格式化和分析选项上。

prefix=temp
suffix=$(date +%s)  # 'date'命令的"+%s"选项是GNU特性
filename=$prefix.$suffix
# 这是一种非常好的产生“唯一”临时文件的办法,甚至比使用$$都强

-u选项将给出UTC时间(Universal Coordinated Time)。

date命令有许多的输出选项。比如 %N 将以十亿分之一为单位表示当前时间。这个选项的一个有趣的用法就是用来产生一个6位的随机数。

2.3.2. zdump

时区dump:查看特定时区的当前时间。

2.3.3. time

输出统计出来的命令执行的时间。

2.3.4. touch

这是一个用来更新文件被访问或修改的时间的工具,这个时间可以是当前系统的时间,也可以是指定的时间,这个命令也用来产生一个新文件。命令touch zzz将产生一个zzz为名字的0字节长度文件,当前前提是zzz文件不存在。为了存储事件信息,就需要一个时间戳为空的文件,比如当你想跟踪一个工程的修改时间的时候,这就非常游泳了。

2.3.5. at

at命令是一个作业控制命令,用来在指定时间点上执行指定的命令集合。它有点像cron命令,然而,at命令主要还是用来执行那种一次性执行的命令集合。

at 2pm January 15将会产生提示,提示你输入需要在这个时间上需要执行的命令序列。这些命令应该是可以和shell脚本兼容的,因为实际上在一个可执行的脚本中,用户每次只能输入一行。输入讲义Ctrl-D结束。

你可以使用-f选项或者使用(<)重定向操作符,来让at命令从一个文件中读取命令集合。这个文件其实就一个可执行的脚本,虽然它是一个不可交互的脚本。在文件中包含一个run-parts命令,对于执行一套不同的脚本来说是非常聪明的做法。

2.3.6. batch

batch作业控制命令与at命令的行为很相像,但是batch命令被用来在系统平均负载量讲到.8以下时执行一次性的任务。与at命令相似的是,它也可以使用-f选项来从文件中读取命令。

2.3.7. cal

从stdout中输出一个格式比较整齐的日历,既可以指定当前年度,也可以指定过去或将来的某个年度。

2.3.8. sleep

这个命令与一个等待循环的效果一样。你可以指定需要暂停的秒数,这段时间将什么都不干。当一个后台运行的进程需要偶尔检测一个事件时,这个功能很有用。也可用于计时。

sleep 3     # 暂停3秒

sleep默认是以秒为单位,但是你也可以指定分钟,小时,或者天数为单位。

sleep 3 h   # 暂停3小时

如果你想每隔一段时间来运行一个命令的话,那么watch命令将比sleep命令好得多。

2.3.9. usleep

指定需要sleep的微秒数(“u”会被希腊人读成“mu",或者是micro-前缀)。与上边的sleep命令相同,但这个命令以微秒为单位。当需要精确计时,或者需要非常频繁的监控一个正在运行进程的时候,这个命令非常有用。

usleep 30   # 暂停30微秒

事实上,usleep命令并不能提供非常精确的计时,所以如果你需要运行一个实时的任务的话,这个命令并不适合。

2.3.10. hwclock,clock

hwclock命令可以访问或调整硬件时钟。这个命令的一些选项需要具有root权限。在系统启动的时候,/etc/rc.d/rc/sysinit,会使用hwclock来从硬件时钟中读取并设置系统时间。

clock命令与hwclock命令完全相同。

2.4. 文本处理命令

处理文本和文本文件的命令

2.4.1. sort

文件排序,通常用在管道中当过滤器来使用。这个命令可以依据指定的关键字或指定的字符位置,对文件进行排序。使用-m选项,它将会合并预排序的输入文件。

2.4.2. tsort

拓扑排序,读取以空格分隔的有序对,并且依靠输入模式进行排序。

2.4.3. uniq

这个过滤器将会删除一个已排序文件中的重复行。这个命令经常出现在sort命令的管道后边。

-c用来统计每行出现的次数,并把次数作为前缀放到输出行的前面。

sort INPUTFILE | uniq -c | sort -nr 命令先对INPUTFILE文件进行排序,然后统计每行出现的次数(sort命令的-nr选项会产生一个数字的反转排序)。这种命令模板一般都用来分析log文件或者用来分析字典列表,或者用在那些需要检查文本词汇结构的地方。

2.4.4. expand,unexpand

expand命令会把每个tab转化为一个空格。这个命令经常用在管道中。

unexpand命令将会把每个空格转化为一个tab。效果与expand命令相反。

2.4.5. cut

一个从文件中提取特定域的工具。这个命令与awk中使用的print $N命令很相似,但是更受限。在脚本中使用cut命令比使用awk命令来得容易一些。最重要的选项就是-d(字段定界符)和-f(域分隔符)选项。

使用cut来获得所有mount上的文件系统的列表:

cut -d ' ' -f1,2 /etc/mtab

使用cut命令列出OS和内核版本:

uname -a | cut -d" " -f1,3,11,12

cut -d ’ ’ -f2,3 filename等价于awk -F’[ ]’ ‘{print $2, $3}’ filename

你甚至可以指定换行符作为字段定界符。这个小伎俩实际上就是在命令行上插入一个换行(RETURN)。

cut -d'
 ' -f3,7,19 testfile

2.4.6. paste

将多个文件,以每个文件一列的形式合并到一个文件中,合并后文件中的每一列就是原来的一个文件。与cut结合使用,经常用于创建系统log文件。

2.4.7. join

这个命令与paste命令属于同类命令。但是它能够完成某些特殊的目的。这个强力工具能够以一种特殊的形式来合并两个文件,这种特殊的形式本质上就是一个关联数据库的简单版本。

join命令只能够操作两个文件。他可以将那些具有特定标记域(通常是一个数字标签)的行合并起来,并且将结果输出到stdout。被加入的文件应该事先根据标记域进行排序以便于能够正确的匹配。

File: 1.data
100 Shoes
200 Loces
300 Socks

File: 2.data
100 $40.00
200 $1.00
300 $2.00

$ join 1.data 2.data
File: 1.data 2.data
100 Shoes $40.00
200 Loces $1.00
300 Socks $2.00

2.4.8. head

把文件的头部内容打印到stdout上(默认为10行,可以自己修改)。这个命令有一些比较有趣的选项。

2.4.9. tail

将一个文件结尾部分的内容输出到stdout中(默认为10行)。通常用来跟踪一个系统logfile的修改情况,如果使用-f选项的话,这个命令将会继续显示添加到文件中的行。

为了列出一个文本文件中的指定行的内容,可以将head命令的输出通过管道传递到tail -1中。比如,head -8 database.txt | tail -1 将会列出database.txt文件第8行的内容。

2.4.10. grep

使用正则表达式的一个多用途文本搜索工具。这个命令本来是ed行编辑器中的一个命令/过滤器:

grep pattern [file…]

在文件中搜索所有pattern出现的位置,pattern既可以是要搜索的字符串,也可以是一个正则表达式。

如果没有指定文件参数,grep通常用在管道中对stdout进行过滤。

-i                  选项在搜素时忽略大小写
-w                  选项用来匹配整个单词
-l                  选项仅列出符合配的文件,而不列出匹配行
-r                  (递归)选项不仅在当前工作目录下搜素匹配,而且搜素子目录。
-n                  选项列出所有匹配行,并显示行号
-v (--invert-match) 选项将会显示所有不匹配的行
-c (--count)        选项将只会显示匹配到的函数的奏疏,而不会列出具体的匹配

当有多个文件参数的时候,grep将会指出哪个文件中包含具体的匹配。

如果存在一个成功的匹配,那么grep命令将会返回0作为退出状态码,这样就可以将grep命令的结果放在脚本的条件测试中来使用,由其和-q(禁止输出)选项组合时特别有用。

如何使用grep命令来搜素两个(或两个以上)独立的模式?如果你想在一个或多个文件中显示既匹配“pattern1”又匹配“pattern2”的所有匹配的话,那又该如何做呢?

一个方法是通过管道将grep pattern1的结果传递到grep pattern2中。

grep pattern1 testfile | grep pattern2

egrep - 扩展的grep,这个命令与grep -E等价。这个命令用来起来有些不同,由于使用正则表达式的扩展集合,将会使得搜索更具灵活性。它也允许逻辑|(或)操作。

egrep 'pattern1|pattern2' testfile

fgrep - 快速的grep,这个命令与grep -F等价。这是一种按照字符串字面意思进行的搜索(即不允许使用正则表达式),这样有时候会使搜索变得容易一些。

在某些Linux发行版中,egrep和fgrep都是grep命令的符号链接或者别名,只不过在调用的时候分别使用了-E和-F选项罢了。

2.4.11. look

look命令与grep命令和相似,但是这个命令只能做“字典查询”,也就是它所搜索的文件必须是已经排过序的单词列表。默认情况下,如果没有指定搜索哪个文件,look命令就默认搜索/usr/dict/words,当然也可以指定其它目录下的文件进行搜索。

2.4.12. sed,awk

这两个命令都是独立的脚本语言,尤其适合分析文本文件和命令输出。既可以单独使用,也可以结构管道和在shell脚本中使用。

sed - 非交互式的“流编辑器”,在批处理模式下,允许使用多个sed命令。

awk - 可编程的文件提取器和文件格式化工具,在结构化的文本文件中,处理或提取特定域(特定列)具有非常好的表现。

2.4.13. wc

wc可以统计文件或I/O流中的“单词数量”:

wc -w   统计单词数量
wc -l   统计行数量
wc -c   统计字节数量
wc -m   统计字符数量
wc -L   给出文件中最长行的长度

wc命令来统计所有一个d-h开头的文件的大小

wc [d-h]* | grep total | awk '{print $3}'

2.4.14. tr

字符转换过滤器。必须使用引用或中括号,这样做才是合理的。引用可以阻止shell重新解释出现在tr命令序列中的特殊字符。中括号应该被引用起来防止被shell扩展。

无论tr “A-Z” “*” < filename还是tr A-Z * < filename都可以将filename中的大写字符修改为星号(写到stdout)。但是在某些系统上可能就不能正常工作了,而tr A-Z '[**]'在任何系统上都可以正常工作。

-d选项删除指定范围的字符。

echo "abcdef" | tr -d b-d   # aef
tr -d 0-9 < filename        # 删除“filename”中所有的数字

–squeeze-repeats(或-s)选项用来在重复字符序列中除去除第一个字符以外的所有字符。这个选项在删除多余空白的时候非常有用。

echo "XXXXX" | tr --squeeze-repeats 'X'     # X

-c "complement"选项将会反转匹配的字符集。通过这个选项,tr将只会对那些不匹配的字符起作用。

echo "acfdeb123" | tr -c b-d +              # +c+d+b++++

2.4.15. fold

将输入按照指定宽度进行拆行。这里有一个非常有用的选项-s,这个选项可以使用空格进行断行。

2.4.16. fmt

一个简单的文本格式器,通常用在管道中,将一个比较长的文本行输出进行“折行”。

ls /bin | fmt -w 40         # 设为40列宽.
ls /bin | fold - -s -w 40   # 并没有生效

2.4.17. col

这个命令用来滤除标准输入的反向换行符号。这个工具还可以将空白用等价的tab来替换。col工具最主要的应用还是从特定的文本处理工具中过滤输出,比如groff和tbl。

2.4.18. column

列格式化工具。通过在合适的位置插入tab,这个过滤工具会将列类型的文本转化为“易于打印”的表格式进行输出。

2.4.19. colrm

列删除过滤器。这个工具将会从文件中删除指定的列(列中的字符串)并且写到文件中,如果指定的列不存在,那么就回到stdout。colrm 2 4 < filename将会删除filename文件中每行的第2列到第4列之间的所有字符。

如果这个文件包含tag和不可打印字符,那将会引起不可预期的行为。在这种情况下,应该通过管道的手段使用expand和unexpand来预处理colrm。

2.4.20. nl

计算行号过滤器。nl filename将会把filename文件的所有内容都输出到stdout上,但是会在每个非空行的前面加上连续的行号。如果没有filename参数,那么就操作stdin。

nl命令的输出与cat -n非常相似,然而,默认情况下nl不会列出空行。

2.4.21. pr

格式化打印过滤器。这个命令会将文件(或stdout)分页,将它们分成合适的小块以便于硬拷贝打印或者在屏幕闪个浏览。使用这个命令的不同的参数可以完成好多任务,比如对行和列的操作,加入行,设置页边,计算行号,添加页眉,合并文件等等。pr命令集合了许多命令的功能,比如nl,paste,fold,column和expand。

pr -o 5 --width=65 fileZZZ | more这个命令对fileZZZ进行了比较好的分页,并且打印到屏幕上。文件的缩进被设置为5,总宽度设置为65.

一个非常有用的选项-d,强制隔行打印(与sed -G效果相同)。

2.5. 通讯命令

下边命令中的某几个命令你会在追踪垃圾邮件练习中找到其用法,用来进行网络数据的转换和分析。

2.5.1. 信息与统计

2.5.1.1. host

通过名字或IP地址来搜索一个互联网主机的信息,使用DNS。

$ host www.baidu.com
www.baidu.com is an alias for www.a.shifen.com.
www.a.shifen.com has address 180.101.49.12
www.a.shifen.com has address 180.101.49.11
2.5.1.2. ipcalc

显示一个主机IP信息。使用-h选项,ipcalc将会做一个DNS的反向查询,通过IP地址找到主机(服务器)名。

$ ipcalc -h 180.101.49.12
2.5.1.3. ping

广播一个"ICMP ECHO_REQUEST"包到其他主机上, 既可以是本地网络也可以是远端网络. 是一个测试网络连接的诊断工具, 应该小心使用.

如果ping成功之行, 那么返回的退出状态码为0. 可以用在脚本的测试语句中.

2.5.1.4. whois

执行DNS(域名系统)查询。-h选项允许指定需要查询的特定whois服务器。

2.5.1.5. finger

取得网络上的用户信息. 另外这个命令可以显示一个用户的~/.plan, ~/.project, 和~/.forward文件, 当然, 前提是如果这些文件存在的话.

出于安全上的考虑, 许多网络都禁用了finger, 以及和它相关的幽灵进程.

2.5.1.6. chfn

修改finger命令所显示出来的用户信息.

2.5.1.7. vrfy

验证一个互联网的e-mail地址.

2.5.2. 远端主机接入

2.5.2.1. sx, rx

sx和rx命令使用xmodem协议, 置服务来向远端主机传输文件和接收文件. 这些都是通讯安装包的一般部分, 比如minicom.

2.5.2.2. sz, rz

sz和rz命令使用zmodem协议, 设置服务来向远端主机传输文件和接收文件. Zmodem协议在某些方面比xmodem协议强, 比如使用更快的传输波特率, 并且可以对中断的文件进行续传. 与sx和rx一样, 这些都是通讯安装包的一般部分.

2.5.2.3. ftp

向远端服务器上传或下载的工具, 也是一种协议. 一个ftp会话可以写到脚本中自动运行.

2.5.2.4. uucp, uux, cu

uucp: UNIX到UNIX拷贝. 这是一个通讯安装包, 目的是为了在UNIX服务器之间传输文件. 使用shell脚本来处理uucp命令序列是一种有效的方法.

因为互联网和电子邮件的出现, uucp现在看起来已经很落伍了, 但是这个命令在互联网连接不可用或者不适合使用的地方, 这个命令还是可以完美的运行. uucp的优点就是它的容错性, 即使有一个服务将拷贝操作中断了, 那么当连接恢复的时候, 这个命令还是可以在中断的地方续传.

uux: UNIX到UNIX执行. 在远端系统上执行一个命令. 这个命令是uucp包的一部分.

cu: Call Up 一个远端系统并且作为一个简单终端进行连接. 这是一个telnet的缩减版本. 这个命令是uucp包的一部分.

2.5.2.5. telnet

连接远端主机的工具和协议.

telnet协议本身包含安全漏洞, 因此我们应该适当的避免使用.

2.5.2.6. wget

wget工具使用非交互的形式从web或ftp站点上取得或下载文件. 在脚本中使用正好.

2.5.2.7. lynx

lynx是一个网页浏览器, 也是一个文件浏览器. 它可以(通过使用-dump选项)在脚本中使用. 它的作用是可以非交互的从Web或ftp站点上获得文件.

lynx -dump http://www.xyz23.com/file01.html >$SAVEFILE

使用-traversal选项, lynx将会从参数中指定的HTTP URL开始, "遍历"指定服务器上的所有连接.如果与-crawl选项一起用的话, 将会把每个输出的页面文本都放到一个log文件中.

2.5.2.8. rlogin

远端登陆, 在远端的主机上开启一个会话. 这个命令存在安全隐患, 所以要使用ssh来代替.

2.5.2.9. rsh

远端shell, 在远端的主机上执行命令. 这个命令存在安全隐患, 所以要使用ssh来代替.

2.5.2.10. rcp

远端拷贝, 在网络上的不同主机间拷贝文件.

2.5.2.11. rsync

远端同步, 在网络上的不同主机间(同步)更新文件.

在使用rcp, rsync, 还有另外一些有安全问题的类似工具的时候, 一定要小心, 因为将这些工具用在shell脚本中是不明智的. 你应该考虑使用ssh, scp, 或者expect脚本来代替这些不安全的工具.

2.5.2.12. ssh

安全shell,登录远端主机并在其上运行命令。这个工具具有身份认证和加密的功能。可以安全的替换telnet,rlogin,rcp,和rsh等工具。

在循环中, ssh可能会引起一些异常问题. 根据comp.unix上的shell文档Usenet post所描述的内容, ssh继承了循环的stdin. 为了解决这个问题,请使用ssh的-n或者-f选项.

2.5.2.13. scp

安全拷贝,在功能上与rcp很相似,就是在两个不同的网络主机之间拷贝文件,但是要使用鉴权的方式,并且要使用与ssh类似的安全层。

2.5.3. 本地网络

2.5.3.1. write

这是一个端到端通讯的工具. 这个工具可以从你的终端上(console或者xterm)发送整行数据到另一个用户的终端上. mesg命令当然也可以用来禁用对于一个终端的写权限.因为write命令是需要交互的, 所以这个命令在脚本中很少使用.

2.5.3.2. netconfig

用来配置网络适配器(使用DHCP)的命令行工具. 这个命令对于红帽发行版来说是内置的.

2.5.4. Mail

2.5.4.1. mail

发送或者读取e-mail消息.

如果把这个命令行的mail客户端当成一个脚本中的命令来使用的话, 效果非常好.

2.5.4.2. mailto

与mail命令很相似, mailto可以使用命令行或在脚本中发送e-mail消息. 而且mailto也可以发送MIME(多媒体)消息.

2.5.4.3. vacation

这个工具可以自动回复e-mail给发送者, 表示邮件的接受者正在度假暂时无法收到邮件. 这个工具与sendmail一起运行于网络上, 并且这个工具不支持拨号的POPmail帐号.

一个幽灵进程指的是并未附加在终端会话中的后台进程. 幽灵进程在指定的时间执行指定的服务, 或者由特定的事件触发来执行指定的服务.

希腊文中的"daemon"意思是幽灵, 这个词充满了神秘感和神奇的力量, 在UNIX中幽灵进程总是在后台默默地执行着分配给它们的任务.

2.6. 终端控制命令

影响控制台或终端的命令

2.6.1. tput

初始化终端或者从terminfo数据中取得终端信息. 这个命令有许多选项, 每个选项都允许特定操作. tput clear与后边所介绍的clear命令等价, tput reset与后边所介绍的reset命令等价, tput sgr0可以复位终端, 但是并不清除屏幕.

使用tput cup X Y将会把光标移动到当前终端的(X,Y)坐标上, 使用这个命令之前一般都要先用clear命令清屏.

注意: stty提供了一个更强大的命令专门用来设置如何控制终端.

2.6.2. infocmp

这个命令会打印出大量当前终端的信息. 事实上它是引用了terminfo数据库的内容.

2.6.3. reset

复位终端参数并且清除屏幕。与clear命令一样,光标和提示符将会重新出现在终端的左上角。

2.6.4. clear

clear命令只不过是简单的清除控制台或者xterm的屏幕,光标和提示符将会重新出现在屏幕或者xterm window的左上角。这个命令既可以用在命令行中也可以用在脚本中。

2.6.5. script

这个工具将会记录(保存到一个文件中)所有的用户按键信息(在控制台下的或在xterm window下的按键信息). 这其实就是创建了一个会话记录.

2.7. 数学计算命令

操作数字

2.7.1. factor

将一个整数分解为多个素数

2.7.2. bc

Bash不能处理浮点运算,并且缺乏特定的一些操作,这些操作都是一些重要的计算功能。幸运的是,bc可以解决这个问题。bc不仅仅是个多功能灵活的精确计算工具,且它还提供许多编程语言才具备的一些方便功能。
bc比较类似于C语言的语法。因为他是一个完整的UNIX工具,所以他可以用在pipe中,bc在脚本中也是很常用的。

这里有一个简单的使用bc命令的模板,可以用来计算脚本中的变量。这个模板经常用于命令替换中。

variable=$(echo "OPTIONS; OPERATIONS" | bc)

2.8. 混杂命令

2.8.1. jot,seq

这些工具用来生成一系列整数,用户可以指定生成范围。

每个产生出来的整数一般都占一行,但是可以使用-s选项来改变这种该设置。

$ seq 2
1
2

$ seq -s : 5
1:2:3:4:5

2.8.2. getopt

getopt命令将会分析以破折号开头的命令选项。这个外部命令与Bash的內建命令getopts作用相同。通过使用-l标志,getopt可以处理超长(多个字符的)选项,并且也允许参数重置。

#!/bin/bash
# 使用getopt.

# 尝试使用下边的不同的方法来调用这脚本:
# sh ex33a.sh -a
# sh ex33a.sh -abc
# sh ex33a.sh -a -b -c
# sh ex33a.sh -d
# sh ex33a.sh -dXYZ
# sh ex33a.sh -d XYZ
# sh ex33a.sh -abcd
# sh ex33a.sh -abcdZ
# sh ex33a.sh -z
# sh ex33a.sh a
# 解释上面每一次调用的结果.
E_OPTERR=65
if [ "$#" -eq 0 ]
then # 脚本需要至少一个命令行参数.
    echo "Usage $0 -[options a,b,c]"
    exit $E_OPTERR
fi
set -- `getopt "abcd:" "$@"`
# 为命令行参数设置位置参数.
# 如果使用"$*"来代替"$@"的话, 会发生什么?
while [ ! -z "$1" ]
do
    case "$1" in
        -a) echo "Option \"a\"";;
        -b) echo "Option \"b\"";;
        -c) echo "Option \"c\"";;
        -d) echo "Option \"d\" $2";;
        *) break;;
    esac
    shift
done

2.8.3. run-parts

run-parts命令将会执行目标目录中所有的脚本,这些脚本会以ASCII码的顺序进行排列。当然,这些脚本都需要具有可执行权限。

cron幽灵进程会调用run-parts来运行/etc/cron.*下的所有脚本。

2.8.4. yes

yes命令默认行为是向stdout连续不断的输出字符y,每个y单独占一行。可以使用control-c来结束输出。如果想换一个输出字符的话,可以使用yes different string,这样就会连续不断的输出different string到stdout。那么这样的命令究竟能用来做什么呢?在命令行或者脚本中,yes的输出可以通过重定向或管道来传递给一些命令,这些命令的特点是需要用户输入来进行交互。事实上,这个命令可以说是expect命令的一个简化版本。

yes | fsck /dev/hda1将会以非交互的形式运行fsck。

yes | rm -f dirname 与 rm -rf dirname 效果相同。

2.8.5. banner

将会把传递进来的参数字符串用一个ASCII字符(默认是’#‘)给画出来(就是将多个’#'拼出一副字符的图形), 然后输出到stdout。可以作为硬拷贝重定向到打印机上。(译者注: 可以使用-w 选项设置宽度.)

2.8.6. printenv

显示某个特定用户所有的环境变量。

2.8.7. tee

这是一个重定向操作,但是与之前所看到的有点不同。就像管道中的“三通”一样,这个命令可以将命令或者管道命令的输出“抽出”到一个文件中,而且不影响结果。当你想将一个运行中经常的输出保存到文件时,或者为了debug而保存输出记录的时候,这个命令就显得非常有用了。

2.8.8. dd

这也是一个不太出名的工具, 但却是一个令人恐惧的"数据复制"命令. 最开始, 这个命令被用来在UNIX微机和IBM大型机之间通过磁带来交换数据, 这个命令现在仍然有它的用途. dd命令只不过是简单的拷贝一个文件(或者stdin/stdout), 但是它会做一些转换. 下边是一些可能的转换, 比如 ASCII/EBCDIC, 大写/小写, 在输入和输出之间的字节对的交换, 还有对输入文件做一些截头去尾的工作. dd --help列出了所有转换, 还列出了这个强大工具的其他一些选项.

dd命令可以将数据或磁盘镜像拷贝到设备中, 也可以从设备中拷贝数据或磁盘镜像, 比如说磁盘或磁带设备都可以. 通常用来创建启动磁盘.

dd if=kernel-image of=/dev/fd0H1440

同样的, dd可以拷贝软盘的整个内容(甚至是"其他"操作系统的磁盘格式), 到硬盘驱动器上(以镜像文件的形式).

dd if=/dev/fd0 of=/home/bozo/projects/floppy.img

dd命令还有一些其他用途, 包括可以初始化临时交换文件和ramdisks(内存虚拟硬盘). 它甚至可以做一些对整个硬盘分区的底层拷贝, 虽然不建议这么做。

2.8.9. od

od, 或者octal dump过滤器, 将会把输入(或文件)转换为8进制或者其他进制. 在你需要查看或处理一些二进制数据文件或者一个不可读的系统设备文件的时候, 这个命令非常有用, 比如/dev/urandom, 或者是一个二进制数据过滤器。

2.8.10. hexdump

对二进制文件进行 16进制, 8进制, 10进制, 或者ASCII码的查阅动作. 这个命令大体上与上边的od命令的作用相同, 但是远没有od命令有用。

2.8.11. objdump

显示编译后的二进制文件或二进制可执行文件的信息, 以16进制的形式显示, 或者显示反汇编列表(使用-d选项)。

2.8.12. m4

一个隐藏的财宝, m4是一个强大的宏处理过滤器, [5] 差不多可以说是一种语言了. 虽然最开始这个工具是用来作为RatFor的预处理器而编写的, 但是后来证明m4即使作为独立的工具来使用也是非常有用的. 事实上, m4结合了许多工具的功能, 比如eval, tr, 和awk, 除此之外, 它还使得宏扩展变得更加容易.

2.8.13. doexec

doexec命令允许将一个随便的参数列表传递到一个 二进制可执行文件中. 比较特殊的, 甚至可以传递argv0, 这样就可以使用不同的名字来调用这个可执行文件, 并且通过不同的调用名字, 还可以让这个可执行文件执行不同的动作. 这也可以说是一种将参数传递到可执行文件中的比较绕圈子的做法.

比如, /usr/local/bin目录可能包含一个"aaa"的二进制文件. 使用doexec /usr/local/bin/aaa list可以列出当前工作目录下所有以"a"开头的文件, 而使用doexec /usr/local/bin/aaa delete将会删除这些文件.

2.8.14. dialog

dialog工具集提供了一种从脚本中调用交互对话框的方法. dialog更好的变种版本是 --gdialog, Xdialog, 和kdialog – 事实上是调用X-Windows的界面工具集. 请参考例子 33-19.

2.8.15. sox

sox命令, 也就是"sound exchange"命令, 可以进行声音文件的转换. 事实上, 可执行文件/usr/bin/play(现在不建议使用)只不过是sox的一个shell包装器而已.

举个例子, sox soundfile.wav soundfile.au将会把一个WAV文件转换成(Sun音频格式)AU声音文件.

Shell脚本非常适合于使用sox的声音操作来批处理声音文件. 比如, Linux Radio Timeshift HOWTO和MP3do Project.

3. 系统与管理命令

在/etc/rc.d目录中的启动和关机脚本中包含了好多有用的(和没用的)系统管理命令。这些命令通常总是被root用户使用。用于系统维护或者是紧急系统文件修复。一定要小心使用这些工具。因为如果滥用的话,它们会损坏你的系统。

3.1. User和Group类

3.1.1. users

显示所有的登录用户。这个命令与who -q基本一致。

[maminjie@fedora ~]$ users
maminjie
[maminjie@fedora ~]$ who -q
maminjie
# users=1

3.1.2. groups

列出当前用户和它所属的组。这相当于$GROUPS内部变量,但是这个命令将给出组名字,而不是数字。

canpool@DESKTOP-ODCM7SC:~$ groups
canpool adm dialout cdrom floppy sudo audio dip video plugdev netdev

3.1.3. chown,chgrp

chown命令将会修改一个或多个文件的所有权。对于root用户来说,如果他想将文件的所有权从一个用户切换到另一个用户的话,那么使用这个命令是非常好的选择。一个普通用户不能修改文件的所有权,即使他是文件的宿主也不行。

chgrp将会修改一个或多个文件的group所有权。但前提是你必须是这些文件的宿主,并且必须是目的组的成员(或者是root),这样你才能够使用这个命令。

3.1.4. useradd,userdel

useradd管理命令将会在系统上添加一个用户账号,并且如果指定的话,还会为特定的用户创建home目录。相应的,userdel命令将会从系统上删除一个用户账号,并且会删除相应的文件。

adduser与useradd理论上是完全相同管道额,adduser通常仅仅是个符号链接。

3.1.5. usermod

修改用户账号。可以修改给定用户账号的密码,组身份,截止日期,或者其它一些属性。使用这个命令,用户的密码可能会被锁定,因为密码会影响到账号的有效性。

3.1.6. groupmod

修改指定组。组名字或者ID号都可以用这个命令来修改。

3.1.7. id

id命令将会列出当前进程真实有效的用户ID,还有用户的组ID。这与Bash内部变量 U I D , UID, UIDEUID和$GROUPS很相像。

canpool@DESKTOP-ODCM7SC:~$ id
uid=1000(canpool) gid=1000(canpool) groups=1000(canpool),4(adm),20(dialout),24(cdrom),25(floppy),27(sudo),29(audio),30(dip),44(video),46(plugdev),114(netdev)
canpool@DESKTOP-ODCM7SC:~$ echo $UID $EUID $GROUPS
1000 1000 1000

id命令只有在有效ID与实际ID不符时,才会显示有效ID。

3.1.8. who

显示系统上所有已经登录的用户。

-m选项将会给出当前用户的详细信息。将任意两个参数传递到who中,等价于who -m,就像who am i或who The man。

whoami与who -m很相似,但是只列出用户名。

[maminjie@fedora ~]$ who
maminjie tty2         2022-04-11 21:15 (tty2)
[maminjie@fedora ~]$ who am i
[maminjie@fedora ~]$ who THe man
[maminjie@fedora ~]$ whoami
maminjie
[maminjie@fedora ~]$

看来并不是所有系统都是这样的。

3.1.9. w

显示所有的登录用户和属于它们的进程。这是一个who命令的扩展版本。w的输出可以通过管道传递到grep命令中,这样就可以查找指定的用户或进程。

[maminjie@fedora ~]$ w
 22:52:17 up  2:43,  1 user,  load average: 0.59, 0.38, 0.23
USER     TTY        LOGIN@   IDLE   JCPU   PCPU WHAT
maminjie tty2      11Apr22  8days  0.23s  0.17s /usr/libexec/gnome-session-binary

3.1.10. logname

显示当前用户的登录名(可以在/var/run/utmp中找到)。这与上边的whoami很相近。

[maminjie@fedora ~]$ logname
maminjie

logname只会打印出登录的用户名,而whoami将会给出附着到当前进程的用户名。

3.1.11. su

使用替换的用户身份来运行一个程序或脚本。su canpool将会以用户canpool的身份来启动shell。使用su命令时,如果不使用任何参数的话,那默认就是root用户。

3.1.12. sudo

以root(或其它用户)的身份来运行一个命令。这个命令可以用在脚本中,这样就允许以正规的用户身份来运行脚本。

文件/etc/sudoers中保存有允许调用sudo命令的用户名。

3.1.13. passwd

设置,修改,或者管理用户的密码。

passwd命令可以用在脚本中,但是估计你不想这么用。

passwd命令的-l,-u和-d选项允许锁定,解锁和删除一个用户的密码。只有root用户可以使用这些选项。

3.1.14. ac

显示用户登录的连接时间,就像从/var/log/wtmp中读取一样。

[maminjie@fedora ~]$ ac
	total    17288.21

3.1.15. last

用户最后登录的信息,就像从/var/log/wtmp中读出来一样。这个命令也可以用来显示远端登录。比如,显示最后几次系统的重启信息:

[maminjie@fedora ~]$ last reboot
reboot   system boot  5.11.12-300.fc34 Mon Apr 11 21:13   still running
reboot   system boot  5.11.12-300.fc34 Tue Mar 22 22:58   still running
...
reboot   system boot  5.11.12-300.fc34 Wed Jun  2 00:29 - 19:54  (19:25)
reboot   system boot  5.11.12-300.fc34 Wed Jun  2 08:07 - 19:54  (11:46)

wtmp begins Wed Jun  2 08:07:52 2021

3.1.16. newgrp

不用登出就可以修改用户的组ID。并且允许访问新组的文件。因为用户可能同时属于多个组,这个命令很少被使用。

3.2. 终端类命令

3.2.1. tty

显示当前用户终端的名字。注意每一个单独的xterm窗口都被算作一个不同的终端。

[maminjie@fedora ~]$ tty
/dev/pts/1

3.2.2. stty

显示并(或)修改终端设置。这个复杂命令可以用在脚本中,并可以用来控制终端的行为和其显示输出的方法。

终端与模式 terminals and modes

一般情况下,一个终端都是工作在canonical(标准)模式下。当用户按键后,事实上所产生的字符并没有马上传递到运行在当前终端上的程序。终端上的一个本地缓存保存了这些按键。当用户按下回车键的时候,才会将所有保存的按键信息传递到运行的程序中。这就意味着在终端内部存在一个基本的行编辑器。

在使用canonical模式的时候,可以对本地终端行编辑器所定义的特殊按键进行重新定义。

控制终端的进程值保存了12个字符(11个字母加上一个换行),虽然用户敲了26个按键。

在non-canonical模式下,每次按键(包括特殊定义的按键,比如ctl-H)都将会立即发送一个字符到控制进程中。

Bash提示符禁用了icanon和echo,因为它用自己的行编辑器代替了中断的基本行编辑器,因为Bash的行编辑器更好。比如,当你在Bash提示符下桥ctl-A的时候,终端将不会显示^A,但是Bash将会获得\1字符,然后解释这个字符,这样光标就移动到行首了。

3.2.3. setterm

设置特定的终端属性。这个命令将向它所在终端的stdout发送一个字符串,这个字符串将修改终端的行为。

3.2.4. tset

显示或初始化终端设置。可以把它看成一个功能比较弱的stty命令。

3.2.5. setserial

设置或者显示串口参数。

3.2.6. getty,agetty

一个终端的初始化过程通常都是使用getty或agetty来建立,这样才能让用户登录。这些命令并不用在用户的shell脚本中。它们的行为与stty很相似。

3.2.7. mesg

启用或禁用当前用户终端的访问权限。禁用访问权限将会阻止网络上的另一用户向这个终端写消息。

当你正在编写文本文件的时候,在文本中间突然来了一个莫名其妙的消息,你会觉得非常烦人。在多用户的网络环境下,如果你不想被打断,那么你必须关闭其他用户对你终端的写权限。

canpool@DESKTOP-ODCM7SC:~$ mesg --help

Usage:
 mesg [options] [y | n]

Control write access of other users to your terminal.

Options:
 -v, --verbose  explain what is being done
 -h, --help     display this help
 -V, --version  display version

For more details see mesg(1).

3.2.8. wall

这是一个缩写单词“write all”,也就是,向登录到网络上的所有终端的所有用户都发送一个消息。最早就是一个管理员的工具,很有用,比如,当系统有问题的时候,管理可以警告系统上的所有人暂时离开。

如果某个特定终端使用mesg来禁止了写权限,那么wall将不会给它发消息。

3.3. 信息与统计类

3.3.1. uname

显示系统信息(OS,内核版本等)。输出到stdout上。使用-a选项,将会给出详细的系统信息。使用-s选项只会输出OS类型。

[maminjie@fedora ~]$ uname -a
Linux fedora 5.11.12-300.fc34.x86_64 #1 SMP Wed Apr 7 16:31:13 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux
[maminjie@fedora ~]$ uname -s
Linux

3.3.2. arch

显示系统的硬件体系架构。等价于uname -m。

3.3.3. lastcomm

给出前一个命令的信息,存储在/var/account/pacct文件中。命令名字和用户名字都可以通过选项来指定。

3.3.4. lastlog

列出系统上所有用户最后登录的时间。然后保存到/var/log/lastlog文件中。

[maminjie@fedora ~]$ lastlog
Username         Port     From             Latest
root             pts/0                     Tue Jun 15 23:31:26 +0800 2021
bin                                        **Never logged in**
daemon                                     **Never logged in**
...
systemd-coredump                           **Never logged in**
systemd-resolve                            **Never logged in**
systemd-oom                                **Never logged in**
systemd-timesync                           **Never logged in**
...
gdm              tty1                      Mon Apr 11 21:13:51 +0800 2022
gnome-initial-setup tty1                      Wed Jun  2 08:08:02 +0800 2021
vboxadd                                    **Never logged in**
sshd                                       **Never logged in**
tcpdump                                    **Never logged in**
maminjie         tty2                      Mon Apr 11 21:15:23 +0800 2022

如果用户对于文件/var/log/lastlog没有读权限的话,那么调用这个命令就会失败。

3.3.5. lsof

列出打开的文件。这个命令将会把素有当前打开的文件都列出到一份详细的表格中,包括文件的宿主信息,尺寸,还有与它们相关的信息等等。当然,lsof也可以通过管道输出到grep和(或)awk中,来分析它的内容。

3.3.6. strace

系统跟踪(System trace): 是跟踪系统调用和信号的诊断和调试工具. 如果你想了解特定的程序或者工具包为什么运行失败的话, 那么这个命令和下边的ltrace命令就显得非常有用了, 当然, 这种失败现象可能是由缺少相关的库, 或者其他问题所引起.

canpool@DESKTOP-ODCM7SC:~/work$ strace ./hello
execve("./hello", ["./hello"], 0x7ffff7eb90d0 /* 19 vars */) = 0
brk(NULL)                               = 0x7ffff1c26000
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=39851, ...}) = 0
mmap(NULL, 39851, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fab43d65000
close(3)                                = 0
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\260\34\2\0\0\0\0\0"...,                                                                                                                                                          832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=2030544, ...}) = 0
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fa                                                                                                                                                         b43d60000
mmap(NULL, 4131552, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f                                                                                                                                                         ab43600000
mprotect(0x7fab437e7000, 2097152, PROT_NONE) = 0
mmap(0x7fab439e7000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENY                                                                                                                                                         WRITE, 3, 0x1e7000) = 0x7fab439e7000
mmap(0x7fab439ed000, 15072, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANON                                                                                                                                                         YMOUS, -1, 0) = 0x7fab439ed000
close(3)                                = 0
arch_prctl(ARCH_SET_FS, 0x7fab43d614c0) = 0
mprotect(0x7fab439e7000, 16384, PROT_READ) = 0
mprotect(0x7fab44000000, 4096, PROT_READ) = 0
mprotect(0x7fab43c27000, 4096, PROT_READ) = 0
munmap(0x7fab43d65000, 39851)           = 0
fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 0), ...}) = 0
brk(NULL)                               = 0x7ffff1c26000
brk(0x7ffff1c47000)                     = 0x7ffff1c47000
write(1, "hello shell\n", 12hello shell
)           = 12
exit_group(0)                           = ?
+++ exited with 0 +++

3.3.7. ltrace

库跟踪工具(Library trace): 跟踪给定命令的调用库的相关信息。

canpool@DESKTOP-ODCM7SC:~/work$ ltrace ./hello
puts("hello shell"hello shell
)                              = 12
+++ exited (status 0) +++

3.3.8. nmap

网络映射(Network mapper)与端口扫描程序。这个命令将会扫描一个服务器来定位打开的端口,并且定位于这些端口相关的服务。这个命令也能够上报一些包过滤与防火墙的信息。这是一个防止网络被黑客入侵的非常重要的安全工具。

3.3.9. nc

nc(netcat)工具时一个完整的工具包,可以用它连接和监听TCP和UDP端口。它能作为诊断和测试工具,也能作为基于脚本的HTTP客户端和服务器组件。

3.3.10. free

使用表格形式来显示内存和缓存的使用情况. 这个命令的输出非常适合于使用grep, awk或者Perl来分析. procinfo将会显示free命令所能显示的所有信息, 而且更加详细。

canpool@DESKTOP-ODCM7SC:~$ free
              total        used        free      shared  buff/cache   available
Mem:       16632916    11004396     5399168       17720      229352     5494788
Swap:      31093884      292588    30801296

3.3.11. procinfo

从/proc pseudo-filesystem中提取并显示所有信息和统计资料。这个命令将给出更详细的信息。

3.3.12. lsdev

列出系统设备,也就是显示所有安装的硬件。

3.3.13. du

递归的显示(磁盘)文件的使用状况. 除非特殊指定, 否则默认是当前工作目录.

3.3.14. df

使用列表的形式显示文件系统的使用状况.

3.3.15. dmesg

将所有的系统启动消息输出到stdout上。方便除错,并且可以查出安装了哪些设备驱动和查看使用了哪些系统终端。dmesg命令的输出当然也放在脚本中,并使用grep,sed或awk来进行分析。

3.3.16. stat

显示一个或多个给定文件(也可以是目录文件或设备文件)的详细统计信息(statistic).

3.3.17. vmstat

显示虚拟内存的统计信息.

[maminjie@fedora ~]$ vmstat
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 0  0   7936 314512    588 1428284    0    0    16    22  234  143  4  4 91  1  0

3.3.18. netstat

显示当前网络的统计状况和信息,比如路由表和激活的连接,这个工具将访问/proc/net中的信息。

netstat -r等价于route命令。

3.3.19. uptime

显示系统运行的时间, 还有其他的一些统计信息。

3.3.20. hostname

显示系统的主机名字。这个命令在/etc/rc.d安装脚本(或类似的/etc/rc.d/rc.sysinit)中设置主机命令。等价于uname -n,并且与$HOSTNAME内部变量很相像。

与hostname命令很相像的命令还有domainname,dnsdomainname,nisdomainname,ypdomainame命令。使用这些命令来显示(或设置)系统DNS或NIS/YP域名。对于hostname命令来说,使用不同的选项就可以分别达到上边这些命令的目的。

3.3.21. hostid

用16进制表示法来显示主机的32位ID。

canpool@DESKTOP-ODCM7SC:~$ hostid
007f0101

这个命令据说对于特定系统可以获得一个“唯一”的序号。某些产品的注册过程可能会需要这个序号来作为用户的许可证。不幸的是,hostid只会使用字节对转换的方法来返回机器的网络地址,网络地址用16进程表示。

对于一个典型的没有网络的Linux机器来说,它的网络地址保存在/etc/hosts中。

canpool@DESKTOP-ODCM7SC:~$ cat /etc/hosts
# This file was automatically generated by WSL. To stop automatic generation of this file, add the following entry to /etc/wsl.conf:
# [network]
# generateHosts = false
127.0.0.1       localhost
127.0.1.1       DESKTOP-ODCM7SC.localdomain     DESKTOP-ODCM7SC

# The following lines are desirable for IPv6 capable hosts
::1     ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

3.3.22. sar

sar(System Activity Reporter系统活动报告)命令将会给出系统统计的一个非常详细的概要。Santa Cruz Operation(以前的SCO)公司在1999年4月份以开源软件的形式发布了sar。

这个命令并不是基本Linux发行版的一部分,但是你可以从sysstat utilities所编写的Sebastien Godard包中获得这个工具。

3.3.23. readelf

这个命令会显示elf格式的二进制文件的统计信息。

3.3.24. size

size [/path/to/binary]命令可以显示2进制可执行文件或归档文件每部分的尺寸. 这个工具主要提供给程序员使用。

3.4. 系统日志类

3.4.1. logger

附加一个用户产生的消息到系统日志中(/var/log/message)。即使不是root用户,也可以调用logger。

3.4.2. logrotate

这个工具用来管理系统的log文件,可以在合适的时候轮换,压缩,删除,或(和)e-mail它们。这个工具将从就的log文件中获得一些杂乱的记录,并保存到/var/log中。一般的,每天都是通过cron来运行logrotate。

在/etc/logrotate.conf中添加合适的入口就可以管理自己的log文件了,就像管理系统log文件一样。

Stefano Falsetto创造了rottlog,他认为这是logrotate的改进版本。

3.5. 作业控制类

3.5.1. ps

进程统计(process statistics):通过进程宿主或PID(进程ID)来列出当前正在执行的进程。通常都是使用ax或aux选项来调用这个命令,并且结果可以通过管道传递到grep或sed中来搜索特定的进程。

如果你想使用“树”的形式来显示系统进程:那么就使用ps afjx或ps ax --forest。

3.5.2. pgrep,pkill

ps命令可以与grep或kill结合使用。

3.5.3. pstree

使用“树”形式列出当前执行的进程。-p选项显示PID,也就是进程名字。

canpool@DESKTOP-ODCM7SC:~$ pstree
init─┬─2*[init───wsltermd───bash]
     ├─init───wsltermd───bash───pstree
     └─{init}
canpool@DESKTOP-ODCM7SC:~$ pstree -p
init(1)─┬─init(10)───wsltermd(12)───bash(14)
        ├─init(11)───wsltermd(13)───bash(15)───pstree(243)
        ├─init(63)───wsltermd(64)───bash(65)
        └─{init}(9)

3.5.4. top

连续不断的显示cpu占有率最高的进程。-b选项将会以文本方式来显示,以便于可以在脚本中进行分析或访问。

canpool@DESKTOP-ODCM7SC:~$ top -b
top - 00:12:01 up  1:48,  0 users,  load average: 0.52, 0.58, 0.59
Tasks:  11 total,   1 running,  10 sleeping,   0 stopped,   0 zombie
%Cpu(s): 31.9 us, 25.6 sy,  0.0 ni, 42.1 id,  0.0 wa,  0.4 hi,  0.0 si,  0.0 st
KiB Mem : 16632916 total,  5502868 free, 10900696 used,   229352 buff/cache
KiB Swap: 31093884 total, 30784728 free,   309156 used.  5598488 avail Mem

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
    1 root      20   0    8940    332    284 S   0.0  0.0   0:01.84 init
   10 root      20   0    8952    240    200 S   0.0  0.0   0:00.01 init
   11 root      20   0    8952    240    200 S   0.0  0.0   0:00.03 init
   12 canpool   20   0   10860    860    808 S   0.0  0.0   0:00.29 wsltermd
   13 canpool   20   0   10860    932    796 S   0.0  0.0   0:00.81 wsltermd
   14 canpool   20   0   16680   3264   1924 S   0.0  0.0   0:00.63 bash
   15 canpool   20   0   17200   3560   3428 S   0.0  0.0   0:01.64 bash
   63 root      20   0    8952    240    200 S   0.0  0.0   0:00.01 init
   64 canpool   20   0   10860    856    800 S   0.0  0.0   0:00.26 wsltermd
   65 canpool   20   0   16812   3340   3164 S   0.0  0.0   0:00.60 bash
  244 canpool   20   0   17492   1896   1420 R   0.0  0.0   0:00.16 top

3.5.5. nice

使用经过修改的优先级来运行一个后台作业。优先级从19(最低)到-20(最高)只有root用户可以设置负的(相对比较高的)优先级。相关的命令还有renice,snice和skill。

3.5.6. nohup

保持一个命令进程处于运行状态,即使这个命令进程所属的用户登出系统。这个命令进程将会运行在前台,除非在它前面加上&。如果你在脚本中使用nohup命令,那么你最好同时使用wait命令,这样就可以避免产生孤儿进程或僵尸进程。

3.5.7. pidof

获取一个正在运行作业的进程ID(PID)。因为一些作业控制命令,比如kill和renice只能使用进程的PID(而不是它的名字)作为参数,所有有的时候必须得取得PID。pidof命令与$PPID内部变量非常相似。

canpool@DESKTOP-ODCM7SC:~$ ps
  PID TTY          TIME CMD
   15 pts/1    00:00:01 bash
  245 pts/1    00:00:00 ps
canpool@DESKTOP-ODCM7SC:~$ pidof bash
65 15 14

3.5.8. fuser

获取一个正在访问某个或某些文件(或目录)的进程ID。使用-k选项将会kill这些进程。对于系统安全来说,尤其是在脚本中想组织未被授权的用户访问系统服务的时候,这个命令就显得非常有用了。

canpool@DESKTOP-ODCM7SC:~$ fuser -u /bin/bash
Cannot open /proc/net/unix: No such file or directory
/bin/bash:              14e(canpool)    15e(canpool)    65e(canpool)

在进行正常插入或删除保存的媒体(比如CD ROM或者USB闪存设备)的时候,fuser命令非常的有用。某些情况下,也就是当你umount一个设备失败的时候,会出现设备忙错误消息。这意味着某些用户或进程正在访问这个设备。可以使用fuser -um /dev/device_name来解决这个问题,这就你就可以kill所有相关的进程。

fuser命令的-n选项可以获得正在访问某一端口的进程。当和nmap命令结合使用的时候尤其有用。

root# nmap localhost.localdomain
PORT STATE SERVICE
25/tcp open smtp

root# fuser -un tcp 25
25/tcp:     2095(root)

3.5.9. cron

管理程序调度器,用来执行一些日常任务,比如清除和删除系统log文件,或者更新slocate数据库。这是at命令的超级用户版本(虽然每个用户都可以有自己的crontab文件,并且这个文件可以使用crontab命令来修改)。它以幽灵进程的身份来运行,并且从/etc/crontab中获得执行的调度入口。

一般Linux风格的系统都是用crond。

3.6. 启动与进程控制类

最新的系统中一般已经使用systemd来取代了init进程,相关服务控制也由systemctl来处理。

3.6.1. init

init命令是所有进程的父进程。在系统启动的最后一步调用。init将会依据/etc/inittab来决定系统的运行级别。只能使用root身份来运行它的别名telinit。

3.6.2. telinit

init命令的符号链接,这是一种修改系统运行级别的手段,通常在系统维护的时候,或者在紧急的文件系统修复的时候才能用。只能使用root身份调用。调用这个命令是非常危险的,在你使用之前确定你已经很好的了解它!

3.6.3. runlevel

显示当前的和最后的运行级别,也就是,判断系统是处于终止状态(runlevel为0),单用户模式(1),多用户模式(2或3),X Windows(5),还是处于重启状态(6)。这个命令将会访问/var/run/utmp文件。

3.6.4. halt,shutdown,reboot

设置系统关机的命令,通常比电源关机的优先级高。

3.6.5. service

开启或停止一个系统服务。在/etc/init.d和/etc/rc.d中的启动脚本使用这个命令来启动服务。

3.7. 网络类

3.7.1. ifconfig

网络的接口配置和调试工具。

ifconfig命令绝大多数情况都是在启动的时候设置接口,或者在重启的时候关闭它们。

3.7.2. iwconfig

这是为了配置无线网络的命令集合。可以说是上边的ifconfig的无线版本。

3.7.3. route

显示内核路由表信息,或者查看内核路由表的修改情况。

canpool@DESKTOP-ODCM7SC:~$ route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.178.0   0.0.0.0         255.255.255.0   U     256    0        0 eth2
192.168.178.1   0.0.0.0         255.255.255.255 U     256    0        0 eth2
192.168.178.255 0.0.0.0         255.255.255.255 U     256    0        0 eth2
224.0.0.0       0.0.0.0         240.0.0.0       U     256    0        0 eth2
255.255.255.255 0.0.0.0         255.255.255.255 U     256    0        0 eth2
192.168.84.0    0.0.0.0         255.255.255.0   U     256    0        0 eth3
192.168.84.1    0.0.0.0         255.255.255.255 U     256    0        0 eth3
192.168.84.255  0.0.0.0         255.255.255.255 U     256    0        0 eth3
224.0.0.0       0.0.0.0         240.0.0.0       U     256    0        0 eth3
255.255.255.255 0.0.0.0         255.255.255.255 U     256    0        0 eth3
100.100.0.10    0.0.0.0         255.255.255.255 U     1      0        0 lo
127.0.0.0       0.0.0.0         255.0.0.0       U     256    0        0 lo
127.0.0.1       0.0.0.0         255.255.255.255 U     256    0        0 lo
127.255.255.255 0.0.0.0         255.255.255.255 U     256    0        0 lo
224.0.0.0       0.0.0.0         240.0.0.0       U     256    0        0 lo
255.255.255.255 0.0.0.0         255.255.255.255 U     256    0        0 lo
0.0.0.0         192.168.31.1    255.255.255.255 U     0      0        0 wifi0
192.168.31.0    0.0.0.0         255.255.255.0   U     256    0        0 wifi0
192.168.31.237  0.0.0.0         255.255.255.255 U     256    0        0 wifi0
192.168.31.255  0.0.0.0         255.255.255.255 U     256    0        0 wifi0
224.0.0.0       0.0.0.0         240.0.0.0       U     256    0        0 wifi0
255.255.255.255 0.0.0.0         255.255.255.255 U     256    0        0 wifi0

3.7.4. chkconfig

检查网络配置。这个命令负责显示和管理在启动过程中所开启的网络服务(这些服务都是从/etc/rc?.d目录中开启的)。

3.7.5. tcpdump

网络包的“嗅探器”。这是一个用来分析和调试网络上传输情况的工具,它所使用的手段是把所有匹配指定规则的包头都显示出来。

3.8. 文件系统类

3.8.1. mount

加载一个文件系统,通常都用来安装外部设备,比如软盘或CDROM。文件/etc/fstab将会提供一个方便的列表,这个列表列出了所有可用的文件系统,分区和设备,另外还包括某些选项,比如是否可以自动或者手动的mount。文件/etc/mtab显示了当前已经mount的文件系统和分区(包括虚拟的,比如/proc)。

mount -a将会mount所有出现在/etc/fstab中的文件系统和分区,除了那些标记由noauto(非自动)选项的。启动的时候,在/etc/rc.d中的一个启动脚本(rc.sysinit或者一些相似的脚本)将会调用mount -a,目的是mount所有可用的文件系统和分区。

canpool@DESKTOP-ODCM7SC:~$ mount -l
rootfs on / type lxfs (rw,noatime)
none on /dev type tmpfs (rw,noatime,mode=755)
sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,noatime)
proc on /proc type proc (rw,nosuid,nodev,noexec,noatime)
devpts on /dev/pts type devpts (rw,nosuid,noexec,noatime,gid=5,mode=620)
none on /run type tmpfs (rw,nosuid,noexec,noatime,mode=755)
none on /run/lock type tmpfs (rw,nosuid,nodev,noexec,noatime)
none on /run/shm type tmpfs (rw,nosuid,nodev,noatime)
none on /run/user type tmpfs (rw,nosuid,nodev,noexec,noatime,mode=755)
binfmt_misc on /proc/sys/fs/binfmt_misc type binfmt_misc (rw,relatime)
tmpfs on /sys/fs/cgroup type tmpfs (rw,nosuid,nodev,noexec,relatime,mode=755)
cgroup on /sys/fs/cgroup/devices type cgroup (rw,nosuid,nodev,noexec,relatime,devices)
C:\ on /mnt/c type drvfs (rw,noatime,uid=1000,gid=1000,case=off)
D:\ on /mnt/d type drvfs (rw,noatime,uid=1000,gid=1000,case=off)
E:\ on /mnt/e type drvfs (rw,noatime,uid=1000,gid=1000,case=off)
F:\ on /mnt/f type drvfs (rw,noatime,uid=1000,gid=1000,case=off)

3.8.2. umount

卸除一个当前已经mount的文件系统。在删除已经mount上的软盘或CDROM之前,这个设备必须被umount,否则文件系统将会被损坏。

automount工具,如果对这个工具进行了适当的安装,那么当需要访问或退出磁盘的时候,就能够自动的mount和umount它们了。但是如果在带有软驱或光驱的笔记本电脑上使用的话,可能会引起问题。

3.8.3. sync

当你需要更新硬盘buffer中的数据时, 这个命令可以强制将你buffer上的数据立即写入到硬盘上(同步带有buffer的驱动器). 在某些情况下, 一个sync命令可能会挽救你刚刚更新的数据, 比如说突然断电, 所以这个命令可以给系统管理员和普通用户一些保障. 以前, 系统重启前都使用sync; sync (两次, 为了保证绝对可靠), 这是一种谨慎小心的可靠方法.

某些时候, 比如说当你想安全删除文件的时候, 或者当磁盘灯开始闪烁的时候, 你可能需要强制对buffer进行立即刷新.

3.8.4. losetup

建立和配置loopback设备.

3.8.5. mkswap

创建一个交换分区或文件. 交换区域随后必须马上使用swapon来启用.

3.8.6. swapon, swapoff

启用/禁用交换分区或文件. 这两个命令通常在启动和关机的时候才有效.

3.8.7. mke2fs

创建Linux ext2文件系统. 这个命令必须以root身份调用.

3.8.8. tune2fs

调整ext2文件系统. 可以用来修改文件系统参数, 比如mount的最大数量. 必须以root身份调用.

这是一个非常危险的命令. 一旦用错, 你需要自己负责, 因为它可能会破坏你的文件系统.

3.8.9. dumpe2fs

打印(输出到stdout)非常详细的文件系统信息. 必须以root身份调用.

3.8.10. hdparm

显示或修改硬盘参数. 这个命令必须以root身份调用, 如果滥用的话会有危险.

3.8.11. fdisk

在存储设备上(通常都是硬盘)创建和修改一个分区表. 必须以root身份使用.

谨慎使用这个命令. 如果出错, 会破坏你现存的文件系统.

3.8.12. fsck, e2fsck, debugfs

文件系统的检查, 修复, 和除错命令集合.

fsck: 检查UNIX文件系统的前端工具(也可以调用其它的工具). 文件系统的类型一般都是默认的ext2.

e2fsck: ext2文件系统检查器.

debugfs: ext2文件系统除错器. 这个功能多 - 并且危险的工具, 主要用处之一就是(尝试)恢复删除的文件. 只有高级用户才能用!

上边的这几个命令都必须以root身份调用, 这些命令都很危险, 如果滥用的话会破坏文件系统.

3.8.13. badblocks

检查存储设备的坏块(物理损坏). 这个命令在格式化新安装的硬盘时候, 或者在测试"备份媒体"完整性的时候会被用到. [4] 举个例子, badblocks /dev/fd0用来测试软盘.

如果badblocks使用不慎的话, 可能会引起比较糟糕的结果(覆盖所有数据), 但是在只读模式下就不会发生这种情况. 如果root用户要测试某个设备(这是通常情况), 那么root用户必须使用这个命令.

3.8.14. lsusb, usbmodules

lsusb命令会显示所有USB(Universal Serial Bus通用串行总线)总线和使用USB的设备.

usbmodules命令会输出连接USB设备的驱动模块的信息.

3.8.15. lspci

显示pci总线及其设备.

3.8.16. mkbootdisk

创建启动软盘, 启动盘可以唤醒系统, 比如当MBR(master boot record主启动记录)坏掉的时候.mkbootdisk命令其实是一个Bash脚本, 由Erik Troan所编写, 放在/sbin目录中.

3.8.17. chroot

修改ROOT目录. 一般的命令都是从$PATH中获得的, 相对的, 默认根目录是 /. 这个命令将会把根目录修改为另一个目录(并且也将把工作目录修改到那). 这个命令对于安全目的非常有用, 举个例子, 某些情况下, 系统管理员希望限制一些特定的用户, 比如那些telnet上来的用户, 将他们限定到文件系统上一个安全的地方(有时候, 这被称为将一个guest用户限制在"chroot监牢"中). 注意, 在使用chroot命令后, 系统的二进制可执行文件的目录就不再可用了.

chroot /opt将会使得原来的/usr/bin变为/opt/usr/bin. 同样, chroot /aaa/bbb /bin/ls将会使得ls命令以/aaa/bbb作为根目录, 而不是之前的/. 如果使用alias XX ‘chroot /aaa/bbb ls’,并把这句放到用户的~/.bashrc文件中的话, 这样可以有效地限制运行命令"XX"时, 命令"XX"可以使用文件系统的范围.

当从启动盘恢复的时候(chroot到/dev/fd0), 或者当系统从死机状态恢复过来并作为lilo选项的时候, chroot命令都是非常方便的. 其它的应用还包括从不同的文件系统进行安装(一个rpm选项)或者从CDROM上运行一个只读文件系统. 只能以root身份调用, 小心使用.

由于正常的$PATH不再被关联, 所以可能需要将一些特定的系统文件拷贝到chroot之后的目录中。

3.8.18. lockfile

这个工具是procmail包的一部分(www.procmail.org). 它可以创建一个锁定文件, 锁定文件是一种用来控制访问文件, 设备或资源的标记文件. 锁定文件就像一个标记一样被使用, 如果特定的文件, 设备, 或资源正在被一个特定的进程所使用(“busy”), 那么对于其它进程来说, 就只能进行受限访问(或者不能访问).

锁定文件用在一些特定的场合, 比如说保护系统的mail目录以防止多个用户同时修改, 或者提示一个modem端口正在被访问, 或者显示Netscape的一个实例正在使用它的缓存. 脚本可以做一些检查工作, 比如说一个特定的进程可以创建一个锁定文件, 那么只要检查这个特定的进程是否在运行, 就可以判断出锁定文件是否存在了. 注意如果脚本尝试创建一个已经存在的锁定文件的话,那么脚本很可能被挂起.

一般情况下, 应用对于锁定文件的创建和检查都放在/var/lock目录中。

3.8.19. flock

flock命令不像lockfile那么有用. 它在一个文件上设置一个"咨询性"的锁, (译者注: "咨询性"的锁有时也称为"建议性"的锁, 这种锁只对协同进程起作用, 还有一种锁叫"强制性"锁, 这种锁加锁的对象读写操作都会由内核做检查, 更多的细节请参考flock(1), flock(2), /usr/src/linux/Documentation/locks.txt和mandatory.txt), 然后在锁持续的期间可以执行一个命令. 这样可以避免这个命令完成前有另外的进程试图在这个文件上设置锁.

与lockfile不同, flock不会自动创建一个锁定文件.

3.8.20. mknod

创建块或者字符设备文件(当在系统上安装新硬盘时, 必须这么做). MAKEDEV工具事实上具有mknod的全部功能, 而且更容易使用.

3.8.21. MAKEDEV

创建设备文件的工具. 必须在/dev目录下, 并且以root身份使用.

root# ./MAKEDEV

这是mknod的高级版本.

3.8.22. tmpwatch

自动删除在指定时间内未被访问过的文件. 通常都是被cron调用, 用来删掉旧的log文件.

3.9. 备份类

3.9.1. dump, restore

dump命令是一个精巧的文件系统备份工具, 通常都用在比较大的安装版本和网络上. [6] 它读取原始的磁盘分区并且以二进制形式来写备份文件. 需要备份的文件可以保存到各种各样的存储设备上, 包括磁盘和磁带. restore命令用来恢复 dump所产生的备份.

3.9.2. fdformat

对软盘进行低级格式化.

3.10. 系统资源类

3.10.1. ulimit

设置系统资源的使用上限. 通常情况下都是使用-f选项来调用, -f用来设置文件尺寸的限制(ulimit -f 1000就是将文件大小限制为1M). -c(译者注: 这里应该是作者笔误, 作者写的是-t)选项来限制coredump尺寸(ulimit -c 0就是不要coredump). 一般情况下, ulimit的值应该设置在/etc/profile和(或)~/.bash_profile中.

合理的使用ulimit命令可以保护系统免受可怕的fork炸弹的迫害.

3.10.2. quota

显示用户或组的磁盘配额.

3.10.3. setquota

从命令行中设置用户或组的磁盘配额.

3.10.4. umask

设定用户创建文件时缺省的权限mask(掩码). 也可以用来限制特定用户的默认文件属性. 所有用户创建的文件属性都是由umask所指定的. 传递给umask命令的值(8进制)定义了文件的屏蔽权限.比如, umask 022将会使得新文件的权限最多为755(777与022进行"与非"操作). 当然, 用户随后可以使用chmod来修改指定文件的属性. 用户一般都将设置umask值得地方放在/etc/profile或(和)~/.bash_profile中。

3.10.5. rdev

取得root device, swap space, 或video mode的相关信息, 或者对它们进行修改. 一般情况下,rdev的功能都是被lilo所使用, 但是在建立一个ram disk的时候, 这个命令也很有用. 小心使用, 这是一个危险的命令.

3.11. 模块类

3.11.1. lsmod

显示所有安装的内核模块. 使用cat /proc/modules可以得到同样的结果.

3.11.2. insmod

强制安装一个内核模块(如果可能的话, 使用modprobe来代替). 必须以root身份调用.

3.11.3. rmmod

强制卸载一个内核模块. 必须以root身份调用.

3.11.4. modprobe

模块装载器, 一般情况下都是在启动脚本中自动调用. 必须以root身份来运行.

3.11.5. depmod

创建模块依赖文件, 一般都是在启动脚本中调用.

3.11.6. modinfo

输出一个可装载模块的信息.

3.12. 杂项类

3.12.1. env

使用设置过的或修改过(并不是修改整个系统环境)的环境变量来运行一个程序或脚本. 使用[varname=xxx]形式可以在脚本中修改环境变量. 如果没有指定参数, 那么这个命令将会显示所有设置的环境变量.

3.12.2. ldd

显示一个可执行文件和它所需要共享库之间依赖关系.

3.12.3. watch

以指定的时间间隔来重复运行一个命令。默认的时间间隔是2秒, 但是可以使用-n选项进行修改。

3.12.4. strip

从可执行文件中去掉调试符号的引用. 这样做可以减小可执行文件的尺寸, 但是就不能调试了.
这个命令一般都用在Makefile中, 但是很少用在shell脚本中.

3.12.5. nm

列出未strip过的, 经过编译的, 2进制文件的全部符号。

3.12.6. rdist

远程分布客户端: 在远端服务器上同步, 克隆, 或者备份一个文件系统.

4. 参考

  • 高级Bash脚本编程指南(Advanced Bash-Scripting Guide)(Mendel Cooper 著,杨春敏 黄毅 译)
  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值