The Linux Command Line 前 11 章内容摘录
2018-09-28 11:25:28
摘自The Linux Command Line中文翻译,主要供本人快速回顾,不太建议未阅读过TLCL的朋友浏览本篇文章
graphical user interfaces make easy tasks easy, while command line interfaces make difficult tasks possible
图形用户界面让简单的任务更容易完成,而命令行界面使完成复杂的任务成为可能
快捷键 | 运行结果 |
---|---|
cd | 更改工作目录到你的家目录。 |
cd - | 更改工作目录到先前的工作目录。 |
cd ~user_name | 更改工作目录到用户家目录。例如, cd ~bob 会更改工作目录到用户“bob”的家目录。 |
大多数命令使用的选项,是由一个中划线加上一个字符组成,例如,“-l”,但是许多命令,包括来自于 GNU 项目的命令,也支持长选项,长选项由两个中划线加上一个字组成。当然,许多命令也允许把多个短选项串在一起使用。下面这例子,ls 命令有两个选项,“l” 选项产生长格式输出,“t”选项按文件修改时间的先后来排序。加上长选项 “--reverse”,则结果会以相反的顺序输出
选项 | 长选项 | 描述 |
---|---|---|
-a | --all | 列出所有文件,甚至包括文件名以圆点开头的默认会被隐藏的隐藏文件。 |
-d | --directory | 通常,如果指定了目录名,ls 命令会列出这个目录中的内容,而不是目录本身。 把这个选项与 -l 选项结合使用,可以看到所指定目录的详细信息,而不是目录中的内容。 |
-F | --classify | 这个选项会在每个所列出的名字后面加上一个指示符。例如,如果名字是 目录名,则会加上一个'/'字符。 |
-h | --human-readable | 当以长格式列出时,以人们可读的格式,而不是以字节数来显示文件的大小。 |
-l | 以长格式显示结果。 | |
-r | --reverse | 以相反的顺序来显示结果。通常,ls 命令的输出结果按照字母升序排列。 |
-S | 命令输出结果按照文件大小来排序。 | |
-t | 按照修改时间来排序。 |
file filename 确定文件类型
everything is a file. 一切皆文件
通配符 | 意义 |
---|---|
* | 匹配任意多个字符(包括零个或一个) |
? | 匹配任意一个字符(不包括零个) |
[characters] | 匹配任意一个属于字符集中的字符 |
[!characters] | 匹配任意一个不是字符集中的字符 |
[[:class:]] | 匹配任意一个属于指定字符类中的字符 |
字符类 | 意义 |
---|---|
[:alnum:] | 匹配任意一个字母或数字 |
[:alpha:] | 匹配任意一个字母 |
[:digit:] | 匹配任意一个数字 |
[:lower:] | 匹配任意一个小写字母 |
[:upper:] | 匹配任意一个大写字母 |
mkdir directory…
注意表示法: 在描述一个命令时(如上所示),当有三个圆点跟在一个命令的参数后面,这意味着那个参数可以重复
选项 | 意义 |
---|---|
-a, --archive | 复制文件和目录,以及它们的属性,包括所有权和权限。 通常,复本具有用户所操作文件的默认属性。 |
-i, --interactive | 在重写已存在文件之前,提示用户确认。如果这个选项不指定, cp 命令会默认重写文件。 |
-r, --recursive | 递归地复制目录及目录中的内容。当复制目录时, 需要这个选项(或者-a 选项)。 |
-u, --update | 当把文件从一个目录复制到另一个目录时,仅复制 目标目录中不存在的文件,或者是文件内容新于目标目录中已经存在的文件。 |
-v, --verbose | 显示翔实的命令操作信息 |
选项 | 意义 |
---|---|
-i --interactive | 在重写一个已经存在的文件之前,提示用户确认信息。 如果不指定这个选项,mv 命令会默认重写文件内容。 |
-u --update | 当把文件从一个目录移动另一个目录时,只是移动不存在的文件, 或者文件内容新于目标目录相对应文件的内容。 |
-v --verbose | 当操作 mv 命令时,显示翔实的操作信息。 |
选项 | 意义 |
---|---|
-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
章节 | 内容 |
---|---|
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' 正如我们所看到的,随着引用程度加强,越来越多的展开被禁止。
有时候我们只想引用单个字符。我们可以在字符之前加上一个反斜杠,在这里叫做转义字符。经常在双引号中使用转义字符,来有选择地阻止展开。
命令行最为珍视的目标之一就是懒惰;用最少的击键次数来完成最多的工作。另一个目标是你的手指永远不必离开键盘,永不触摸鼠标。
按键 | 行动 |
---|---|
Ctrl-a | 移动光标到行首。 |
Ctrl-e | 移动光标到行尾。 |
Ctrl-f | 光标前移一个字符;和右箭头作用一样。 |
Ctrl-b | 光标后移一个字符;和左箭头作用一样。 |
Alt-f | 光标前移一个字。 |
Alt-b | 光标后移一个字。 |
Ctrl-l | 清空屏幕,移动光标到左上角。clear 命令完成同样的工作。 |
按键 | 行动 |
---|---|
Ctrl-d | 删除光标位置的字符。 |
Ctrl-t | 光标位置的字符和光标前面的字符互换位置。 |
Alt-t | 光标位置的字和其前面的字互换位置。 |
Alt-l | 把从光标位置到字尾的字符转换成小写字母。 |
Alt-u | 把从光标位置到字尾的字符转换成大写字母。 |
按键 | 行动 |
---|---|
Ctrl-k | 剪切从光标位置到行尾的文本。 |
Ctrl-u | 剪切从光标位置到行首的文本。 |
Alt-d | 剪切从光标位置到词尾的文本。 |
Alt-Backspace | 剪切从光标位置到词头的文本。如果光标在一个单词的开头,剪切前一个单词。 |
Ctrl-y | 把剪切环中的文本粘贴到光标位置。 |
按键 | 行动 |
---|---|
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,退出搜索。
序列 | 行为 |
---|---|
!! | 重复最后一次执行的命令。可能按下上箭头按键和 enter 键更容易些。 |
!number | 重复历史列表中第 number 行的命令。 |
!string | 重复最近历史列表中,以这个字符串开头的命令。 |
!?string | 重复最近历史列表中,包含这个字符串的命令。 |
属性 | 文件类型 |
---|---|
- | 一个普通文件 |
d | 一个目录 |
l | 一个符号链接。注意对于符号链接文件,剩余的文件属性总是\"rwxrwxrwx\",而且都是 虚拟值。真正的文件属性是指符号链接所指向的文件的属性。 |
c | 一个字符设备文件。这种文件类型是指按照字节流来处理数据的设备。 比如说终端机或者调制解调器 |
b | 一个块设备文件。这种文件类型是指按照数据块来处理数据的设备,例如一个硬盘或者 CD-ROM 盘。 |
属性 | 文件 | 目录 |
---|---|---|
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" 选项,可以看到我们所拥有的每个进程的信息。
状态 | 含义 |
---|---|
R | 运行中。这意味着,进程正在运行或准备运行。 |
S | 正在睡眠。进程没有运行,而是,正在等待一个事件, 比如说,一个按键或者网络分组。 |
D | 不可中断睡眠。进程正在等待 I/O,比方说,一个磁盘驱动器的 I/O。 |
T | 已停止。 已经指示进程停止运行。稍后介绍更多。 |
Z | 一个死进程或“僵尸”进程。这是一个已经终止的子进程,但是它的父进程还没有清空它。 (父进程没有把子进程从进程表中删除) |
< | 一个高优先级进程。这可能会授予一个进程更多重要的资源,给它更多的 CPU 时间。 进程的这种属性叫做 niceness。具有高优先级的进程据说是不好的(less nice), 因为它占用了比较多的 CPU 时间,这样就给其它进程留下很少时间。 |
N | 低优先级进程。 一个低优先级进程(一个“nice”进程)只有当其它高优先级进程被服务了之后,才会得到处理器时间。 |
另一个流行的选项组合是 "aux"(不带开头的"-"字符)。这会给我们更多信息:
标题 | 含义 |
---|---|
USER | 用户 ID。 进程的所有者。 |
%CPU | 以百分比表示的 CPU 使用率 |
%MEM | 以百分比表示的内存使用率 |
VSZ | 虚拟内存大小 |
RSS | 进程占用的物理内存的大小,以千字节为单位。 |
START | 进程启动的时间。若它的值超过24小时,则用天表示。 |
top 显示结果由两部分组成:最上面是系统概要,下面是进程列表,以 CPU 的使用率排序。h,显示程序的帮助屏幕,q, 退出 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
编号 | 名字 | 含义 |
---|---|---|
1 | HUP | 挂起(Hangup)。这是美好往昔的残留部分,那时候终端机通过电话线和调制解调器连接到
远端的计算机。这个信号被用来告诉程序,控制的终端机已经“挂断”。
通过关闭一个终端会话,可以展示这个信号的作用。在当前终端运行的前台程序将会收到这个信号并终止。
许多守护进程也使用这个信号,来重新初始化。这意味着,当一个守护进程收到这个信号后, 这个进程会重新启动,并且重新读取它的配置文件。Apache 网络服务器守护进程就是一个例子。 |
2 | INT | 中断。实现和 Ctrl-c 一样的功能,由终端发送。通常,它会终止一个程序。 |
9 | KILL | 杀死。这个信号很特别。尽管程序可能会选择不同的方式来处理发送给它的 信号,其中也包含忽略信号,但是 KILL 信号从不被发送到目标程序。而是内核立即终止 这个进程。当一个进程以这种方式终止的时候,它没有机会去做些“清理”工作,或者是保存工作。 因为这个原因,把 KILL 信号看作最后一招,当其它终止信号失败后,再使用它。 |
15 | TERM | 终止。这是 kill 命令发送的默认信号。如果程序仍然“活着”,可以接受信号,那么 这个它会终止。 |
18 | CONT | 继续。在一个停止信号后,这个信号会恢复进程的运行。 |
19 | STOP | 停止。这个信号导致进程停止运行,而不是终止。像 KILL 信号,它不被 发送到目标进程,因此它不能被忽略。 |
编号 | 名字 | 含义 |
---|---|---|
3 | QUIT | 退出 |
11 | SEGV | 段错误(Segmentation Violation)。如果一个程序非法使用内存,就会发送这个信号。也就是说, 程序试图写入内存,而这个内存空间是不允许此程序写入的。 |
20 | TSTP | 终端停止(Terminal Stop)。当按下 Ctrl-z 组合键后,终端发送这个信号。不像 STOP 信号, TSTP 信号由目标进程接收,且可能被忽略。 |
28 | WINCH | 改变窗口大小(Window Change)。当改变窗口大小时,系统会发送这个信号。 一些程序,像 top 和 less 程序会响应这个信号,按照新窗口的尺寸,刷新显示的内容。 |