The Linux Command Line 前 11 章内容摘录

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/panshiqu/article/details/82878303

摘自The Linux Command Line中文翻译,主要供本人快速回顾,不太建议未阅读过TLCL的朋友浏览本篇文章

graphical user interfaces make easy tasks easy, while command line interfaces make difficult tasks possible

图形用户界面让简单的任务更容易完成,而命令行界面使完成复杂的任务成为可能

表3-1: cd 快捷键
快捷键 运行结果
cd 更改工作目录到你的家目录。
cd - 更改工作目录到先前的工作目录。
cd ~user_name 更改工作目录到用户家目录。例如, cd ~bob 会更改工作目录到用户“bob”的家目录。

大多数命令使用的选项,是由一个中划线加上一个字符组成,例如,“-l”,但是许多命令,包括来自于 GNU 项目的命令,也支持长选项,长选项由两个中划线加上一个字组成。当然,许多命令也允许把多个短选项串在一起使用。下面这例子,ls 命令有两个选项,“l” 选项产生长格式输出,“t”选项按文件修改时间的先后来排序。加上长选项 “--reverse”,则结果会以相反的顺序输出

表 4-1: ls 命令选项
选项 长选项 描述
-a --all 列出所有文件,甚至包括文件名以圆点开头的默认会被隐藏的隐藏文件。
-d --directory 通常,如果指定了目录名,ls 命令会列出这个目录中的内容,而不是目录本身。 把这个选项与 -l 选项结合使用,可以看到所指定目录的详细信息,而不是目录中的内容。
-F --classify 这个选项会在每个所列出的名字后面加上一个指示符。例如,如果名字是 目录名,则会加上一个'/'字符。
-h --human-readable 当以长格式列出时,以人们可读的格式,而不是以字节数来显示文件的大小。
-l 以长格式显示结果。
-r --reverse 以相反的顺序来显示结果。通常,ls 命令的输出结果按照字母升序排列。
-S 命令输出结果按照文件大小来排序。
-t 按照修改时间来排序。

file filename 确定文件类型

everything is a file. 一切皆文件

表5-1: 通配符
通配符 意义
* 匹配任意多个字符(包括零个或一个)
? 匹配任意一个字符(不包括零个)
[characters] 匹配任意一个属于字符集中的字符
[!characters] 匹配任意一个不是字符集中的字符
[[:class:]] 匹配任意一个属于指定字符类中的字符
表5-2: 普遍使用的字符类
字符类 意义
[:alnum:] 匹配任意一个字母或数字
[:alpha:] 匹配任意一个字母
[:digit:] 匹配任意一个数字
[:lower:] 匹配任意一个小写字母
[:upper:] 匹配任意一个大写字母

mkdir directory…

注意表示法: 在描述一个命令时(如上所示),当有三个圆点跟在一个命令的参数后面,这意味着那个参数可以重复

表5-4: cp 选项
选项 意义
-a, --archive 复制文件和目录,以及它们的属性,包括所有权和权限。 通常,复本具有用户所操作文件的默认属性。
-i, --interactive 在重写已存在文件之前,提示用户确认。如果这个选项不指定, cp 命令会默认重写文件。
-r, --recursive 递归地复制目录及目录中的内容。当复制目录时, 需要这个选项(或者-a 选项)。
-u, --update 当把文件从一个目录复制到另一个目录时,仅复制 目标目录中不存在的文件,或者是文件内容新于目标目录中已经存在的文件。
-v, --verbose 显示翔实的命令操作信息
表5-6: mv 选项
选项 意义
-i --interactive 在重写一个已经存在的文件之前,提示用户确认信息。 如果不指定这个选项,mv 命令会默认重写文件内容。
-u --update 当把文件从一个目录移动另一个目录时,只是移动不存在的文件, 或者文件内容新于目标目录相对应文件的内容。
-v --verbose 当操作 mv 命令时,显示翔实的操作信息。
表5-8: rm 选项
选项 意义
-i, --interactive 在删除已存在的文件前,提示用户确认信息。 如果不指定这个选项,rm 会默默地删除文件
-r, --recursive 递归地删除文件,这意味着,如果要删除一个目录,而此目录 又包含子目录,那么子目录也会被删除。要删除一个目录,必须指定这个选项。
-f, --force 忽视不存在的文件,不显示提示信息。这选项覆盖了“--interactive”选项。
-v, --verbose 在执行 rm 命令时,显示翔实的操作信息。

对于符号链接,有一点值得记住,执行的大多数文件操作是针对链接的对象,而不是链接本身。而 rm 命令是个特例。当你删除链接的时候,删除链接本身,而不是链接的对象。

bash 有一个内建的帮助工具,可供每一个 shell 内建命令使用。输入“help”,接着是 shell 内部命令名。例如:help cd

注意表示法: 出现在命令语法说明中的方括号,表示可选的项目。一个竖杠字符表示互斥选项。在上面 cd 命令的例子中:cd [-L|-P] [dir]

许多可执行程序支持一个 --help 选项,这个选项是显示命令所支持的语法和选项说明。例如:mkdir --help

许多希望被命令行使用的可执行程序,提供了一个正式的文档,叫做手册或手册页(man page)。一个特殊的叫做 man 的分页程序,可用来浏览他们。它是这样使用的:man program

表6-1: 手册页的组织形式
章节 内容
1 用户命令
2 程序接口内核系统调用
3 C 库函数程序接口
4 特殊文件,比如说设备结点和驱动程序
5 文件格式
6 游戏娱乐,如屏幕保护程序
7 其他方面
8 系统管理员命令

有时候,我们需要查看参考手册的特定章节,从而找到我们需要的信息。如果我们要查找一种文件格式,而同时它也是一个命令名时,这种情况尤其正确:man 5 passwd

alias name=‘string’ 在命令"alias"之后,输入“name”,紧接着(没有空格)是一个等号,等号之后是一串用引号引起的字符串,字符串的内容要赋值给 name。我们定义了别名之后,这个命令别名可以使用在任何地方

如果我们需要清空一个文件内容(或者创建一个新的空文件),可以使用这样的技巧:> empty.txt

shell 使用文件描述符提供了一种表示法来重定向文件。因为标准错误和文件描述符2一样,我们用这种表示法来重定向标准错误:ls -l /bin/usr 2> ls-error.txt

可能有这种情况,我们希望捕捉一个命令的所有输出到一个文件。为了完成这个,我们必须同时重定向标准输出和标准错误。有两种方法来完成任务。第一个,传统的方法,在旧版本 shell 中也有效:ls -l /bin/usr > ls-output.txt 2>&1,使用这种方法,我们完成两个重定向。首先重定向标准输出到文件 ls-output.txt,然后重定向文件描述符2(标准错误)到文件描述符1(标准输出)使用表示法2>&1。

现在的 bash 版本提供了第二种方法,更精简合理的方法来执行这种联合的重定向。ls -l /bin/usr &> ls-output.txt

我们不想要一个命令的输出结果,只想把它们扔掉。这种情况尤其适用于错误和状态信息。系统通过重定向输出结果到一个叫做"/dev/null"的特殊文件,为我们提供了解决问题的方法。这个文件是系统设备,叫做位存储桶,它可以接受输入,并且对输入不做任何处理。为了隐瞒命令错误信息,我们这样做:ls -l /bin/usr 2> /dev/null

cat 经常被用来显示简短的文本文件。因为 cat 可以接受不只一个文件作为参数,所以它也可以用来把文件连接在一起。比方说我们下载了一个大型文件,这个文件被分离成多个部分(USENET 中的多媒体文件经常以这种方式分离),我们想把它们连起来。如果文件命名为:movie.mpeg.001 movie.mpeg.002 … movie.mpeg.099,我们能用这个命令把它们连接起来:cat movie.mpeg.0* > movie.mpeg

wc(字计数)命令是用来显示文件所包含的行数、字数和字节数。如果 wc 不带命令行参数,它接受标准输入。"-l"选项限制命令输出只能报道行数。添加 wc 到管道线来统计数据,是个很便利的方法。

grep 有一些方便的选项:"-i"使得 grep 在执行搜索时忽略大小写(通常,搜索是大小写敏感的),"-v"选项会告诉 grep 只打印不匹配的行。

Linux 提供了一个叫做 tee 的命令,这个命令制造了一个"tee",安装到我们的管道上。tee 程序从标准输入读入数据,并且同时复制数据到标准输出(允许数据继续随着管道线流动)和一个或多个文件。当在某个中间处理阶段来捕捉一个管道线的内容时,这很有帮助。这里,我们重复执行一个先前的例子,这次包含 tee 命令,在 grep 过滤管道线的内容之前,来捕捉整个目录列表到文件 ls.txt:ls /usr/bin | tee ls.txt | grep zip

(字符)展开
路径名展开
波浪线展开
算术表达式展开
花括号展开
参数展开
命令替换

引用
双引号
单引号
转义字符

在算术表达式中空格并不重要,并且表达式可以嵌套。一对括号可以用来把多个子表达式括起来。例如,5的平方乘以3:$(($((5**2)) * 3)) == $(((5**2) * 3))

花括号展开模式可能包含一个开头部分叫做报头,一个结尾部分叫做附言。花括号表达式本身可能包含一个由逗号分开的字符串列表,或者一个整数区间,或者单个的字符的区间。这种模式不能嵌入空白字符。echo Front-{A,B,C}-Back echo Number_{1…5} echo {Z…A} echo a{A{1,2},B{3,4}}b mkdir {2007…2009}-0{1…9} {2007…2009}-{10…12}

你可能注意到在其它展开类型中,如果你误输入一个模式,展开就不会发生。这时 echo 命令只简单地显示误键入的模式。但在参数展开中,如果你拼写错了一个变量名,展开仍然会进行,只是展开的结果是一个空字符串

命令替换允许我们把一个命令的输出作为一个展开模式来使用:ls -l $(which cp) == ls -l `which cp`

双引号。如果你把文本放在双引号中,shell 使用的特殊字符,都失去它们的特殊含义,被当作普通字符来看待。有几个例外: $,\ (反斜杠),和 `(倒引号)。这意味着单词分割、路径名展开、波浪线展开和花括号展开都将失效,然而参数展开、算术展开和命令替换仍然执行。使用双引号,我们可以处理包含空格的文件名。ls -l “two words.txt”

事实上,单词分割机制把换行符看作界定符,对命令替换产生了一个虽然微妙但有趣的影响。考虑下面的例子:echo $(cal) != echo “$(cal)”,在第一个实例中,没有引用的命令替换导致命令行包含38个参数。在第二个例子中,命令行只有一个参数,参数中包括嵌入的空格和换行符。

如果需要禁止所有的展开,我们要使用单引号。
echo text ~/.txt {a,b} $(echo foo) $((2+2)) $USER
echo "text ~/
.txt {a,b} $(echo foo) $((2+2)) $USER"
echo ‘text ~/*.txt {a,b} $(echo foo) $((2+2)) $USER’
正如我们所看到的,随着引用程度加强,越来越多的展开被禁止。

有时候我们只想引用单个字符。我们可以在字符之前加上一个反斜杠,在这里叫做转义字符。经常在双引号中使用转义字符,来有选择地阻止展开。

命令行最为珍视的目标之一就是懒惰;用最少的击键次数来完成最多的工作。另一个目标是你的手指永远不必离开键盘,永不触摸鼠标。

表9-1: 光标移动命令
按键 行动
Ctrl-a 移动光标到行首。
Ctrl-e 移动光标到行尾。
Ctrl-f 光标前移一个字符;和右箭头作用一样。
Ctrl-b 光标后移一个字符;和左箭头作用一样。
Alt-f 光标前移一个字。
Alt-b 光标后移一个字。
Ctrl-l 清空屏幕,移动光标到左上角。clear 命令完成同样的工作。
表9-2: 文本编辑命令
按键 行动
Ctrl-d 删除光标位置的字符。
Ctrl-t 光标位置的字符和光标前面的字符互换位置。
Alt-t 光标位置的字和其前面的字互换位置。
Alt-l 把从光标位置到字尾的字符转换成小写字母。
Alt-u 把从光标位置到字尾的字符转换成大写字母。
表9-3: 剪切和粘贴命令
按键 行动
Ctrl-k 剪切从光标位置到行尾的文本。
Ctrl-u 剪切从光标位置到行首的文本。
Alt-d 剪切从光标位置到词尾的文本。
Alt-Backspace 剪切从光标位置到词头的文本。如果光标在一个单词的开头,剪切前一个单词。
Ctrl-y 把剪切环中的文本粘贴到光标位置。
表9-4: 自动补全命令
按键 行动
Alt-? 显示可能的自动补全列表。在大多数系统中,你也可以完成这个通过按 两次 tab 键,这会更容易些。
Alt-* 插入所有可能的自动补全。当你想要使用多个可能的匹配项时,这个很有帮助。

历史命令展开
history | grep /usr/bin
88 ls -l /usr/bin > ls-output.txt
!88

bash 也具有增量搜索历史列表的能力。意思是在字符输入的同时,bash 会去搜索历史列表(直接出结果,并高亮匹配的第一个字),每多输入一个字符都会使搜索结果更接近目标。输入 Ctrl-r来启动增量搜索,接着输入你要寻找的字。当你找到它以后,你可以敲入 Enter 来执行命令,或者输入 Ctrl-j,从历史列表中复制这一行到当前命令行。再次输入 Ctrl-r,来找到下一个匹配项(历史列表中向上移动)。输入 Ctrl-g 或者 Ctrl-c,退出搜索。

表9-6: 历史展开命令
序列 行为
!! 重复最后一次执行的命令。可能按下上箭头按键和 enter 键更容易些。
!number 重复历史列表中第 number 行的命令。
!string 重复最近历史列表中,以这个字符串开头的命令。
!?string 重复最近历史列表中,包含这个字符串的命令。
表10-1: 文件类型
属性 文件类型
- 一个普通文件
d 一个目录
l 一个符号链接。注意对于符号链接文件,剩余的文件属性总是"rwxrwxrwx",而且都是 虚拟值。真正的文件属性是指符号链接所指向的文件的属性。
c 一个字符设备文件。这种文件类型是指按照字节流来处理数据的设备。 比如说终端机或者调制解调器
b 一个块设备文件。这种文件类型是指按照数据块来处理数据的设备,例如一个硬盘或者 CD-ROM 盘。
表 10-2: 权限属性
属性 文件 目录
r 允许打开并读取文件内容。 允许列出目录中的内容,前提是目录必须设置了可执行属性(x)。
w 允许写入文件内容或截断文件。但是不允许对文件进行重命名或删除,重命名或删除是由目录的属性决定的。 允许在目录下新建、删除或重命名文件,前提是目录必须设置了可执行属性(x)。
x 允许将文件作为程序来执行,使用脚本语言编写的程序必须设置为可读才能被执行。 允许进入目录,例如:cd directory 。

su 命令用来以另一个用户的身份来启动 shell。这个命令语法看起来像这样:su [-[l]] [user]。如果包含"-l"选项,那么会为指定用户启动一个需要登录的 shell。这意味着会加载此用户的 shell 环境,并且工作目录会更改到这个用户的家目录。这通常是我们所需要的。如果不指定用户,那么就假定是超级用户。注意(不可思议地),选项"-l"可以缩写为"-",这是经常用到的形式。启动超级用户的 shell,我们可以这样做:su -

以这样的方式使用 su 命令,也可以只执行单个命令,而不是启动一个新的可交互的 shell:su -c ‘command’。使用这种模式,命令传递到一个新 shell 中执行。把命令用单引号引起来很重要,因为我们不想命令在我们的 shell 中展开,但需要在新 shell 中展开。

sudo 命令在很多方面都相似于 su 命令,但是 sudo 还有一些非常重要的功能。管理员能够配置 sudo 命令,从而允许一个普通用户以不同的身份(通常是超级用户),通过一种非常可控的方式来执行命令。尤其是,只有一个用户可以执行一个或多个特殊命令时,(更体现了 sudo 命令的方便性)。另一个重要差异是 sudo 命令不要求超级用户的密码。使用 sudo 命令时,用户使用他/她自己的密码来认证。

su 和 sudo 之间的一个重要区别是 sudo 不会重新启动一个 shell,也不会加载另一个用户的 shell 运行环境。这意味者命令不必用单引号引起来。注意通过指定各种各样的选项,这种行为可以被推翻。

只要输入 passwd 命令,就能更改你的密码。如果你具有超级用户权限,你可以指定一个用户名作为 passwd 命令的参数,这样可以设置另一个用户的密码。

默认情况下,ps 不会显示很多进程信息,只是列出与当前终端会话相关的进程。使用这个 “x” 选项,可以看到我们所拥有的每个进程的信息。

表11-1: 进程状态
状态 含义
R 运行中。这意味着,进程正在运行或准备运行。
S 正在睡眠。进程没有运行,而是,正在等待一个事件, 比如说,一个按键或者网络分组。
D 不可中断睡眠。进程正在等待 I/O,比方说,一个磁盘驱动器的 I/O。
T 已停止。 已经指示进程停止运行。稍后介绍更多。
Z 一个死进程或“僵尸”进程。这是一个已经终止的子进程,但是它的父进程还没有清空它。 (父进程没有把子进程从进程表中删除)
< 一个高优先级进程。这可能会授予一个进程更多重要的资源,给它更多的 CPU 时间。 进程的这种属性叫做 niceness。具有高优先级的进程据说是不好的(less nice), 因为它占用了比较多的 CPU 时间,这样就给其它进程留下很少时间。
N 低优先级进程。 一个低优先级进程(一个“nice”进程)只有当其它高优先级进程被服务了之后,才会得到处理器时间。

另一个流行的选项组合是 “aux”(不带开头的"-"字符)。这会给我们更多信息:

表11-2: BSD 风格的 ps 命令列标题
标题 含义
USER 用户 ID。 进程的所有者。
%CPU 以百分比表示的 CPU 使用率
%MEM 以百分比表示的内存使用率
VSZ 虚拟内存大小
RSS 进程占用的物理内存的大小,以千字节为单位。
START 进程启动的时间。若它的值超过24小时,则用天表示。

top 显示结果由两部分组成:最上面是系统概要,下面是进程列表,以 CPU 的使用率排序。h,显示程序的帮助屏幕,q, 退出 top 程序。

表11-3: top 命令信息字段
行号 字段 意义
1 top 程序名。
14:59:20 当前时间。
up 6:30 这是正常运行时间。它是计算机从上次启动到现在所运行的时间。 在这个例子里,系统已经运行了六个半小时。
2 users 有两个用户登录系统。
load average: 加载平均值是指,等待运行的进程数目,也就是说,处于可以运行状态并共享 CPU 的进程个数。 这里展示了三个数值,每个数值对应不同的时间段。第一个是最后60秒的平均值, 下一个是前5分钟的平均值,最后一个是前15分钟的平均值。若平均值低于1.0,则指示计算机 工作不忙碌。
2 Tasks: 总结了进程数目和这些进程的各种状态。
3 Cpu(s): 这一行描述了 CPU 正在进行的活动的特性。
0.7%us 0.7% 的 CPU 被用于用户进程。这意味着进程在内核之外。
1.0%sy 1.0%的 CPU 时间被用于系统(内核)进程。
0.0%ni 0.0%的 CPU 时间被用于"nice"(低优先级)进程。
98.3%id 98.3%的 CPU 时间是空闲的。
0.0%wa 0.0%的 CPU 时间来等待 I/O。
4 Mem: 展示物理内存的使用情况。
5 Swap: 展示交换分区(虚拟内存)的使用情况。

命令行启动程序,忘了在命令后加字符 “&”, 将一个进程从前台移动到后台也是很方便的。输入 Ctrl-z,可以停止一个前台进程。用 bg 命令把程序移到后台。bg %1

表 11-4: 常用信号
编号 名字 含义
1 HUP 挂起(Hangup)。这是美好往昔的残留部分,那时候终端机通过电话线和调制解调器连接到 远端的计算机。这个信号被用来告诉程序,控制的终端机已经“挂断”。 通过关闭一个终端会话,可以展示这个信号的作用。在当前终端运行的前台程序将会收到这个信号并终止。

许多守护进程也使用这个信号,来重新初始化。这意味着,当一个守护进程收到这个信号后, 这个进程会重新启动,并且重新读取它的配置文件。Apache 网络服务器守护进程就是一个例子。

2 INT 中断。实现和 Ctrl-c 一样的功能,由终端发送。通常,它会终止一个程序。
9 KILL 杀死。这个信号很特别。尽管程序可能会选择不同的方式来处理发送给它的 信号,其中也包含忽略信号,但是 KILL 信号从不被发送到目标程序。而是内核立即终止 这个进程。当一个进程以这种方式终止的时候,它没有机会去做些“清理”工作,或者是保存工作。 因为这个原因,把 KILL 信号看作最后一招,当其它终止信号失败后,再使用它。
15 TERM 终止。这是 kill 命令发送的默认信号。如果程序仍然“活着”,可以接受信号,那么 这个它会终止。
18 CONT 继续。在一个停止信号后,这个信号会恢复进程的运行。
19 STOP 停止。这个信号导致进程停止运行,而不是终止。像 KILL 信号,它不被 发送到目标进程,因此它不能被忽略。
表 11-5: 其它常用信号
编号 名字 含义
3 QUIT 退出
11 SEGV 段错误(Segmentation Violation)。如果一个程序非法使用内存,就会发送这个信号。也就是说, 程序试图写入内存,而这个内存空间是不允许此程序写入的。
20 TSTP 终端停止(Terminal Stop)。当按下 Ctrl-z 组合键后,终端发送这个信号。不像 STOP 信号, TSTP 信号由目标进程接收,且可能被忽略。
28 WINCH 改变窗口大小(Window Change)。当改变窗口大小时,系统会发送这个信号。 一些程序,像 top 和 less 程序会响应这个信号,按照新窗口的尺寸,刷新显示的内容。

猜你喜欢

转载自blog.csdn.net/panshiqu/article/details/82878303