Linux Notes
2017.09.03
Shell 简介
在 Linux 系统上,通常有好几种 Linux shell 可用。不同的 shell 有不同的特性,有些更利于创建脚本,有些则更利于管理进程。Shell 虽然不是 Unix/Linux 系统内核的一部分,但它调用了系统核心的大部分功能来执行程序、建立文件并以并行的方式来协调各个程序的运行。
大多数 Linux 发行版的默认 shell 都是 GNU bash shell,它能提供对 Linux 系统的交互式访问。
GNU bash shell 是作为普通程序运行的,通常是在用户登陆终端时启动。登陆时系统启动的 shell 依赖于用户的配置。
/etc/passwd
文件包含了所有系统用户账户列表以及每个用户的基本配置信息,例如:
christine:x:501:501:Christine Bresnahan:/home/christine:/bin/bash
每个条目有七个字段,字段之间用冒号分隔。系统使用字段中的数据来赋予用户账户某些特定特性。最后一个字段指定了用户使用的 shell 程序,例如这里,当 christine 登陆 Linux 系统后,bash shell 会自动启动。
尽管 bash shell 会在登陆时自动启动,但是,是否会出现 shell 命令行界面(CLI)则依赖于所使用的登陆方式。如果采用虚拟控制台终端登陆,CLI 提示符会自动出现,你可以直接开始输入 shell 命令。但如果是通过图形化桌面环境登陆 Linux 系统,你就需要启动一个图形化终端仿真器 (如 terminal) 来访问 shell CLI 提示符。
默认 bash shell 提示符是美元符号($),这个符号表明 shell 在等待用户输入。不同 Linux 发行版可能采用不同格式的提示符。
可以把 shell CLI 提示符想象成一名助手,它帮助你使用 Linux 系统,给你有益的提示,告诉你什么时侯 shell 可以接受新的命令。
shell 中有一个大有帮助的 bash 手册工具。熟悉手册使用对各种 Linux 工具大有裨益,尤其是在你要弄清各种命令行参数的时候。使用 man
命令来访问存储在 Linux 系统上的手册页面,例如下面 bash 的 man 手册页 (man bash
):
手册页是由分页程序(pager)来显示的,能够分页显示手册。可以通过空格键进行翻页,或使用回车键逐行查看,键入 q
键退出该 pager 程序。
手册页将与命令相关的信息分成了不同的节。每一节常用的名称如下:
节 | 描述 |
---|---|
Name | 显示命令和一段简短的描述 |
Synopsis | 命令的语法 |
Confi guration | 命令配置信息 |
Description | 命令的一般性描述 |
Options | 命令选项描述 |
Exit Status | 命令的退出状态指示 |
Return Value | 命令的返回值 |
Errors | 命令的错误消息 |
Environment | 描述所使用的环境变量 |
Files | 命令用到的文件 |
Versions | 命令的版本信息 |
Conforming To | 命令所遵从的标准 |
Notes | 其他有帮助的资料 |
Bugs | 提供提交 bug 的途径 |
Example | 展示命令的用法 |
Authors | 命令开发人员的信息 |
Copyright | 命令源代码的版权状况 |
See Also | 与该命令类型的其他命令 |
当登录系统并获得 shell 命令提示符后,你通常位于自己的主目录中。Linux 将文件存储在单个目录结构中,这个目录称为虚拟目录(virtual directory)。Linux 虚拟目录结构只包含一个称为根(root)的基础目录。根目录下的目录和文件会按照访问它们的目录路径一一列出。
Linux 虚拟目录中比较复杂的部分是它如何协调管理各个存储设备。在 Linux PC 上安装的第一块硬盘称为根驱动器。根驱动器包含了虚拟目录的核心,其他目录都是从那里开始构建的。Linux 会在根驱动器上创建一些特别的目录——挂载点(mount point)。挂载点是虚拟目录中用于分配额外存储设备的目录。虚拟目录会让文件和目录出现在这些挂载点目录中,当然,实际上它们是存储在另外一个驱动器中的。
在登录系统并获得一个 shell CLI 提示符后,会话将从主目录开始。主目录是系统创建账户时分配给用户账户的一个特有目录。
在 Linux 文件系统上,可以使用切换目录命令 cd
将 shell 会话切换到另一个目录。cd 命令的格式非常简单:
cd destination
如果没有为 cd 命令指定目标路径,它将切换到用户主目录。 destination 参数可以用两种方式表示:一种是使用绝对文件路径,另一种是使用相对文件路径。
绝对文件路径定义了在虚拟目录结构中该目录的确切位置,以虚拟目录的根目录开始。绝对文件路径总是以正斜线(/
)作为起始,指明虚拟文件系统的根目录。例如,如果要指向 usr 目录所包含的 bin 目录,可以使用如下绝对文件路径:/usr/bin
。pwd
命令可以显示出 shell 会话的当前目录(绝对文件路径)。
相对文件路径允许用户指定一个基于当前位置的目标文件路径。假如你位于 home 目录中,并希望切换到 Documents 子目录,那你可以使用 cd 命令加上一个相对文件路径:cd Documents
。可以在任何包含子目录的目录中使用带有相对文件路径的 cd 命令。有两个特殊字符:单点符(.
),表示当前目录;双点符(..
),表示当前目录的父目录,所以 cd ..
就会回到上一次目录。
要想知道系统中有哪些文件,可以使用 ls
列表命令。ls 命令输出的列表是按字母排序的(按列排序而不是按行排序)。可用带 -F 参数的 ls 命令轻松区分文件和目录(文件夹)。
Linux 经常采用隐藏文件来保存配置信息。在 Linux 上,隐藏文件通常是文件名以点号开始的文件。这些文件并没有在默认的 ls 命令输出中显示出来。要把隐藏文件和普通文件及目录一起显示出来,就得用到 -a
参数。
-R 参数是 ls 命令的一个非常有用的参数,叫作递归选项。它列出了当前目录下包含的子目录中的文件。如果目录很多,这个输出就会很长,很长。
另一个常用的参数是 -l
。-l
参数会产生长列表格式的输出,包含了目录中每个文件的更多相关信息,例如文件大小、权限、修改时间等。
在进行文件管理时,ls
命令的很多参数都能派上用场。如果在 shell 提示符中输入 man ls
,就能看到可用来修改 ls
命令输出的参数有好几页。另外,可以将多个参数结合起来使用,例如:ls -aFl
。
ls
命令还支持在命令行中定义过滤器,决定应该在输出中显示哪些文件或目录。这个过滤器就是一个进行简单文本匹配的字符串。当用户指定特定文件的名称作为过滤器时,ls
命令只会显示该文件的信息。ls
命令能够识别标准通配符,并在过滤器中用它们进行模式匹配:问号(?)代表一个字符;星号(*)代表零个或多个字符。在过滤器中使用星号和问号被称为文件扩展匹配(file globbing)。通配符正式的名称叫作元字符通配符(metacharacter wildcards)。
可用 touch
命令轻松创建空文件。touch
命令创建了你指定的新文件,并将你的用户名作为文件的属主。注意,文件的大小是零,真的是个空文件。touch
命令还可用来改变文件的修改时间,这个操作并不改变文件的内容。
在最基本的用法里,cp
命令需要两个参数——源对象和目标对象:
cp source destination
当 source 和 destination 参数都是文件名时,cp
命令将源文件复制成一个新文件,并且以 destination 命名。新文件就像全新的文件一样,有新的修改时间。如果目标文件已经存在,cp
命令可能并不会提醒这一点。最好是加上 -i
选项,强制 shell 询问是否需要覆盖已有文件。
cp
命令的 -R
参数威力强大,可以用它在一条命令中递归地复制整个目录的内容。
如需要在系统上维护同一文件的两份或多份副本,除了保存多份单独的物理文件副本之外,还可以采用保存一份物理文件副本和多个虚拟副本的方法。这种虚拟的副本就称为链接。链接是目录中指向文件真实位置的占位符。在 Linux 中有两种不同类型的文件链接:
符号链接。要为一个文件创建符号链接,原始文件必须事先存在。然后使用 ln -s source destination
命令来创建符号链接。新创建的链接文件其内容仅仅包含指向源文件的信息而已(所以这个文件大小很小),和源文件比是两个完全不同的文件,但是使用 cat
命令或其他工具打开链接文件时,显示的内容还是源文件内容。
硬链接。硬链接会创建独立的虚拟文件,其中包含了原始文件的信息及位置。但是它们从根本上而言是同一个文件。引用硬链接文件等同于引用了源文件。要创建硬链接,原始文件也必须事先存在,只不过这次直接使用不带参数的 ln
命令即可。
如果使用 cp
命令复制一个文件,而该文件又已经被链接到了另一个源文件上,那么你得到的将是源文件的一个副本。
在 Linux 中,重命名文件称为移动(moving)。mv
命令可以将文件和目录移动到另一个位置或重新命名。也可以使用 mv
来移动文件的位置。
在 Linux 中,删除(deleting)叫作移除(removing)。bash shell 中删除文件的命令是 rm
。rm
命令的基本格式非常简单:rm -i file
。-i
命令参数是显示提示信息,让你确认是不是要真的删除该文件。bash shell 中没有回收站或垃圾箱,文件一旦删除,就无法再找回。因此,在使用 rm
命令时,要养成总是加入 -i
参数的好习惯。如果要删除很多文件且不受提示符的打扰,可以用 -f
参数强制删除 (慎用~)。
在 Linux 中创建目录很简单,用 mkdir
命令即可:mkdir new_folder
。
要想同时创建多个目录和子目录,需要加入 -p
参数:mkdir -p New_Dir/Sub_Dir/Under_Dir
。
删除目录的基本命令是 rmdir
。删除目录时,很有可能会发生一些不好的事情。shell 会尽可能防止我们捅娄子。默认情况下,rmdir
命令只删除空目录。rmdir
并没有 -i
选项来询问是否要删除目录。
使用 -r
选项使得命令可以向下进入目录,删除其中的文件,然后再删除目录本身。这种方法同样可以向下进入多个子目录,当需要删除大量目录和文件时,这一点尤为有效。
一口气删除目录及其所有内容的终极大法就是使用带有 -r
参数和 -f
参数的 rm
命令。rm -rf
命令既没有警告信息,也没有声音提示。这肯定是一个危险的工具,尤其是在拥有超级用户权限的时候。务必谨慎使用,请再三检查你所要进行的操作是否符合预期。
Linux 中有几个命令可以查看文件的内容,而无需调用其他文本编辑器。
file
命令能够探测文件的内部,并决定文件是什么类型的。file
命令不仅能确定文件中包含的文本信息,还能确定该文本文件的字符编码。file
命令甚至能够告诉你它链接到了哪个文件上。
cat
命令是显示文本文件中所有数据的得力工具。-n
参数会给所有的行加上行号。如果只想给有文本的行加上行号,可以用 -b
参数。最后,如果不想让制表符出现,可以用 -T
参数,-T
参数会用 ^I
字符组合去替换文中的所有制表符。对大型文件来说,使用 cat
会在显示器上一晃而过,最后停在最后一页。
more
命令会显示文本文件的内容,但会在显示每页数据之后停下来。和手册页 (man
) 中前后移动一样,你可以通过按空格键或回车键以逐页(逐行)向后翻的方式浏览文本文件。浏览完之后,按 q
键退出。
less
命令的操作和 more
命令基本一样,一次显示一屏的文件文本。除了支持和 more
命令相同的命令集,它还包括更多的选项(所以叫 less 委屈它了)。其中一组特性就是 less
命令能够识别上下键以及上下翻页键。(输入 man less
浏览对应的手册页)
tail
命令会显示文件最后几行的内容。默认情况下,它会显示文件的末尾 10 行。可以向 tail
命令中加入 -n
参数来修改所显示的行数。-f
参数是 tail
命令的一个突出特性,它允许你在其他进程使用该文件时查看文件的内容。tail
命令会保持活动状态,并不断显示添加到文件中的内容。这是实时监测系统日志的绝妙方式。
head
命令,顾名思义,会显示文件开头那些行的内容。默认情况下,它会显示文件前 10 行的文本。类似于 tail
命令,它也支持 -n
参数,这样就可以指定想要显示的内容了。
最后,shell 命令千千万,掌握基础最重要,经常使用就会熟练了。
Frank Lin
Linux Notes
2017.09.03
在 Linux 系统上,通常有好几种 Linux shell 可用。不同的 shell 有不同的特性,有些更利于创建脚本,有些则更利于管理进程。Shell 虽然不是 Unix/Linux 系统内核的一部分,但它调用了系统核心的大部分功能来执行程序、建立文件并以并行的方式来协调各个程序的运行。
Web Notes
2022.03.01
Notes of Nextcloud installation on Ubuntu server with Nginx web server and PlanetScale cloud database.
Linux Notes
2017.11.28
Dialog is an utility for creating professional-looking dialog boxes within shell scripts, this article just follow the tutorial and present the examples of how and where it can be used.