From 3ed40b3e559d3023f4089e2aa51aa82e3f81e69d Mon Sep 17 00:00:00 2001 From: xiangzelong Date: Wed, 15 Feb 2023 21:56:55 +0800 Subject: [PATCH] docs: update docs Log: --- .gitignore | 5 +- docs/.vitepress/config.js | 19 +- docs/GNU-linux教程/1.1.控制台基础.md | 222 ++++++ docs/GNU-linux教程/1.2.类Unix系统.md | 487 +++++++++++++ docs/GNU-linux教程/1.4.类Unix工作环境基础.md | 324 +++++++++ docs/GNU-linux教程/1.5.简单shell命令.md | 297 ++++++++ docs/GNU-linux教程/1.6.类Unix的文本处理.md | 61 ++ docs/GNU-linux教程/GNU-linux教程.md | 699 +++++++++++++++++++ docs/GNU-linux教程/简介.md | 7 + docs/index.md | 205 +++++- docs/中级/中级1.md | 1 - docs/中级/中级2.md | 1 - docs/中级/中级3.md | 1 - docs/初级/初级1.md | 1 - docs/初级/初级2.md | 1 - docs/初级/初级3.md | 1 - docs/目录/目录.md | 0 package.json | 2 +- 18 files changed, 2316 insertions(+), 18 deletions(-) create mode 100644 docs/GNU-linux教程/1.1.控制台基础.md create mode 100644 docs/GNU-linux教程/1.2.类Unix系统.md create mode 100644 docs/GNU-linux教程/1.4.类Unix工作环境基础.md create mode 100644 docs/GNU-linux教程/1.5.简单shell命令.md create mode 100644 docs/GNU-linux教程/1.6.类Unix的文本处理.md create mode 100644 docs/GNU-linux教程/GNU-linux教程.md create mode 100644 docs/GNU-linux教程/简介.md delete mode 100644 docs/中级/中级1.md delete mode 100644 docs/中级/中级2.md delete mode 100644 docs/中级/中级3.md delete mode 100644 docs/初级/初级1.md delete mode 100644 docs/初级/初级2.md delete mode 100644 docs/初级/初级3.md create mode 100644 docs/目录/目录.md diff --git a/.gitignore b/.gitignore index 7aa0fb9..cd03262 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,6 @@ node_modules/ cache/ -dist/ \ No newline at end of file +dist/ +yarn.lock +package.json +.vscode diff --git a/docs/.vitepress/config.js b/docs/.vitepress/config.js index 2334420..415185e 100644 --- a/docs/.vitepress/config.js +++ b/docs/.vitepress/config.js @@ -1,23 +1,24 @@ export default { - title: "标题", + title: "序言", description: "详细介绍", themeConfig: { sidebar: [ { - text: "初级", + text: "目录", items: [ - { text: "初级1", link: "/初级/初级1" }, - { text: "初级2", link: "/初级/初级2" }, - { text: "初级3", link: "/初级/初级3" }, + { text: "目录", link: "/目录/目录" }, ], }, { - text: "中级", + text: "GNU/Linux教程", items: [ - { text: "中级1", link: "/中级/中级1" }, - { text: "中级2", link: "/中级/中级2" }, - { text: "中级3", link: "/中级/中级3" }, + { text: "简介", link: "/GNU-linux教程/简介" }, + { text: "1.1.控制台基础", link: "/GNU-linux教程/1.1.控制台基础" }, + { text: "1.2.类Unix系统", link: "/GNU-linux教程/1.2.类Unix系统" }, + { text: "1.4.类Unix工作环境基础", link: "/GNU-linux教程/1.4.类Unix工作环境基础" }, + { text: "1.5.简单shell命令", link: "/GNU-linux教程/1.5.简单shell命令" }, + { text: "1.6.类Unix的文本处理", link: "/GNU-linux教程/1.6.类Unix的文本处理" }, ], }, ], diff --git a/docs/GNU-linux教程/1.1.控制台基础.md b/docs/GNU-linux教程/1.1.控制台基础.md new file mode 100644 index 0000000..e6cd44f --- /dev/null +++ b/docs/GNU-linux教程/1.1.控制台基础.md @@ -0,0 +1,222 @@ +# 1.1. 控制台基础 + +## 1.1.1. shell 提示符 + +启动系统后,当你看到登陆界面时,按Ctrl+Alt+F2就可以切换到tty2进行登陆,假设你的主机名为`foo`,那么登录提示符将如下所示。(如果是非标准键盘用户,可能需要同时按下fn键) + +```Shell +Deepin GNU/linux 23 foo tty2 +foo login: +``` + + +你需要在login:后面输入你的用户名 然后回车 + +此时,登陆提示符显示如下: + +```PowerShell +Password: +``` + + +输入用户密码即可,请注意,密码并不会被显示,不要怀疑自己是否输入了密码。 + +遵循 Unix 传统,deepin 系统下的用户名和密码是大小写敏感的。用户名通常由小写字母组成。第一个用户账号通常在安装期间进行创建。额外的用户账号由 root 用户用 adduser(8) 创建。 + +系统以保存在 "`/etc/motd`" 中的欢迎信息(Message Of The Day)来开始,同时显示一个命令提示符 + +```Plain Text +Linux foo-PC 5.18.17-amd64-desktop-hwe #23.01.00.06 SMP PREEMPT_DYNAMIC Mon Oct 31 17:25:49 CST 2022 x86_64 +Welcome to Deepin V23 GNU/Linux + + * Homepage:https://www.deepin.org/ + + * Bugreport:https://bbs.deepin.org/ +``` + + +你可以用root权限来修改此文件来达到自定义的目的 + +此时你就在shell下了,你可以在shell下尝试与电脑交流。 + +如果你想回到图形界面。请按Ctrl+Alt+F1,即可切换回GUI + +约定:GUI表示图形界面 + +## 1.1.2. GUI 下的 shell 提示符 + +deepin预装了GUI环境,并且提供终端模拟器:deepin-terminal,你可以按Ctrl+Alt+T打开它,或者通过开始菜单打开它,如下: + +![image.png](https://flowus.cn/preview/7cdb8904-03e2-46d2-a785-95f0260ad9f9) + +关于终端的其他介绍,见deepin wiki ,此处不再赘述。 + +## 1.1.3. root 账户 + +root 账户也被称作超级用户或特权用户。用这个账户,你能够履行下面的系统管理任务。 + +- 读、写和删除系统上的任何文件,不顾它们的文件权限 + +- 设置系统上任何文件的所有者和权限 + +- 设置系统上任何非特权用户的密码 + +- 免用户密码登录任何帐户 + +无限权力的 root 账户,要求你慎重和负责任的使用。 + +注意:如果有人告诉你形如:`sudo rm -rf /*` ,请谨慎对待,最好你在执行此命令之前了解此命令含义,否则会造成不可挽回的后果。 + +一个文件(包括硬件设备,如 CD-ROM 等,这些对 Linux 系统来说都只是一个文件)的权限可能会导致非 root 用户无法使用或访问它 。虽然在这种情况下,使用 root 帐户是一个快速的方法,但正确的解决方法应该是对文件权限和用户组的成员进行合适的设置(参见第[ 1.2.3 节 “文件系统权限](https://flowus.cn/16aaa542-96fb-40e1-bfca-d77989d1418b#b6113247-d21b-4ce4-92ff-0e3f94886ec1)”)。 + +## 1.1.4. root shell 提示符 + +这里有一些基本的方法可以让你在输入 root 密码后获得 root的 shell 提示符。 + +- 在字符界面的登录提示符,键入 root 作为用户名登录。 + +- 在任意用户的 shell 提示符下输入“su -l”。 + + 这不会保存当前用户的环境设定。 + +- 在任意用户的 shell 提示符下输入“su”。 + + 这会保存当前用户的一些环境设定。 + +注意:任何情况都不建议使用root用户直接登陆,而是使用sudo+命令方式 + + + +## 1.1.5. 虚拟控制台 + +在默认的 deepin系统中,有6个可切换的类VT100字符控制台,可以直接在 Linux 主机上启动 shell。GUI界面占据tty1。 + +如果你已经在字符控制台中 你可以同时按下左Alt键和F2—F6之一的键在虚拟控制台间切换。每一个字符控制台都允许独立登录账户并提供多用户环境。这个多用户环境是伟大的 Unix 的特性,很容易上瘾。 + +如果你处于 GUI 环境中,你可以通过 Ctrl-Alt-F3 键前往字符控制台 3,也就是同时按下左 Ctrl 键、左 Alt 键和F3 键。你可以按下 Alt-F1 回到 GUI 环境,它一般运行在虚拟控制台 2。 + +你也可以使用命令行切换到另一个虚拟控制台,例如切换到控制台 3 + +```Shell +sudo chvt 3 +``` + + +## 1.1.6. 雷神终端 + +这是deepin的特有功能,在GUI界面下按Alt+F2唤出,和普通终端一致。快捷键可以在控制中心修改。 + +雷神终端将始终置顶。 + +![image.png](https://flowus.cn/preview/4a2ceaff-b556-4135-bda4-d13ac1acac25) + +这是一种快捷调出终端的方式,并且调出的终端一直存在于后台,直到你显式退出(exit) + +## 1.1.7. 怎样退出命令行提示符 + +同时按下`左侧Ctrl键`和`D键`,即可关闭 shell 活动。如果你正处于字符控制台,你将会返回到登录提示行。你也可以键入 ”`exit`" 退出命令行。 + +如果你位于`x终端模拟器`中,你可以使用这个关闭`x 终端模拟器`窗口。 + +## 1.1.8. 怎样关闭系统 + +就像任何其他的现代操作系统一样,deepin 会通过内存中的[缓存数据](https://zh.wikipedia.org/wiki/%E7%BC%93%E5%AD%98)进行文件操作以提高性能,因此在电源被安全地关闭前需要适当的关机过程,通过将内存中的数据强制写入硬盘来维持文件的完整性。如果软件的电源控制可用,那么关机过程中会自动关闭系统电源。(否则,你可能需要在关机过程之后按电源键几秒钟:相当于强制关机) + +在普通多用户模式模式下,可以使用命令行关闭系统。 + +```Shell +sudo shutdown -h now +``` + + +在单用户模式下,可以使用命令行关闭系统。 + +```Shell +sudo poweroff -i -f +``` + + +参见[第 6.3.8 节 “怎样通过 SSH 关闭远程系统”](https://www.debian.org/doc/manuals/debian-reference/ch06.zh-cn.html#_how_to_shutdown_the_remote_system_on_ssh)。 + +## 1.1.9. 恢复一个正常的控制台 + +当做了一些滑稽的事(例如“`cat二进制文件`”)后,屏幕会发狂,你可以按Ctrl+C来取消当前命令。你也可以输入“`clear`”来清屏。 + +## 1.1.10. 建议新手安装的额外软件包 + +deepin作为一个开箱即用的系统,已经预装了许多软件包,但是依然有些软件包是值得被推荐的: + +||| +|-|-| +|htop|一个更高级的top| +|neovim|更好用的vim,前提是你会配置| +|tree|展示文件树| + +你可以用下面的命令安装这些包。 + +```Shell +sudo apt-get install +``` + + +## 1.1.11. 额外用户账号 + +如果你不想用你自己的主用户账户来进行下面的练习操作,你可以使用下面的方式创建一个练习用户账户,比如说,创建一个用户名为 `fish` 的账号。 + +```Shell +sudo adduser fish +``` + + +回答所有问题。 + +这将创建一个名为 `fish` 的新账号。在你练习完成后,你可以使用下面的命令删除这个用户账号和它的用户主目录。 + +```Shell +sudo deluser --remove-home fish +``` + + +## 1.1.12. sudo 配置 + +对于典型的单用户工作站,例如运行在笔记本电脑上的桌面 deepin 系统,通常简单地配置 `sudo`(8) 来使为非特权用户(例如用户 `penguin`)只需输入用户密码而非 root 密码就能获得管理员权限。 + +```Shell +sudo echo "penguin ALL=(ALL) ALL" >> /etc/sudoers +``` + + +另外,可以使用下列命令使非特权用户(例如用户 `penguin`)无需密码就获得管理员权限。 + +```Shell +sudo echo "penguin ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers +``` + + +这些技巧只对你管理的单用户工作站中那个唯一的用户有用。 + +在多用户工作站中不要建立这样的普通用户账户,因为它会导致非常严重的系统安全问题。 + +在上述例子中,用户 penguin 的密码及账号要有和 root 账号密码同样多的保护。 + + 在这种情况下,管理员权限被赋予那些有权对工作站进行系统管理任务的人。永远不要让你的公司行政管理部门或你的老板进行管理(例如给予他们权限),除非他们获得了授权并有这样的能力。 + +为了对受限的设备和文件提供访问权限,你应该考虑使用组来提供受限访问,而不是通过sudo(8)来使用 root权限。 + + 随着越来越细致周密的配置,sudo(8) 可以授予一个共享系统上的其它用户有限的管理权限而不共享 root 密码。这可以帮助对有多个管理员的主机进行责任追究,你可以了解到是谁做什么。另一方面,你可能不想任何人有这样的权限。 + +## 1.1.13. 动手时间 + +现在你已经准备好在 deepin 系统上开工了,只要你使用非特权用户账号就不会有风险。 + +这是因为 deepin系统(即使是默认安装)会设置适当的文件权限来防止非特权用户对系统造成破坏。 + +我们使用下面的方式,把 deepin 系统当作一个 类 Unix 系统来学习。 + +第 1.2 节 “类 Unix 文件系统” (基本概念) + +第 1.4 节 “类 Unix 工作环境基础” (基本方式) + +第 1.5 节 “简单 shell 命令” (shell 机制) + +第 1.6 节 “类 Unix 的文本处理” (文本处理方式) diff --git a/docs/GNU-linux教程/1.2.类Unix系统.md b/docs/GNU-linux教程/1.2.类Unix系统.md new file mode 100644 index 0000000..6f6a985 --- /dev/null +++ b/docs/GNU-linux教程/1.2.类Unix系统.md @@ -0,0 +1,487 @@ + +# 1.2. 类 Unix 文件系统 + +在GNU/Linux和其他[类Unix](https://zh.wikipedia.org/wiki/Unix-like)操作系统中,[文件](https://zh.wikipedia.org/wiki/Computer_file)被组织到[目录](https://zh.wikipedia.org/wiki/Directory_(file_systems))中。所有的文件和目录排放在以“`/`”为根的巨大的树里。叫它树是因为如果你画出文件系统,它看起来就像一棵树,但是它是颠倒过来的。 + +如果你在上文中已经学习安装了软件包 tree 你可以用以下命令来了解下文件树: + +```Shell +cd / +tree -L 3 +``` + + +这会展示出`/`目录下的文件树,深度为3 + +这些文件和目录可以分散在多个设备中。`mount`(8)用于把某个设备上找到的文件系统附着到巨大的文件树上。相反的,`umount`(8)把它再次分离。在最近的 Linux 内核里,`mount`(8)带某些参数时可以把文件树的一部分绑定到另外的地方,或者可以把文件系统挂载为共享的、私有的、从设备、或不可绑定的。对每个文件系统支持的挂载选项可以在`/usr/share/doc/linux-doc-*/Documentation/filesystems/`找到。 + +Unix系统上叫做**目录**,某些其他系统上叫做**文件夹**。请同样留意,在任何Unix系统上,没有的**驱动器**的概念,例如“`A:`”。这只有一个文件系统,并且所有东西都包含在内。这相对于 Windows 来说是一个巨大的优点。 + +## 1.2.1. Unix 文件基础 + +下面是一些 Unix 文件基础。 + +- 文件名是 区分大小写 的。也就是说, "MYFILE" 和 "MyFile" 是不同的文件。 + +- 根目录意味着文件系统的根,简单的称为“`/`”,不要把它跟 root 用户的家目录“`/root`”混淆了。 + +- 每个目录都有一个名字,它可以包含任意字母或除了`/`以外的符号。根目录是个特例。它的名字是`/`(称作“斜线”或“根目录”),并且它不能被重命名。 + +- 每个文件或目录都被指定一个全限定文件名,绝对文件名,或路径,按顺序给出必须经过的目录从而到达相应目录。这三个术语是同义的。 + +- 所有的全限定文件名以“/”目录开始,并且在每个目录或文件名之间有一个“/”。第一个“/”是最顶层目录,其他的“/”用于分隔跟着的子目录。直到到达最后的入口,即实际文件的名称。这些话可能会令人困惑。用下面这个全限定文件名作为例子:“`/usr/share/keytables/us.map.gz`”。不过,人们也把它的基名“us.map.gz”单独作为文件名。 + +- 根目录有很多分支,例如“/etc/”和“/usr/”。这些子目录依次分出更多的子目录,例如“/etc/init.d/”和“/usr/local/”。这整体叫做“目录树”。你可以把一个绝对文件名想象成从“/”这棵树的基到某个分支(一个文件)的结尾的一条路径。你也听到人们谈论目录树,就好像它是一个包含所有直系后代的“家庭”树的一个图,这个图叫做根目录(“/”):因此子目录有父目录,并且一条路径显示了一个文件完整的祖先。也有相对路径从其他地方开始,而不是从根目录。 你应该还记得目录“`../`”指向父目录。这个术语也适用于其他类似目录的结构,如分层数据结构。 + +- 对于一个物理设备, 是没有一个特定的目录路径名来对应的组成部分. 这不同于RT-11, CP/M,OpenVMS,MS-DOS,AmigaOS, 以及微软的Windows,这些系统存在一个路径包含了一个设备名字,比如"C:"。(尽管如此, 路径条目确实存在引用了物理设备作为正常的文件系统的一部分. 参考第 1.2.2 节 “文件系统深入解析”。) + +虽然你**可以**在文件名中使用任意的字幕或者符号, 但是在实际情况下这样做是一个坏主意. 最好避免使用一些在命令行里面含有特殊意义的字符, 比如空格, 制表符, 换行符, 和其它的特殊字符: `{ } ( ) [ ] ' ` " \ / >< | ; ! #&^ * % @ $`. 如果你想有一个区分度良好的命名, 比较好的选择是利用 时期, 连字符和下划线. 你也可以每个单词的首字母大写, 这叫大驼峰命名法, 比如这样 "`LikeThis`". 经验丰富的Linux用户会趋向于在文件名中不使用空格. + +这个 "root" 可能既表示 "超级用户root" 又表示 " 根目录"(/root) . 应该根据上下文确定它的用法 + +你应该记住以下的一些标准作为开始学习的步骤. + +|目录|含义| +|-|-| +|/|系统的根| +|/root|root用户的家目录| +|/home|存放普通用户的主目录| +|/bin|常用命令脚本所在目录| +|/sbin|常用命令脚本 需要super权限所在目录| +|/lib|系统开机所需基本动态链接共享库,类似Windows中dll文件的存放位置| +|/etc|系统以及软件配置文件存放位置| +|/usr|用户程序安装位置| +|/usr/local|软件安装好放在这个目录| +|/boot|系统启动文件存放位置| +|/proc|系统对内存的映射访问此目录可以获得系统信息| +|/sys|文件系统sysfs目录| +|/tmp|存放临时文件| +|/dev|硬件以文件形式存储| +|/dev|用户临时挂载其他文件系统| + +## 1.2.2. 文件系统深入解析 + +按照**UNIX系统的传统**,deepin GNU / Linux 的[文件系统](https://zh.wikipedia.org/wiki/File_system)是在物理数据存储设备诸如磁盘或其他存储设备上,与硬件设备的交互,如控制台和远程串口终端都是以统一的方式呈现在 “`/dev/`” 下面。 + +每个文件、目录、命名管道(一种两个程序间共享数据的方法)或 GNU/Linux 系统上的物理设备都有一个叫做 [inode](https://zh.wikipedia.org/wiki/Inode)的数据结构,描述了其相关属性,例如拥有它的用户(所有者),它属于的组,最后一次访问时间,等等。把所有东西都表示在文件系统中的想法是来源于 Unix,现代的 Linux 内核则将这个思路进行了扩展。现在,甚至有关计算机上正在运行的进程的信息都可以在文件系统中找到。 + +这个对物理实体和内部进程的统一和抽象是非常强大的,因为这允许我们用同样的命令对许多完全不同的设备进行同样的操作。甚至可以通过向链接到运行进程的特殊文件写入数据来改变内核的运行方式。 + +如果您需要识别文件树和物理实体之间的对应关系,请尝试不带参数运行`mount` + +## 1.2.3. 文件系统权限 + +类Unix系统的文件系统权限被定义给三类受影响的用户。 + +- 拥有这个文件的用户(u) + +- 这个文件所属组的其他用户(g) + +- 所有其余的用户(o),同样称为“世界”和“所有人” + +对文件来说,每个对应权限允许下列动作。 + +- 可读(r)权限允许所有者检查文件的内容。 + +- 可写(w)权限允许所有者修改文件内容。 + +- 可执行(x)权限允许所有者把文件当做一个命令运行。 + +对于目录来说,每个对应权限允许下列动作。 + +- 可读(r)权限允许所有者列出目录内的内容。 + +- 可写(w)权限允许所有者添加或删除目录里面的文件。 + +- 可执行(x)权限允许所有者访问目录里的文件。 + +在这里,一个目录的可执行权限意味着不仅允许读目录里的文件,还允许显示他们的属性,例如大小和修改时间。`ls`用于显示文件和目录的权限信息(更多)。当运行时带有`-l`选项,它将按给定顺序显示下列信息。 + +- 文件类型(第一个字母) + +- 文件的访问权限(9个字符,三个字符组成一组按照用户、组、其他的顺序表示) + +- 链接到文件的硬链接数 + +- 文件所有者的用户名 + +- 这个文件所属的组名 + +- 以字符(字节)为单位的文件大小 + +- 文件的日期和时间(mtime) + +- 文件的名字 + +字符 说明 + +||| +|-|-| +|-|普通文件| +|d|目录| +|l|符号链接| +|c|字符设备节点| +|b|块设备节点| +|p|命名管道| +|s|套接字| + +`chown`(1)用于 root 账户修改文件的所有者。`chgrp`(1)用于文件的所有者或 root 账户修改文件所属的组。`chmod`(1)用于文件的所有者或 root 账户修改文件和文件夹的访问权限。操作一个`foo`文件的基本语法如下 。 + +```Shell +sudo chown newowner foo +sudo chgrp newgroup foo +sudo chmod [ugoa][+-=][rwxXst][,...] foo +``` + + +例如,你可以按照下面使一个目录树被用户`foo`所有,并共享给组`bar`。 + +```Shell +cd /some/location/ +sudo chown -R foo:bar . +sudo chmod -R ug+rwX,o=rX . +``` + + +有三个更加特殊的权限位。 + +- Set-User-ID(SUID)位(s或S替换用户的x) + +- Set-Group-ID(SGID)位(s或S替换组的x) + +- 粘滞位(t或T替代其他用户的x) + +如果“`ls -l`”对这些位的输出是**大写字母**,则表示这些输出下面的执行位**未设置**。 + +给一个可执行文件设置 **Set-User-ID** 位将允许一个用户以他自己的ID运行这个可执行文件(例如 **root 用户**)。类似的,给一个可执行文件设置了**Set-Group-ID** 位将允许一个用户以文件所属组的 ID 运行该文件。(例如 **root** 组)。由于这些设置可能导致安全风险,设置它们为可用的时候需要格外留意。 + +在一个目录上设置“**Set-Group-ID**”将打开[类 BSD ](https://zh.wikipedia.org/wiki/Berkeley_Software_Distribution)的文件创建计划,所有在目录里面创建的文件将属于目录所属的**组**。 + +给一个目录设置“**粘滞位**”将保护该目录内的文件不被其所有者之外的一个用户删除。为了保护一个在像“`/tmp`”这样所有人可写或同组可写的目录下文件内容的安全,不仅要去除**可写**权限,还要给其所在目录设置**粘滞位**。否则,该文件可以被任意对其所在目录有写权限的用户删除并创建一个同名的新文件。 + +这里有一点有趣的文件权限例子。 + +```Shell +$ ls -l /etc/passwd /etc/shadow /dev/ppp /usr/sbin/exim4 +crw------T 1 root root 108, 0 Oct 16 20:57 /dev/ppp +-rw-r--r-- 1 root root 2761 Aug 30 10:38 /etc/passwd +-rw-r----- 1 root shadow 1695 Aug 30 10:38 /etc/shadow +-rwsr-xr-x 1 root root 973824 Sep 23 20:04 /usr/sbin/exim4 +$ ls -ld /tmp /var/tmp /usr/local /var/mail /usr/src +drwxrwxrwt 14 root root 20480 Oct 16 21:25 /tmp +drwxrwsr-x 10 root staff 4096 Sep 29 22:50 /usr/local +drwxr-xr-x 10 root root 4096 Oct 11 00:28 /usr/src +drwxrwsr-x 2 root mail 4096 Oct 15 21:40 /var/mail +drwxrwxrwt 3 root root 4096 Oct 16 21:20 /var/tmp +``` + + +`chmod`(1)有另一种数值模式来描述文件权限。这种数字模式使用3到4位八进制(底为8)数 + +|数字|说明| +|-|-| +|第一个可选数字|Set-User-ID (=4), Set-Group-ID (=2) 和 粘滞位 (=1) 之和| +|第二个数字|用户的可读 (=4), 可写 (=2)和 可执行 (=1) 权限之和| +|第三个数字|组权限同上| +|第四个数字位|其他用户权限同上| + +这听起来很复杂实际上相当简单。如果你把“`ls -l`”命令输出的前几列(2-10),看成以二进制(底为2)表示文件的权限(“-”看成0,“rwx”看成1),你应该可以理解用数字模式值的最后3位数字对文件权限的八进制表示。 + +尝试下列例子 + +```Shell +touch foo bar # 生产两个文件,分别为foo和bar +chmod u=rw,go=r foo # 将foo的用户给予读写权限 属组和其他给予只读权限 +chmod 644 bar +ls -l foo bar +-rw-r--r-- 1 penguin penguin 0 Oct 16 21:39 bar +-rw-r--r-- 1 penguin penguin 0 Oct 16 21:35 foo +``` + + +如果你需要在 shell 脚本中访问“`ls -l`”显示的信息,你需要使用相关命令,如`test`(1),`stat`(1)和`readlink`(1)。shell 内置命令,如“[”或“test”,可能也会用到。 + +## 1.2.4. 控制新建文件的权限:umask + +什么权限将应用到新建文件受 shell 内置命令 `umask` 的限制。参见`dash`(1),`bash`(1),和`内建命令`(7)。 + +```Shell + (file permissions) = (requested file permissions) & ~(umask value) +``` + + +|umask值|创建的文件权限|创建的目录权限|用法| +|-|-|-|-| +|0022|-rw-r--r--|-rwxr-xr-x|仅所属用户可写| +|0002|-rw-rw-r--|-rwxrwxr-x|仅所属组可写| + +deepin 默认使用用户私人组(UPG)。每当一个新用户添加到系统的时候都会创建一个UPG。UPG 的名字和创建它的用户相同,这个用户是这个UPG的唯一成员。自从每个用户都有自己的私人组之后,把umask设置成`0002`变得更安全了。(在某些 Unix 变体中,把所有普通用户设置到一个叫**`users`**的组是非常常见的做法,在这种情况下,出于安全考虑把umask设为`0022`是一个好主意) + +## 1.2.5. 一组用户的权限(组) + +为了使组权限应用到一个特定用户,这个用户需要通过使用 “`sudo vigr`” +编辑 `/etc/group` 以及使用 “`sudo vigr -s`” 编辑 `/etc/gshadow` 成为该 +组的成员。你需要注销之后重新登录(或运行 “`exec newgrp`”)以启用新 +的组配置。 + + + +或者,你可以通过添加一行 “`auth optional pam_group.so`”到 “`/etc/ +pam.d/common-auth`” 以及配置 “`/etc/security/group.conf`” ,使得在身 +份验证过程动态添加用户到组。(参见第 4 章认证和访问控制。) + + +在 deepin 系统中,硬件设备是另一种文件。如果你从一个用户账户访问 +某些设备出现问题,例如CD-ROM和U盘,你需要使这个用户成为相关 +组的成员。 +一些著名的由系统提供的组允许其成员不需要 root 权限访问某些特定的 +文件和设备。 + +|组|可访问文件和设备的描述| +|-|-| +|dialout|完全及直接的访问串口端口(“/dev/ttyS[0-3]”)| +|dip|有限的访问串口,创建到信任点的拨号 IP 连接| +|cdrom|CD-ROM, DVD+/-RW 驱动器| +|audio|音频设备| +|video|视频设备| +|scanner|扫描仪| +|adm|系统监控日志| +|staff|一些用于初级管理工作的目录:“/usr/local”,“/home”| + +你需要属于 dialout 组才能重配置调制解调器、拨号到任意地方,等等。 +但如果root 用户在 “/etc/ppp/peers/” 为受信任点创建了预定义配置文 +件的话,你只需要属于dip 组,就可以创建拨号 IP来连接到那些受信任的 +点上,需使用的命令行工具包括 pppd(8)、pon(1)以及poff(1)。 + +某些著名的由系统提供的组允许它们的成员不带 root 权限运行特定的命 +令。 + +|组|可访问命令| +|-|-| +|sudo|不带它们的密码运行 sudo| +|lpadmin|执行命令以从打印机数据库添加、修改、移除打印机| + +由系统提供的用户和组的完整列表,参见由 base-passwd包提供的`/usr/ +share/doc/base-passwd/users-and-groups.html`中,当前版本的“用户和 +组”。 +用户和组系统的管理命令,参见passwd(5),group(5),shadow(5), +newgrp(1),vipw(8),vigr(8),以及pam_group(8)。 + +## 1.2.6. 时间戳 + +GNU/Linux 文件有三种类型的时间戳。 + +|类型|含义(历史上 Unix 的定义)| +|-|-| +|mtime|文件修改时间(ls -1)| +|ctime|文件状态修改时间 (ls -lc)| +|atime|文件最后被访问的时间 (ls -lu)| + +**ctime** 不是文件创建时间。 + +**atime**在 GNU/Linux 系统上的真实值可能和历史上 Unix 的定义有所不同。 + +- 覆盖一个文件,将会改变该文件所有的 mtime, ctime, 和 atime 属性。 + +- 改变文件的所有者或者权限,将改变文件的 ctime 和 atime 属性。 + +- 在历史上的 Unix 系统中,读取一个文件将改变文件的 atime 属性。 + +- 读一个文件,将改变文件的 atime属性;在 GNU/Linux 系统上,这仅发生在其文件系统使用“strictatime”参数挂载的情况下。 + +- 如果 GNU/Linux 系统的文件系统使用 "relatime" 选项挂载,第一次读文件,或者随后读文件,将改变该文件的 atime 属性. (从 Linux 2.6.30 开始的默认行为) + +- 如果 GNU/Linux 系统的文件系统使用 "noatime" 挂载,则读一个文件,不会改变这个文件的 atime 属性。 + +为了在正常的使用场景中能够提升文件系统的读取效率,新增了 "noatime" 和 "relatime" 这两个加载选项。如使用了 "strictatime" 选项,即使简单的文件读操作都伴随着更新 atime 属性这个耗时的写操作。但是 atime 属性除了 mbox(5) 文件以外却很少用到。详情请看 mount(8) + +使用 touch(1) 命令修改已存在文件的时间戳。 + +对于时间戳,在非英语区域(“fr_FR.UTF-8”),ls 命令输出本地化字符串 + +```Shell +$ LANG=C ls -l foo +-rw-rw-r-- 1 penguin penguin 0 Oct 16 21:35 foo +$ LANG=en_US.UTF-8 ls -l foo +-rw-rw-r-- 1 penguin penguin 0 Oct 16 21:35 foo +$ LANG=fr_FR.UTF-8 ls -l foo +-rw-rw-r-- 1 penguin penguin 0 oct. 16 21:35 foo +``` + + +参考第 9.3.4 节 “定制时间和日期的显示” 自定义 “ls -l” 输出 。 + +## 1.2.7. 链接 + +有两种方法把一个文件 “`foo`” 链接到一个不同的文件名 “`bar`”。 + +- + + [硬链接](https://zh.wikipedia.org/wiki/Hard_link) + + - 对现有文件重复名称 + + - “`ln foo bar`” + +- [符号链接或 symlink](https://zh.wikipedia.org/wiki/Symbolic_link) + + - 通过名字指向另一个文件的特殊文件 + + - “`ln -s foo bar`” + +请参阅下面的示例,`rm` 命令结果中链接数的变化和细微的差别。 + +```Shell +$ umask 002 +$ echo "Original Content" > foo +$ ls -li foo +1449840 -rw-rw-r-- 1 penguin penguin 17 Oct 16 21:42 foo +$ ln foo bar # hard link +$ ln -s foo baz # symlink +$ ls -li foo bar baz +1449840 -rw-rw-r-- 2 penguin penguin 17 Oct 16 21:42 bar +1450180 lrwxrwxrwx 1 penguin penguin 3 Oct 16 21:47 baz -> foo +1449840 -rw-rw-r-- 2 penguin penguin 17 Oct 16 21:42 foo +$ rm foo +$ echo "New Content" > foo +$ ls -li foo bar baz +1449840 -rw-rw-r-- 1 penguin penguin 17 Oct 16 21:42 bar +1450180 lrwxrwxrwx 1 penguin penguin 3 Oct 16 21:47 baz -> foo +1450183 -rw-rw-r-- 1 penguin penguin 12 Oct 16 21:48 foo +$ cat bar +Original Content +$ cat baz +New Content +``` + + +硬链接可以在同一个文件系统内创建,并共用同一个 inode 号,由`ls`(1)带 “`-i`”选项显示。 + +符号链接总是名义上具有“`rwxrwxrwx`”的文件访问权限,如上面例子所示,实际的有效访问权限由它所指向的文件确定。 + +除非你有非常好的理由,否则不要创建一个复杂的符号链接或硬链接通常是个好主意。符号链接的逻辑组合可能导致文件系统噩梦般的无限循环。 + +通常使用符号链接比使用硬链接更合适,除非你有一个好理由使用硬链接。 + +“`.`”目录链接到它所在的目录,因此任何新建目录的链接数从2开始。“`..`”目录链接到父目录,因此目录的链接数随着新的子目录的创建而增加。 + +如果你刚从 Windows 迁移到Linux,你很快将清楚 Unix 的文件名链接相较于 Windows 最相近的“快捷方式”是多么精心设计的。由于它是在文件系统中实现的,应用无法看到链接文件跟原始文件之间的区别。在硬链接这种情况,这真的是毫无差别。 + +## 1.2.8. 命名管道(先进先出) + +[命名管道](https://zh.wikipedia.org/wiki/Named_pipe)是一个像管道一样的文件。你把内容放进了文件,它从另一端出来。因此,它被称为FIFO,即先进先出:你从管道这端先放进去的东西会从另一端先出来。 + +如果对一个命名管道进行写入操作,写入的过程不会被终止,直到写入的信息从管道中被读取出来。读取过程将会持续到没有信息可以读取为止。管道的大小始终是零,它不存储数据,它只是连接两个过程,像 shell 提供的 `1| 2`"语法功能一样。然而,一旦管道有了名称,这两个进程就可以不必在同一个命令行,甚至由同一个用户运行。管道是 UNIX 的一个非常有影响力的创新。 + +尝试下列例子 + +```Plain Text +$ cd; mkfifo mypipe +$ echo "hello" >mypipe & # put into background +[1] 8022 +$ ls -l mypipe +prw-rw-r-- 1 penguin penguin 0 Oct 16 21:49 mypipe +$ cat mypipe +hello +[1]+ Done echo "hello" >mypipe +$ ls mypipe +mypipe +$ rm mypipe +``` + + +## 1.2.9. 套接字 + +套接字被广泛应用于所有的互联网通信,数据库和操作系统本身。它类似于命名管道(FIFO)并且允许进程之间甚至不同计算机之间进行信息交换。对于套接字,这些进程不需要在同一时间运行,也不需要是同一个父进程的子进程。它是[进程间通信(IPC)](https://zh.wikipedia.org/wiki/Inter-process_communication)的一个节点。信息的交换可能会通过网络发生在不同主机之间。最常见的两种是 [互联网套接字](https://zh.wikipedia.org/wiki/Internet_socket) 和 [UNIX域套接字](https://zh.wikipedia.org/wiki/Unix_domain_socket) 。 + +通过 "`netstat -an`" 命令可以很方便的查看系统已经打开了哪些套接字。 + +## 1.2.10. 设备文件 + +[设备文件](https://zh.wikipedia.org/wiki/Device_file)包括系统的物理设备和虚拟设备,如硬盘、显卡、显示屏、键盘。虚拟设备的一个例子是控制台,用“`/dev/console`”来描述。 + +设备文件有两种类型。 + +- **字符设备** + + - 每次访问一个字符 + + - 一个字符等于一个字节 + + - 如键盘、串口… + +- **块设备** + + - 通过更大的单元–块,进行访问 + + - 一个块>一个字节 + + - 如硬盘等… + +你可以读写块设备文件,尽管该文件可能包含二进制数据,读取后显示出无法理解的乱码。向文件写入数据,有时可以帮助定位硬件连接故障。比如,你可以将文本文件导入打印机设备“`/dev/lp0`”,或者将调制解调命令发送到合适的串口“`/dev/ttyS0`”。但是,除非这些操作都小心完成,否则可能会导致一场大灾难。所以要特别小心。 + +常规访问打印机,使用`lp`(1)。 + +设备的节点数可以通过执行`ls`(1)得到,如下所示。 + +```Shell +$ ls -l /dev/sda /dev/sr0 /dev/ttyS0 /dev/zero +brw-rw---T 1 root disk 8, 0 Oct 16 20:57 /dev/sda +brw-rw---T+ 1 root cdrom 11, 0 Oct 16 21:53 /dev/sr0 +crw-rw---T 1 root dialout 4, 64 Oct 16 20:57 /dev/ttyS0 +crw-rw-rw- 1 root root 1, 5 Oct 16 20:57 /dev/zero +``` + + +- "`/dev/sda`"的主设备号是8,次设备号是0。它可以被`disk`群组的用户读写。 + +- "`/dev/sr0`"的主设备号是11,次设备号是0。它可以被`cdrom`群组的用户读写。 + +- "`/dev/ttyS0`"的主设备号是4,次设备号是64。它可以被`dailout`群组的用户读写。 + +- "`/dev/zero`"的主设备号是1,次设备号是5。它可以被任意用户读写。 + +在现代Linux系统中,处在"`/dev`"之下的文件系统会自动被`udev`()机制填充。 + +## 1.2.11. 特殊设备文件 + +还有一些特殊的设备文件。 + +|设备文件|操作|响应描述| +|-|-|-| +|/dev/null|读取|返回“文件结尾字符(EOF)“| +|/dev/null|写入|无返回(一个无底的数据转存深渊)| +|/dev/zero|读取|返回"\0空字符"(与ASCII中的数字0不同)| +|/dev/random|读取|从真随机数产生器返回一个随机字符,供应真熵(缓慢)| +|/dev/urandom|读取|从能够安全加密的伪随机数产生器返回一个随机字符| +|/dev/full|写入|返回磁盘已满(ENOSPC)错误| + +这些特别设备文件经常和 shell 数据重定向联合使用(参考[第 1.5.8 节 “典型的顺序命令和 shell 重定向”](https://www.debian.org/doc/manuals/debian-reference/ch01.zh-cn.html#_typical_command_sequences_and_shell_redirection))。 + +## 1.2.12. procfs 和 sysfs + +[procfs](https://zh.wikipedia.org/wiki/Procfs)和[sysfs](https://zh.wikipedia.org/wiki/Sysfs)两个伪文件系统,分别加载于"`/proc`"和"`/sys`"之上,将内核中的数据结构暴露给用户空间。或者说,这些条目是虚拟的,他们打开了深入了解操作系统运行的方便之门。 + +目录"`/proc`"为每个正在运行的进程提供了一个子目录,目录的名字就是进程标识符(PID)。需要读取进程信息的系统工具,如`ps`(),可以从这个目录结构获得信息。 + +"`/proc/sys`"之下的目录,包含了可以更改某些内核运行参数的接口。(你也可以使用专门的`sysctl`()命令修改,或者使用其预加载/配置文件"`/etc/sysctl.conf`"。) + +当人们看到这个特别大的文件"`/proc/kcore`"时,常常会惊慌失措。这个文件于你的的电脑内存大小相差不多。它被用来调试内核。它是一个虚拟文件,指向系统内存,所以不必担心它的大小。 + +"`/sys`"以下的目录包含了内核输出的数据结构,它们的属性,以及它们之间的链接。它同时也包含了改变某些内核运行时参数的接口。 + +参考"`proc.txt(.gz)`","`sysfs.txt(.gz)`",以及其他相关的Linux内核文档("`/usr/share/doc/linux-doc-*/Documentation/filesystems/*`"),这些文件由`linux-doc-*`软件包提供。 + +## 1.2.13. tmpfs + +[tmpfs](https://zh.wikipedia.org/wiki/Tmpfs#Linux)是一个临时文件系统,它的文件都保存在[虚拟内存](https://zh.wikipedia.org/wiki/Virtual_memory)中。必要时,位于内存[页缓存](https://zh.wikipedia.org/wiki/Page_cache)的tmpfs数据可能被交换到硬盘中的[交换分区](https://zh.wikipedia.org/wiki/Paging)。 + +系统启动早期阶段,"`/run`"目录挂载为tmpfs。这样即使"`/`"挂载为只读,它也是可以被写入的。它为过渡态文件提供了新的存储空间,同时也替代了[Filesystem Hierarchy Standar](https://zh.wikipedia.org/wiki/Filesystem_Hierarchy_Standard)2.3版中说明的目录位置: + +- "`/var/run`" → "`/run`" + +- "`/var/lock`" → "`/run/lock`" + +- "`/dev/shm`" → "`/run/shm`" + +参考"`tmpfs.txt(.gz)`", 文件位于Linux内核文档("`/usr/share/doc/linux-doc-*/Documentation/filesystems/*`")目录之下,由软件包`linux-doc-*`提供。 diff --git a/docs/GNU-linux教程/1.4.类Unix工作环境基础.md b/docs/GNU-linux教程/1.4.类Unix工作环境基础.md new file mode 100644 index 0000000..2cc6a53 --- /dev/null +++ b/docs/GNU-linux教程/1.4.类Unix工作环境基础.md @@ -0,0 +1,324 @@ + +# 1.4. 类 Unix 工作环境基础 + +虽然 MC 差不多可以让你做任何事情,但学会从 shell 提示下使用命令行工具也是非常重要的,可以让你变得熟悉类 Unix 工作环境。 + +## 1.4.1. 登录 shell + +因登录 shell 可以被一些系统初始化程序使用,请谨慎的把登录 shell 保持为 `bash`或者其他POSIX shell 例如zsh ,并避免把它转换为 `chsh`。 + +|软件包|POSIX shell|说明| +|-|-|-| +|bash|是|Bash: GNU Bourne Again SHell (事实上的标准)| +|bash-completion|N/A|bash shell 编程补全| +|dash|是|Debian Almquist Shell, 擅长 shell 脚本| +|zsh|是|Z shell:有许多增强的标准 shell| +|tcsh|No|TENEX C Shell: 一个 Berkeley csh 的增强版本| +|mksh|是|Korn shell 的一个版本| +|csh|No|OpenBSD C Shell, Berkeley csh 的一个版本| +|sash|是|有内置命令的 Stand-alone shell (并不意味着标准的 "/bin/sh")| +|ksh|是|Korn shell的真正的 AT&T 版本| +|rc|No|AT&T Plan 9 rc shell 的一个实现| +|posh|是|Policy-compliant Ordinary SHell 策略兼容的普通 shell(pdksh 派生)| +|fish|No|fish旨在成为一个比其他shell交互性更强、用户体验更好的shell| + +虽然类 POSIX 共享基本语法,但他们在 shell 变量和全局扩展等基本事情上,行为可以不同。细节请查阅他们的文档。 + +在本教程中,交互式的 shell 总是指 `bash`. + +## 1.4.2. 定制 bash + +你可以通过“`~/.bashrc`”来定制`bash`(1)的行为。 + +尝试下列例子。 + +```Shell +# enable bash-completion +if ! shopt -oq posix; then + if [ -f /usr/share/bash-completion/bash_completion ]; then + . /usr/share/bash-completion/bash_completion + elif [ -f /etc/bash_completion ]; then + . /etc/bash_completion + fi +fi + +# CD upon exiting MC +. /usr/lib/mc/mc.sh + +# set CDPATH to a good one +CDPATH=.:/usr/share/doc:~:~/Desktop:~ +export CDPATH + +PATH="${PATH+$PATH:}/usr/sbin:/sbin" +# set PATH so it includes user's private bin if it exists +if [ -d ~/bin ] ; then + PATH="~/bin${PATH+:$PATH}" +fi +export PATH + +EDITOR=vim +export EDITOR +``` + + +你可以在第 9 章 系统技巧中的第 9.3.6 节 “有颜色输出的命令”找到更多关于bash的定制技巧。 + +bash-completion 软件包能够让 bash 进行命令补全. + +## 1.4.3. ZSH + +zsh是我个人更为推荐的shell,在安装插件之后能实现自动补全,自动记忆以及高亮命令。 + +zsh几乎100%兼容bash的操作 + +具体教程不在这里赘述,请移步-→ + +## 1.4.4. 特殊按键 + +在 [类Unix](https://zh.wikipedia.org/wiki/Unix-like) 环境,有一些具有特殊含义的按键。请注意,普通的Linux字符控制台,只有左手边的 `Ctrl` 和 `Alt` 键可以正常工作。其中有几个值得记住的按键。 + +|快捷键|描述| +|-|-| +|Ctrl-U|删除光标前到行首的字符| +|Ctrl-H|删除光标前的一个字符| +|Ctrl-D|终止输入(如果你在使用 shell,则退出 shell)| +|Ctrl-C|终止一个正在运行的程序| +|Ctrl-Z|通过将程序移动到后台来暂停程序| +|Ctrl-S|停止屏幕输出| +|Ctrl-Q|激活屏幕输出| +|Ctrl-Alt-Del|重启/关闭系统,参见 inittab(5)| +|左 Alt 键(可选择同时按下 Windows-key)|Emacs 和相似 UI 的元键(meta-key)| +|Up-arrow 向上方向键|开始在bash 中查看命令历史| +|Ctrl-R|开始在 bash 的增量命令历史中搜索| +|Tab|在 bash 命令行中补全文件名| +|Ctrl-V Tab|在 bash 命令行中输入 Tab 而不是进行补全| + +## 1.4.5. 鼠标操作 + +[Debian 系统针对文本的鼠标操作混合 2 种风格](https://specifications.freedesktop.org/clipboards-spec/clipboards-latest.txt),外加一些新的方法: + +- 传统的 Unix 鼠标操作方式: + + - 使用 3 个按钮(单击) + + - 使用主要键 + + - 由 X 应用,如 `xterm`,以及文本应用在控制台中使用 + +- 现代 GUI(图形用户界面)鼠标操作方式: + + - 使用 2 个按钮(拖动 + 单击) + + - 使用主要键和剪贴板 + + - 用于现代的 GUI(图形用户界面)应用,比如 `deepin-terminal` + +|操作|响应| +|-|-| +|左击并拖动鼠标|主要键的选择作为选择范围| +|单击左键|主要键的位置作为选择范围的开头| +|单击右键(传统方式)|主要键的位置作为选择范围的结尾| +|单击右键(现代方式)|依赖上下文的菜单(剪切、拷贝、粘贴)| +|点击中键或者 Shift-Ins|在光标处插入主要键的选择| +|Ctrl-X|剪切主要键的选择到剪贴板| +|Ctrl-C (在终端是 Shift-Ctrl-C )|拷贝主要键的选择到剪贴板| +|Ctrl-V (在终端是 Shift-Ctrl-V )|粘贴剪切板的内容到光标处| + +这里,主要键的选择会高亮文本范围。在终端程序内,使用 `Shift-Ctrl-C` 来代替,这样可以避免终止一个运行的程序。 + +在现代滚轮鼠标上的中央滚轮,被认为是中间键,并可以被当做中间键使用。在 2 键鼠标系统的情况下,同时按左键和右键就相当于按中间键。 + +为了在 Linux 字符控制台中使用鼠标,您需要让 `gpm`(8) 作为后台守护进程(daemon)运行。 + +## 1.4.6. 分页程序 + +`less`(1) 命令是一个增强版的分页程序(文件内容查看器)。它按照指定的命令参数或标准输出来读取文件。在用 `less` 命令查看的时候如果需要帮助可以按 “`h`”。它的功能比 `more`(1) 命令更丰富,通过在脚本的开头执行 "`eval $(lesspipe)`" 或 "`eval $(lessfile)`" 它的功能还能变得更加强大。详细请参考 "`/usr/share/doc/less/LESSOPEN`"。 "`-R`" 选项可以实现原始的字符输出还可以启用 ANSI 颜色转义序列。详细请参考 `less`(1)。 + +## 1.4.7. 文本编辑器 + +在使用类 Unix 系统过程中, 各种类似于[Vim](https://zh.wikipedia.org/wiki/Vim_(text_editor)) 或 [Emacs](https://zh.wikipedia.org/wiki/Emacs)的工具,你应该精通其中的一个。 + +我认为习惯于使用 Vim 命令是一个明智的选择,因为 Linux/Unix 系统里一般都附带了 Vi 编辑器。 (实际上最初的 `vi` 以及后来的 `nvi` 这类工具程序很常见。因为在 Vim 里提供了`F1`帮助键,在同类工具中它的功能更强大,所以我选择 Vim 而不是其它新出的一些工具。) + +假设你不是用 [Emacs](https://zh.wikipedia.org/wiki/Emacs) 就是用 [XEmacs](https://zh.wikipedia.org/wiki/XEmacs) 作为你的编辑器,其实还有更好的选择,尤其是在编程的时候。 Emacs 还有很多其他的特点,包括新手导读,目录编辑器,邮件客户端等等。当编写脚本或程序的时候,它能自动识别当前工作模式所对应的格式,让使用更加便利。一些人甚至坚持认为 Linux 系统里最需要配备的就是 Emacs。花十分钟来学习 Emacs 可以为后面的工作剩下更多时间。在此强烈推荐学习使用 Emacs 时候直接使用 GNU Emacs 参考手册。 + +在实践应用中所有这些程序都会有一个教程,输入 "`vim`" 和F1键就可以启动Vim。建议你最好阅读一下前面的 35 行。移动光标到 "`|tutor|`" 并按 `Ctrl-]` 就可以看到在线培训教程。 + +其实很多人初次接触vim的时候觉得vim有点反人类,一开始连退出都不知道在那里,但是用熟悉了就真香了。 + +好的编辑器,像 Vim 和 Emacs,可以处理 UTF-8 及其它不常用编码格式的文本。有个建议就是在 GUI(图形用户界面) 环境下使用 UTF-8 编码,并安装要求的程序和字体。编辑器里可以选择独立于 GUI(图形用户界面)环境的编码格式。关于多字节文本可以查阅参考文档。 + +GUI文本编辑器deepin内置了deepin-editor,是非常好用的,还有宇宙第一ide——装了插件的vscode(见vscode的词条) + +## 1.4.8. 设置默认文本编辑器 + +Debian 有许多不同的编辑器。我们建议安装上面提到的 `vim` 软件包。 + +Debian 通过命令“`/usr/bin/editor`”提供了对系统默认编辑器的统一访问,因此其它程序(例如 `reportbug`(1))可以调用它。你可以通过下列命令改变它。 + +```Shell +$ sudo update-alternatives --config editor +``` + + +对于新手,我建议使用“`/usr/bin/vim.basic`”代替“`/usr/bin/vim.tiny`”,因为它支持格式高亮。 + +## 1.4.9.使用 + +使用vim我个人认为是很难在这一点页面说完的,所以本着不重复造轮子的思想,在这放出基本命令和优质中文教程: + +|模式|按键|操作| +|-|-|-| +|普通|:help|only| +|普通|:e filename.ext|打开新的缓冲区来编辑 filename.ext| +|普通|:w|把目前的缓冲区改写到原始文件| +|普通|:w filename.ext|写入当前缓冲区到 filename.ext| +|普通|:q|退出 vim| +|普通|:q!|强制退出 vim| +|普通|:only|关闭所有其它分割打开的窗口| +|普通|:set nocompatible?|检查 vim 是否在完全的 nocompatible 模式| +|普通|:set nocompatible|设置 vim 到完全的 nocompatible 模式| +|普通|i|进入 插入 模式| +|普通|R|进入 替代 模式| +|普通|v|进入 可视 模式| +|普通|V|进入 可视 行 模式| +|普通|Ctrl-V|进入 可视 块 模式| +|除了 TERMINAL-JOB 外|ESC-键|进入 普通 模式| +|普通|:term|进入 TERMINAL-JOB 模式| +|TERMINAL-NORMAL|i|进入 TERMINAL-JOB 模式| +|TERMINAL-JOB|Ctrl-W N (或者 Ctrl-\ Ctrl-N)|进入 TERMINAL-NORMAL 模式| +|TERMINAL-JOB|Ctrl-W :|在TERMINAL-NORMAL 模式里进入Ex-模式| + +请使用 "`vimtutor`" 程序来学习 `vim`,通过一个交互式的指导课程。 + +`vim` 程序基于 **模式** 输入的按键来改变它的行为。在 `插入`-模式和 `替代`-模式下,输入的按键大部分进入了缓冲区。移动光标大部分在 `普通`-模式下完成。交互选择在 `可视`-模式下完成。在`普通`-模式下输入 "`:`" ,改变它的 **模式** 进入到 `Ex`-模式。 `Ex`-接受命令。 + +## 1.4.10. 记录 shell 活动 + + + +shell 命令的输出有可能滚动出了屏幕,并可能导致你无法再查看到它。将shell活动记录到文件中再来回顾它是个不错的主意。当你执行任何系统管理任务时,这种记录是必不可少的。 + +记录 shell 活动的基本方法是在`script`(1)下运行 shell。 + +尝试下列例子 + +```Shell +$ script +Script started, file is typescript +``` + + +在`script`下使用任何 shell 命令。 + +按`Ctrl-D`来退出`script`。 + +```Shell +$ vim typescript +``` + + +## 1.4.11. 基本的 Unix 命令 + +让我们来学习基本的 Unix 命令。在这里,我指的是一般意义上的“UNIX”。任何 UNIX 克隆系统通常都会提供等价的命令。deepin 系统也不例外。如果有一些命令不像你想的那样起作用,请不要担心。如果 shell 中使用了别名,其对应的命令输出会不同。这些例子并不意味着要以这个顺序来执行。 + +尝试使用非特权用户账号来使用下列的命令。 + +|命令|说明| +|-|-| +|pwd|显示当前/工作目录的名称| +|whoami|显示当前的用户名| +|id|显示当前用户的身份(名称、uid、gid和相关组)| +|file foo|显示“foo”文件的文件类型| +|type -p commandname|显示命令的文件所处位置“commandname”| +|which commandname|同上| +|type commandname|显示“commandname”命令的相关信息| +|apropos key-word|查找与“key-word”有关的命令| +|man -k key-word|同上| +|whatis commandname|用一行解释 “commandname” 命令| +|man -a commandname|显示“commandname”命令的解释(Unix 风格)| +|info commandname|显示“commandname”命令相当长的解释(GNU风格)| +|ls|显示目录内容(不包含以 . 点号开头的文件和目录)| +|ls -a|显示目录内容(包含所有文件和目录)| +|ls -A|显示目录内容(包含几乎所有文件和目录,除了“..”和“.”)| +|ls -la|显示所有的目录内容,并包含详细的信息| +|ls -lai|显示所有的目录内容,并包含inode和详细的信息| +|ls -d|显示当前目录下的所有目录| +|tree|使用树状图显示目录内容| +|lsof foo|列出处于打开状态的文件 "foo"| +|lsof -p pid|列出被某进程打开的文件: "pid"| +|mkdir foo|在当前目录中建立新目录“foo”| +|rmdir foo|删除当前目录中的“foo”目录| +|cd foo|切换到当前目录下或变量“$CDPATH”中的“foo”目录| +|cd /|切换到根目录| +|cd|切换到当前用户的家目录| +|cd /foo|切换到绝对路径为“/foo”的目录| +|cd ..|切换到上一级目录| +|cd ~foo|切换到用户“foo”的家目录| +|cd -|切换到之前的目录| +| foo|将“README.gz”解压后的内容输出到文件“foo”中| +|zcat README.gz >> foo|将“README.gz”解压后的内容添加到文件“foo”的末尾(如果文件不存在,则会先建立该文件)| + +Unix 有一个惯例,以“.”开头的文件将被隐藏。它们一般为包含了配置信息和用户首选项的文件。 + + 对于cd命令,参见builtins(7)。 + + 基本的 Debian 系统的默认分页程序是 more(1),它无法往回滚动。通过命令 “apt-get install less" 安装 less 软件包后,less(1) 会成为默认的分页程序,它可以通过方向键往回滚动。 + + "[" 和"]" 在正则表达式 "ps aux | grep -e "[e]xim4*"" 命令中,可以避免grep在结果中排除它自己, 正则表达式中的 "4*" 意思是空或字符"4" ,这样可以让 grep 既找到 "exim" 也找到 "exim4"。 虽然 "*" 可以用于命令名称匹配和正则表达式中,但是它们的含义是不一样的。欲详细了解正则表达式可以参考 grep(1)。 + +作为训练,请使用上述的命令来遍历目录并探究系统。如果你有任何有关控制台命令的问题,请务必阅读手册。 + +尝试下列例子 + +```Shell +$ man man +$ man bash +$ man builtins +$ man grep +$ man ls +``` + + +手册的风格可能让人有点难以习惯,因为它们都相当简洁,尤其是比较老旧、非常传统的那些手册。但是,一旦你习惯了它,你来欣赏它们的简洁。 + +请注意,许多 类 Unix 命令(包含来自 GNU 和 BSD 的)都可以显示简短的帮助信息,你可以使用下列的其中一种方式来查看它(有时不带任何参数也可以)。 + +```Shell +commandname --help +$ commandname -h +``` diff --git a/docs/GNU-linux教程/1.5.简单shell命令.md b/docs/GNU-linux教程/1.5.简单shell命令.md new file mode 100644 index 0000000..13b744c --- /dev/null +++ b/docs/GNU-linux教程/1.5.简单shell命令.md @@ -0,0 +1,297 @@ + +# 1.5. 简单 shell 命令 + +现在,你对如何使用 deepin 系统已经有一些感觉了。让我们更深入了解 deepin 系统的命令执行机制。在这里,我将为新手做一般的讲解。精确的解释参见`bash`(1)。 + +一般的命令由有序的组件构成。 + +- 设置变量值(可选) + +- 命令名 + +- 参数(可选) + +- 重定向(可选:`>`, `>>` , `<`, `<<` 等等) + +- 控制操作(可选:`&&` , `||` , 换行符 , `;` , `&` , `(` , `)`) + +## 1.5.1. 命令执行和环境变量 + +一些[环境变量](https://zh.wikipedia.org/wiki/Environment_variable)的值会改变部分 Unix 命令的行为。 + +环境变量的默认值由 PAM 系统初始化,其中一些会被某些应用程序重新设定。 + +- PAM(可插拔身份验证模块)系统的模块,比如 `pam_env` 模块,可以通过 `/etc/pam.conf`"、 "`/etc/environment`"和"`/etc/default/locale`"设置环境变量。 + +- 显示管理器(例如`gdm3`)可以通过"`~/.profile`"给 GUI(图形用户界面)会话重新设定环境变量。 + +- 用户特有的程序初始化时,可以重新设置在 "`~/.profile`"、"`~/.bash_profile`" 和 "`~/.bashrc`" 中设置的环境变量。 + +## 1.5.2. “`$LANG`”变量 + +默认的语言环境是在 "`$LANG`" 环境变量中定义,它在安装的时候配置为 "`LANG=xx_YY.UTF-8`",或者在接下来的 GUI(图形用户界面)中配置,例如在 GNOME 中是,"设置" → "区域 & 语言" → "语言" / "格式"。 + +目前建议最好用变量 "`$LANG`" 来配置系统环境变量,只有在逼不得已的情况下才用 `$LC_*`" 开头的变量 + +`$LANG`” 变量的完整的语言环境值由3部分组成:“`xx_YY.ZZZZ`”。 + +|语言环境值|说明| +|-|-| +|xx|ISO 639 语言代码(小写)例如“en”| +|YY|ISO 3166 国家代码(大写)例如“US”| +|ZZZZ|编码,总是设置为“UTF-8”| + +|语言环境推荐|语言(地区)| +|-|-| +|en_US.UTF-8|英语(美国)| +|en_GB.UTF-8|英语(大不列颠)| +|fr_FR.UTF-8|法语(法国)| +|de_DE.UTF-8|德语(德国)| +|it_IT.UTF-8|意大利语(意大利)| +|es_ES.UTF-8|西班牙语(西班牙)| +|ca_ES.UTF-8|加泰隆语(西班牙)| +|sv_SE.UTF-8|瑞典语(瑞典)| +|pt_BR.UTF-8|葡萄牙语(巴西)| +|ru_RU.UTF-8|俄语(俄国)| +|zh_CN.UTF-8|汉语(中华人民共和国)| +|zh_TW.UTF-8|汉语(中国台湾省)| +|ja_JP.UTF-8|日语(日本)| +|ko_KR.UTF-8|韩语(韩国)| +|vi_VN.UTF-8|越南语(越南)| + +使用 shell 命令行按顺序执行下列典型的命令。 + +```Shell +$ echo $LANG +en_US.UTF-8 +$ date -u +Wed 19 May 2021 03:18:43 PM UTC +$ LANG=fr_FR.UTF-8 date -u +mer. 19 mai 2021 15:19:02 UTC +``` + + +这里,`date`(1)程序执行时使用了不同的语言环境值 + +- 第一个命令,“`$LANG`” 设置为系统的默认[语言环境](https://zh.wikipedia.org/wiki/Locale)值 “`en_US.UTF-8`”。 + +- 第二个命令,“`$LANG`”设置为法语的 UTF-8 [语言环境](https://zh.wikipedia.org/wiki/Locale)值“`fr_FR.UTF-8`”。 + +大多数的命令在执行时并没有预先定义环境变量。对于上面的例子,你也可以选择如下的方式。 + +```Shell +$ LANG=fr_FR.UTF-8 +$ date -u +mer. 19 mai 2021 15:19:24 UTC +``` + + +对于语言环境配置的细节,参见 [第 8.1 节 “语言环境”](https://www.debian.org/doc/manuals/debian-reference/ch08.zh-cn.html#_the_locale) + +## 1.5.3. "`$PATH`" 变量 + +当你在 Shell 里输入命令的时候,Shell 会在 "`$PATH`" 变量所包含的目录列表里进行搜索,"`$PATH`" 变量的值也叫作 Shell 的搜索路径。 + +可以在 Bash 脚本文件 "`~/.bash_profile`" 或 "`~/.bashrc`" 中改变 "`$PATH`" 环境变量的值。 + +在zsh中为`~/.zshrc` + +## 1.5.4. "`$HOME`" 变量 + +很多命令在用户目录中都存放了用户指定的配置,然后通过配置的内容来改变它的执行方式,用户目录通常用 "`$HOME`" 变量来指定。 + +|"$HOME" 变量的值|程序运行环境| +|-|-| +|/|初始进程执行的程序(守护进程)| +|/root|root 用户权限 Shell 执行的程序| +|/home/normal_user|普通用户权限Shell执行的程序| +|/home/normal_user|普通用户 GUI 桌面菜单执行的程序| +|/home/normal_user|用 root 用户权限来执行程序 "sudo program"| +|/root|用 root 用户权限执行程序 "sudo -H program"| + +Shell 扩展 "~/" 为转入当前用户的主目录,也就是"$HOME/"。Shell 扩展 "~foo/" 为foo 的目录,也就是 "/home/foo/"。 + +## 1.5.5. 命令行选项 + +一些命令附带参数。这些参数以 "`-`" 或 "`--`" 开头,通常称之为选项,用来控制命令的执行方式。 + +```Shell +$ date +Thu 20 May 2021 01:08:08 AM JST +$ date -R +Thu, 20 May 2021 01:08:12 +0900 +``` + + +这里的命令参数 "`-R`" 改变 `date`(1) 命令输出为 [RFC2822](http://tools.ietf.org/html/rfc2822) 标准的日期字符格式。 + +## 1.5.6. Shell 通配符 + + + +经常有这种情况你期望命令成串自动执行而不需要挨个输入,将文件名扩展为 **glob**,(有时候被称为 **通配符**),以此来满足这方面的需求。 + +|shell glob 模式|匹配规则描述| +|-|-| +|*|不以 "." 开头的文件名(段)| +|.*|以 "." 开头的文件名(段)| +|?|精确字符| +|[…]|包含在括号中的任意字符都可以作为精确字符| +|[a-z]|"a" 到 "z" 之间的任意一个字符都可以作为精确字符| +|[^…]|除了包含在括号中的任意字符 ( " 1^ 2"除外 ),其它字符都可以作为精确字符| + + + +尝试下列例子 + +```Shell +$ mkdir junk; cd junk; touch 1.txt 2.txt 3.c 4.h .5.txt ..6.txt +$ echo *.txt +1.txt 2.txt +$ echo * +1.txt 2.txt 3.c 4.h +$ echo *.[hc] +3.c 4.h +$ echo .* +. .. .5.txt ..6.txt +$ echo .*[^.]* +.5.txt ..6.txt +$ echo [^1-3]* +4.h +$ cd ..; rm -rf junk +``` + + +参见 `glob`(7)。 + +与 shell 通用的文件名匹配方式不同, 使用 " `-name` " 选项的 `find` (1),其 shell 模式" `*` " ,匹配以" `.` "开始的文件名.(新[ POSIX ](https://zh.wikipedia.org/wiki/POSIX)的特性) + +BASH 可以使用内置的 shopt 选项如 " `dotglob` "," `noglob` "," `nocaseglob` "," `nullglob` "," `extglob` "定制全局行为,使用 `bash` ( 1 )查看详细说明。 + +## 1.5.7. 命令的返回值 + +每个命令都会返回它的退出状态(变量:“`$?`”)作为返回值。 + +|命令的退出状态|数字返回值|逻辑返回值| +|-|-|-| +|success|zero, 0|TRUE| +|error|non-zero, -1|FALSE| + +尝试下列例子。 + +```Shell +$ [ 1 = 1 ] ; echo $? +0 +$ [ 1 = 2 ] ; echo $? +1 +``` + + +## 1.5.8. 典型的顺序命令和 shell 重定向 + +让我们试着记住下面 Shell 命令里部分命令行所使用的命令习语。 + +|命令常见用法|说明| +|-|-| +|command &|在子 shell 的后台 中执行 command| +|command1|command2| +|command1 2>&1|command2| +|command1 ; command2|依次执行 command1 和 command2| +|command1 && command2|执行 command1;如果成功,按顺序执行 command2(如果 command1 和 command2 都执行成功了,返回 success )| +|command1|| +|command > foo|将 command 的标准输出重定向到文件 foo(覆盖)| +|command 2> foo|将 command 的标准错误重定向到文件 foo(覆盖)| +|command >> foo|将 command 的标准输出重定向到文件 foo(附加)| +|command 2>> foo|将 command 的标准错误重定向到文件 foo(附加)| +|command > foo 2>&1|将 command 的标准输出和标准错误重定向到文件 foo| +|command < foo|将 command 的标准输入重定向到文件 foo| +|command << delimiter|将 command 的标准输入重定向到下面的命令行,直到遇到“delimiter”(here document)| +|command <<- delimiter|将 command 的标准输入重定向到下面的命令行,直到遇到“delimiter”(here document,命令行中开头的制表符会被忽略| + +deepin 系统是一个多任务的操作系统。后台任务让用户能够在一个 shell 中执行多个程序。后台进程的管理涉及 shell 的内建命令:`jobs`、`fg`、`bg` 和 `kill`。请阅读 bash(1) 中的章节:“SIGNALS”、“JOB CONTROL” 和 “`builtins`(1)”。 + +尝试下列例子 + +```Shell +$ foo +$ exec 3foo 4bar # open files +$ cat <&3 >&4 # redirect stdin to 3, stdout to 4 +$ exec 3<&- 4>&- # close files +$ cat bar +Hello +``` + + +预定义的文件描述符0-2。 + +|设备|说明|文件描述符| +|-|-|-| +|stdin|标准输入|0| +|stdout|标准输出|1| +|stderr|标准错误|2| + +## 1.5.9. 命令别名 + +你可以为经常使用的命令设置一个别名。 + +尝试下列例子 + +```Shell +$ alias la='ls -la' +``` + + +现在,“`la`”是“`ls -al`”的简写形式,并同样会以长列表形式列出所有的文件。 + +你可以使用 `alias` 来列出所有的别名(参见 `bash`(1) 中的“SHELL BUILTIN COMMANDS”)。 + +```Shell +$ alias +... +alias la='ls -la' +``` + + +你可以使用 `type` 来确认命令的准确路径或类型(参见 `bash`(1) 中的“SHELL BUILTIN COMMANDS”)。 + +尝试下列例子 + +```Shell +$ type ls +ls is hashed (/bin/ls) +$ type la +la is aliased to ls -la +$ type echo +echo is a shell builtin +$ type file +file is /usr/bin/file +``` + + +`ls` 在最近被使用过,而 “`file`” 没有,因此 “`ls`” 标记为 “hashed”(被录入哈希表),即 shell 有一个内部的记录用来快速访问 “`ls`” 所处的位置。 + +记住 alia命令定义的别名仅在当前shell有效,如果关闭或重启shell则不会保留别名。如果想长久保留,请将其写入坏境变量中。 diff --git a/docs/GNU-linux教程/1.6.类Unix的文本处理.md b/docs/GNU-linux教程/1.6.类Unix的文本处理.md new file mode 100644 index 0000000..0502c54 --- /dev/null +++ b/docs/GNU-linux教程/1.6.类Unix的文本处理.md @@ -0,0 +1,61 @@ +# 1.6. 类 Unix 的文本处理 + +在类 Unix 的工作环境中,文本处理是通过使用管道组成的标准文本处理工具链完成的。这是另一个重要的 Unix 创新。 + +## 1.6.1. Unix 文本工具 + +这里有一些在类 Unix 系统中经常使用到的标准文本处理工具。 + +- 没有使用正则表达式: + + - cat(1) 连接文件并输出全部的内容。 + + - tac(1) 连接文件并反向输出。 + + - cut(1) 选择行的一部分并输出。 + + - head(1) 输出文件的开头。 + + - tail(1) 输出文件的末尾。 + + - sort(1) 对文本文件的行进行排序。 + + - uniq(1) 从已排序的文件中移除相同的行。 + + - tr(1) 转换或删除字符。 + + - diff(1) 对文件的行进行对比。 + +- 默认使用基础正则表达式( BRE ): + + - ed(1) 是一个原始行编辑器。 + + - sed(1) 是一个流编辑器。 + + - grep(1) 匹配满足 pattern 的文本。 + + - vim(1) 是一个屏幕编辑器。 + + - emacs(1) 是一个屏幕编辑器。(有些扩展的 BRE ) + + 使用扩展的正则表达式( ERE ): + +- 使用扩展的正则表达式( ERE ): + + - awk(1) 进行简单的文本处理。 + + - egrep(1) 匹配满足多个 pattern 的文本。 + + - tcl(3tcl) 可以进行任何你想得到的文本处理:参见 re_syntax(3)经常与 tk(3tk) 一起使用。 + + - perl(1) 可以进行任何你想得到的文本处理。参见 perlre(1) + + - pcregrep 软件包中的 pcregrep(1) 可以匹配满足 Perl 兼容正则表达式(PCRE) 模式的文本。 + + - ripgrep 是对grep最佳的替代,命令是rg + + - 带有 re 模块的 python(1) 可以进行任何你想得到的文本处理。参见“/usr/share/doc/python/html/index.html”。 + +- 如果你不确定这些命令究竟做了什么,请使用“man command” 来自己把它搞清楚吧。 + +推荐文本工具:neovim batcat ripgrep diff --git a/docs/GNU-linux教程/GNU-linux教程.md b/docs/GNU-linux教程/GNU-linux教程.md new file mode 100644 index 0000000..b722a09 --- /dev/null +++ b/docs/GNU-linux教程/GNU-linux教程.md @@ -0,0 +1,699 @@ + + +## 1.3.deepin terminal使用指南 + +deepin trmianal是深度社区自研的一款终端模拟器,功能简单而实用 + +### 1.3.1 + +## 1.4. 类 Unix 工作环境基础 + +虽然 MC 差不多可以让你做任何事情,但学会从 shell 提示下使用命令行工具也是非常重要的,可以让你变得熟悉类 Unix 工作环境。 + +### 1.4.1. 登录 shell + +因登录 shell 可以被一些系统初始化程序使用,请谨慎的把登录 shell 保持为 `bash`或者其他POSIX shell 例如zsh ,并避免把它转换为 `chsh`。 + +|软件包|POSIX shell|说明| +|-|-|-| +|bash|是|Bash: GNU Bourne Again SHell (事实上的标准)| +|bash-completion|N/A|bash shell 编程补全| +|dash|是|Debian Almquist Shell, 擅长 shell 脚本| +|zsh|是|Z shell:有许多增强的标准 shell| +|tcsh|No|TENEX C Shell: 一个 Berkeley csh 的增强版本| +|mksh|是|Korn shell 的一个版本| +|csh|No|OpenBSD C Shell, Berkeley csh 的一个版本| +|sash|是|有内置命令的 Stand-alone shell (并不意味着标准的 "/bin/sh")| +|ksh|是|Korn shell的真正的 AT&T 版本| +|rc|No|AT&T Plan 9 rc shell 的一个实现| +|posh|是|Policy-compliant Ordinary SHell 策略兼容的普通 shell(pdksh 派生)| +|fish|No|fish旨在成为一个比其他shell交互性更强、用户体验更好的shell| + +虽然类 POSIX 共享基本语法,但他们在 shell 变量和全局扩展等基本事情上,行为可以不同。细节请查阅他们的文档。 + +在本教程中,交互式的 shell 总是指 `bash`. + +### 1.4.2. 定制 bash + +你可以通过“`~/.bashrc`”来定制`bash`(1)的行为。 + +尝试下列例子。 + +```Shell +# enable bash-completion +if ! shopt -oq posix; then + if [ -f /usr/share/bash-completion/bash_completion ]; then + . /usr/share/bash-completion/bash_completion + elif [ -f /etc/bash_completion ]; then + . /etc/bash_completion + fi +fi + +# CD upon exiting MC +. /usr/lib/mc/mc.sh + +# set CDPATH to a good one +CDPATH=.:/usr/share/doc:~:~/Desktop:~ +export CDPATH + +PATH="${PATH+$PATH:}/usr/sbin:/sbin" +# set PATH so it includes user's private bin if it exists +if [ -d ~/bin ] ; then + PATH="~/bin${PATH+:$PATH}" +fi +export PATH + +EDITOR=vim +export EDITOR +``` + + +你可以在第 9 章 系统技巧中的第 9.3.6 节 “有颜色输出的命令”找到更多关于bash的定制技巧。 + +bash-completion 软件包能够让 bash 进行命令补全. + +### 1.4.3. ZSH + +zsh是我个人更为推荐的shell,在安装插件之后能实现自动补全,自动记忆以及高亮命令。 + +zsh几乎100%兼容bash的操作 + +具体教程不在这里赘述,请移步-→ + +### 1.4.4. 特殊按键 + +在 [类Unix](https://zh.wikipedia.org/wiki/Unix-like) 环境,有一些具有特殊含义的按键。请注意,普通的Linux字符控制台,只有左手边的 `Ctrl` 和 `Alt` 键可以正常工作。其中有几个值得记住的按键。 + +|快捷键|描述| +|-|-| +|Ctrl-U|删除光标前到行首的字符| +|Ctrl-H|删除光标前的一个字符| +|Ctrl-D|终止输入(如果你在使用 shell,则退出 shell)| +|Ctrl-C|终止一个正在运行的程序| +|Ctrl-Z|通过将程序移动到后台来暂停程序| +|Ctrl-S|停止屏幕输出| +|Ctrl-Q|激活屏幕输出| +|Ctrl-Alt-Del|重启/关闭系统,参见 inittab(5)| +|左 Alt 键(可选择同时按下 Windows-key)|Emacs 和相似 UI 的元键(meta-key)| +|Up-arrow 向上方向键|开始在bash 中查看命令历史| +|Ctrl-R|开始在 bash 的增量命令历史中搜索| +|Tab|在 bash 命令行中补全文件名| +|Ctrl-V Tab|在 bash 命令行中输入 Tab 而不是进行补全| + +### 1.4.5. 鼠标操作 + +[Debian 系统针对文本的鼠标操作混合 2 种风格](https://specifications.freedesktop.org/clipboards-spec/clipboards-latest.txt),外加一些新的方法: + +- 传统的 Unix 鼠标操作方式: + + - 使用 3 个按钮(单击) + + - 使用主要键 + + - 由 X 应用,如 `xterm`,以及文本应用在控制台中使用 + +- 现代 GUI(图形用户界面)鼠标操作方式: + + - 使用 2 个按钮(拖动 + 单击) + + - 使用主要键和剪贴板 + + - 用于现代的 GUI(图形用户界面)应用,比如 `deepin-terminal` + +|操作|响应| +|-|-| +|左击并拖动鼠标|主要键的选择作为选择范围| +|单击左键|主要键的位置作为选择范围的开头| +|单击右键(传统方式)|主要键的位置作为选择范围的结尾| +|单击右键(现代方式)|依赖上下文的菜单(剪切、拷贝、粘贴)| +|点击中键或者 Shift-Ins|在光标处插入主要键的选择| +|Ctrl-X|剪切主要键的选择到剪贴板| +|Ctrl-C (在终端是 Shift-Ctrl-C )|拷贝主要键的选择到剪贴板| +|Ctrl-V (在终端是 Shift-Ctrl-V )|粘贴剪切板的内容到光标处| + +这里,主要键的选择会高亮文本范围。在终端程序内,使用 `Shift-Ctrl-C` 来代替,这样可以避免终止一个运行的程序。 + +在现代滚轮鼠标上的中央滚轮,被认为是中间键,并可以被当做中间键使用。在 2 键鼠标系统的情况下,同时按左键和右键就相当于按中间键。 + +为了在 Linux 字符控制台中使用鼠标,您需要让 `gpm`(8) 作为后台守护进程(daemon)运行。 + +### 1.4.6. 分页程序 + +`less`(1) 命令是一个增强版的分页程序(文件内容查看器)。它按照指定的命令参数或标准输出来读取文件。在用 `less` 命令查看的时候如果需要帮助可以按 “`h`”。它的功能比 `more`(1) 命令更丰富,通过在脚本的开头执行 "`eval $(lesspipe)`" 或 "`eval $(lessfile)`" 它的功能还能变得更加强大。详细请参考 "`/usr/share/doc/less/LESSOPEN`"。 "`-R`" 选项可以实现原始的字符输出还可以启用 ANSI 颜色转义序列。详细请参考 `less`(1)。 + +### 1.4.7. 文本编辑器 + +在使用类 Unix 系统过程中, 各种类似于[Vim](https://zh.wikipedia.org/wiki/Vim_(text_editor)) 或 [Emacs](https://zh.wikipedia.org/wiki/Emacs)的工具,你应该精通其中的一个。 + +我认为习惯于使用 Vim 命令是一个明智的选择,因为 Linux/Unix 系统里一般都附带了 Vi 编辑器。 (实际上最初的 `vi` 以及后来的 `nvi` 这类工具程序很常见。因为在 Vim 里提供了`F1`帮助键,在同类工具中它的功能更强大,所以我选择 Vim 而不是其它新出的一些工具。) + +假设你不是用 [Emacs](https://zh.wikipedia.org/wiki/Emacs) 就是用 [XEmacs](https://zh.wikipedia.org/wiki/XEmacs) 作为你的编辑器,其实还有更好的选择,尤其是在编程的时候。 Emacs 还有很多其他的特点,包括新手导读,目录编辑器,邮件客户端等等。当编写脚本或程序的时候,它能自动识别当前工作模式所对应的格式,让使用更加便利。一些人甚至坚持认为 Linux 系统里最需要配备的就是 Emacs。花十分钟来学习 Emacs 可以为后面的工作剩下更多时间。在此强烈推荐学习使用 Emacs 时候直接使用 GNU Emacs 参考手册。 + +在实践应用中所有这些程序都会有一个教程,输入 "`vim`" 和F1键就可以启动Vim。建议你最好阅读一下前面的 35 行。移动光标到 "`|tutor|`" 并按 `Ctrl-]` 就可以看到在线培训教程。 + +其实很多人初次接触vim的时候觉得vim有点反人类,一开始连退出都不知道在那里,但是用熟悉了就真香了。 + +好的编辑器,像 Vim 和 Emacs,可以处理 UTF-8 及其它不常用编码格式的文本。有个建议就是在 GUI(图形用户界面) 环境下使用 UTF-8 编码,并安装要求的程序和字体。编辑器里可以选择独立于 GUI(图形用户界面)环境的编码格式。关于多字节文本可以查阅参考文档。 + +GUI文本编辑器deepin内置了deepin-editor,是非常好用的,还有宇宙第一ide——装了插件的vscode(见vscode的词条) + +### 1.4.8. 设置默认文本编辑器 + +Debian 有许多不同的编辑器。我们建议安装上面提到的 `vim` 软件包。 + +Debian 通过命令“`/usr/bin/editor`”提供了对系统默认编辑器的统一访问,因此其它程序(例如 `reportbug`(1))可以调用它。你可以通过下列命令改变它。 + +```Shell +$ sudo update-alternatives --config editor +``` + + +对于新手,我建议使用“`/usr/bin/vim.basic`”代替“`/usr/bin/vim.tiny`”,因为它支持格式高亮。 + +### 1.4.9.使用 + +使用vim我个人认为是很难在这一点页面说完的,所以本着不重复造轮子的思想,在这放出基本命令和优质中文教程: + +|模式|按键|操作| +|-|-|-| +|普通|:help|only| +|普通|:e filename.ext|打开新的缓冲区来编辑 filename.ext| +|普通|:w|把目前的缓冲区改写到原始文件| +|普通|:w filename.ext|写入当前缓冲区到 filename.ext| +|普通|:q|退出 vim| +|普通|:q!|强制退出 vim| +|普通|:only|关闭所有其它分割打开的窗口| +|普通|:set nocompatible?|检查 vim 是否在完全的 nocompatible 模式| +|普通|:set nocompatible|设置 vim 到完全的 nocompatible 模式| +|普通|i|进入 插入 模式| +|普通|R|进入 替代 模式| +|普通|v|进入 可视 模式| +|普通|V|进入 可视 行 模式| +|普通|Ctrl-V|进入 可视 块 模式| +|除了 TERMINAL-JOB 外|ESC-键|进入 普通 模式| +|普通|:term|进入 TERMINAL-JOB 模式| +|TERMINAL-NORMAL|i|进入 TERMINAL-JOB 模式| +|TERMINAL-JOB|Ctrl-W N (或者 Ctrl-\ Ctrl-N)|进入 TERMINAL-NORMAL 模式| +|TERMINAL-JOB|Ctrl-W :|在TERMINAL-NORMAL 模式里进入Ex-模式| + +请使用 "`vimtutor`" 程序来学习 `vim`,通过一个交互式的指导课程。 + +`vim` 程序基于 **模式** 输入的按键来改变它的行为。在 `插入`-模式和 `替代`-模式下,输入的按键大部分进入了缓冲区。移动光标大部分在 `普通`-模式下完成。交互选择在 `可视`-模式下完成。在`普通`-模式下输入 "`:`" ,改变它的 **模式** 进入到 `Ex`-模式。 `Ex`-接受命令。 + +### 1.4.10. 记录 shell 活动 + + + +shell 命令的输出有可能滚动出了屏幕,并可能导致你无法再查看到它。将shell活动记录到文件中再来回顾它是个不错的主意。当你执行任何系统管理任务时,这种记录是必不可少的。 + +记录 shell 活动的基本方法是在`script`(1)下运行 shell。 + +尝试下列例子 + +```Shell +$ script +Script started, file is typescript +``` + + +在`script`下使用任何 shell 命令。 + +按`Ctrl-D`来退出`script`。 + +```Shell +$ vim typescript +``` + + +### 1.4.11. 基本的 Unix 命令 + +让我们来学习基本的 Unix 命令。在这里,我指的是一般意义上的“UNIX”。任何 UNIX 克隆系统通常都会提供等价的命令。deepin 系统也不例外。如果有一些命令不像你想的那样起作用,请不要担心。如果 shell 中使用了别名,其对应的命令输出会不同。这些例子并不意味着要以这个顺序来执行。 + +尝试使用非特权用户账号来使用下列的命令。 + +|命令|说明| +|-|-| +|pwd|显示当前/工作目录的名称| +|whoami|显示当前的用户名| +|id|显示当前用户的身份(名称、uid、gid和相关组)| +|file foo|显示“foo”文件的文件类型| +|type -p commandname|显示命令的文件所处位置“commandname”| +|which commandname|同上| +|type commandname|显示“commandname”命令的相关信息| +|apropos key-word|查找与“key-word”有关的命令| +|man -k key-word|同上| +|whatis commandname|用一行解释 “commandname” 命令| +|man -a commandname|显示“commandname”命令的解释(Unix 风格)| +|info commandname|显示“commandname”命令相当长的解释(GNU风格)| +|ls|显示目录内容(不包含以 . 点号开头的文件和目录)| +|ls -a|显示目录内容(包含所有文件和目录)| +|ls -A|显示目录内容(包含几乎所有文件和目录,除了“..”和“.”)| +|ls -la|显示所有的目录内容,并包含详细的信息| +|ls -lai|显示所有的目录内容,并包含inode和详细的信息| +|ls -d|显示当前目录下的所有目录| +|tree|使用树状图显示目录内容| +|lsof foo|列出处于打开状态的文件 "foo"| +|lsof -p pid|列出被某进程打开的文件: "pid"| +|mkdir foo|在当前目录中建立新目录“foo”| +|rmdir foo|删除当前目录中的“foo”目录| +|cd foo|切换到当前目录下或变量“$CDPATH”中的“foo”目录| +|cd /|切换到根目录| +|cd|切换到当前用户的家目录| +|cd /foo|切换到绝对路径为“/foo”的目录| +|cd ..|切换到上一级目录| +|cd ~foo|切换到用户“foo”的家目录| +|cd -|切换到之前的目录| +| foo|将“README.gz”解压后的内容输出到文件“foo”中| +|zcat README.gz >> foo|将“README.gz”解压后的内容添加到文件“foo”的末尾(如果文件不存在,则会先建立该文件)| + +Unix 有一个惯例,以“.”开头的文件将被隐藏。它们一般为包含了配置信息和用户首选项的文件。 + + 对于cd命令,参见builtins(7)。 + + 基本的 Debian 系统的默认分页程序是 more(1),它无法往回滚动。通过命令 “apt-get install less" 安装 less 软件包后,less(1) 会成为默认的分页程序,它可以通过方向键往回滚动。 + + "[" 和"]" 在正则表达式 "ps aux | grep -e "[e]xim4*"" 命令中,可以避免grep在结果中排除它自己, 正则表达式中的 "4*" 意思是空或字符"4" ,这样可以让 grep 既找到 "exim" 也找到 "exim4"。 虽然 "*" 可以用于命令名称匹配和正则表达式中,但是它们的含义是不一样的。欲详细了解正则表达式可以参考 grep(1)。 + +作为训练,请使用上述的命令来遍历目录并探究系统。如果你有任何有关控制台命令的问题,请务必阅读手册。 + +尝试下列例子 + +```Shell +$ man man +$ man bash +$ man builtins +$ man grep +$ man ls +``` + + +手册的风格可能让人有点难以习惯,因为它们都相当简洁,尤其是比较老旧、非常传统的那些手册。但是,一旦你习惯了它,你来欣赏它们的简洁。 + +请注意,许多 类 Unix 命令(包含来自 GNU 和 BSD 的)都可以显示简短的帮助信息,你可以使用下列的其中一种方式来查看它(有时不带任何参数也可以)。 + +```Shell +commandname --help +$ commandname -h +``` + + +## 1.5. 简单 shell 命令 + +现在,你对如何使用 deepin 系统已经有一些感觉了。让我们更深入了解 deepin 系统的命令执行机制。在这里,我将为新手做一般的讲解。精确的解释参见`bash`(1)。 + +一般的命令由有序的组件构成。 + +- 设置变量值(可选) + +- 命令名 + +- 参数(可选) + +- 重定向(可选:`>`, `>>` , `<`, `<<` 等等) + +- 控制操作(可选:`&&` , `||` , 换行符 , `;` , `&` , `(` , `)`) + +### 1.5.1. 命令执行和环境变量 + +一些[环境变量](https://zh.wikipedia.org/wiki/Environment_variable)的值会改变部分 Unix 命令的行为。 + +环境变量的默认值由 PAM 系统初始化,其中一些会被某些应用程序重新设定。 + +- PAM(可插拔身份验证模块)系统的模块,比如 `pam_env` 模块,可以通过 `/etc/pam.conf`"、 "`/etc/environment`"和"`/etc/default/locale`"设置环境变量。 + +- 显示管理器(例如`gdm3`)可以通过"`~/.profile`"给 GUI(图形用户界面)会话重新设定环境变量。 + +- 用户特有的程序初始化时,可以重新设置在 "`~/.profile`"、"`~/.bash_profile`" 和 "`~/.bashrc`" 中设置的环境变量。 + +### 1.5.2. “`$LANG`”变量 + +默认的语言环境是在 "`$LANG`" 环境变量中定义,它在安装的时候配置为 "`LANG=xx_YY.UTF-8`",或者在接下来的 GUI(图形用户界面)中配置,例如在 GNOME 中是,"设置" → "区域 & 语言" → "语言" / "格式"。 + +目前建议最好用变量 "`$LANG`" 来配置系统环境变量,只有在逼不得已的情况下才用 `$LC_*`" 开头的变量 + +`$LANG`” 变量的完整的语言环境值由3部分组成:“`xx_YY.ZZZZ`”。 + +|语言环境值|说明| +|-|-| +|xx|ISO 639 语言代码(小写)例如“en”| +|YY|ISO 3166 国家代码(大写)例如“US”| +|ZZZZ|编码,总是设置为“UTF-8”| + +|语言环境推荐|语言(地区)| +|-|-| +|en_US.UTF-8|英语(美国)| +|en_GB.UTF-8|英语(大不列颠)| +|fr_FR.UTF-8|法语(法国)| +|de_DE.UTF-8|德语(德国)| +|it_IT.UTF-8|意大利语(意大利)| +|es_ES.UTF-8|西班牙语(西班牙)| +|ca_ES.UTF-8|加泰隆语(西班牙)| +|sv_SE.UTF-8|瑞典语(瑞典)| +|pt_BR.UTF-8|葡萄牙语(巴西)| +|ru_RU.UTF-8|俄语(俄国)| +|zh_CN.UTF-8|汉语(中华人民共和国)| +|zh_TW.UTF-8|汉语(中国台湾省)| +|ja_JP.UTF-8|日语(日本)| +|ko_KR.UTF-8|韩语(韩国)| +|vi_VN.UTF-8|越南语(越南)| + +使用 shell 命令行按顺序执行下列典型的命令。 + +```Shell +$ echo $LANG +en_US.UTF-8 +$ date -u +Wed 19 May 2021 03:18:43 PM UTC +$ LANG=fr_FR.UTF-8 date -u +mer. 19 mai 2021 15:19:02 UTC +``` + + +这里,`date`(1)程序执行时使用了不同的语言环境值 + +- 第一个命令,“`$LANG`” 设置为系统的默认[语言环境](https://zh.wikipedia.org/wiki/Locale)值 “`en_US.UTF-8`”。 + +- 第二个命令,“`$LANG`”设置为法语的 UTF-8 [语言环境](https://zh.wikipedia.org/wiki/Locale)值“`fr_FR.UTF-8`”。 + +大多数的命令在执行时并没有预先定义环境变量。对于上面的例子,你也可以选择如下的方式。 + +```Shell +$ LANG=fr_FR.UTF-8 +$ date -u +mer. 19 mai 2021 15:19:24 UTC +``` + + +对于语言环境配置的细节,参见 [第 8.1 节 “语言环境”](https://www.debian.org/doc/manuals/debian-reference/ch08.zh-cn.html#_the_locale) + +### 1.5.3. "`$PATH`" 变量 + +当你在 Shell 里输入命令的时候,Shell 会在 "`$PATH`" 变量所包含的目录列表里进行搜索,"`$PATH`" 变量的值也叫作 Shell 的搜索路径。 + +可以在 Bash 脚本文件 "`~/.bash_profile`" 或 "`~/.bashrc`" 中改变 "`$PATH`" 环境变量的值。 + +在zsh中为`~/.zshrc` + +### 1.5.4. "`$HOME`" 变量 + +很多命令在用户目录中都存放了用户指定的配置,然后通过配置的内容来改变它的执行方式,用户目录通常用 "`$HOME`" 变量来指定。 + +|"$HOME" 变量的值|程序运行环境| +|-|-| +|/|初始进程执行的程序(守护进程)| +|/root|root 用户权限 Shell 执行的程序| +|/home/normal_user|普通用户权限Shell执行的程序| +|/home/normal_user|普通用户 GUI 桌面菜单执行的程序| +|/home/normal_user|用 root 用户权限来执行程序 "sudo program"| +|/root|用 root 用户权限执行程序 "sudo -H program"| + +Shell 扩展 "~/" 为转入当前用户的主目录,也就是"$HOME/"。Shell 扩展 "~foo/" 为foo 的目录,也就是 "/home/foo/"。 + +### 1.5.5. 命令行选项 + +一些命令附带参数。这些参数以 "`-`" 或 "`--`" 开头,通常称之为选项,用来控制命令的执行方式。 + +```Shell +$ date +Thu 20 May 2021 01:08:08 AM JST +$ date -R +Thu, 20 May 2021 01:08:12 +0900 +``` + + +这里的命令参数 "`-R`" 改变 `date`(1) 命令输出为 [RFC2822](http://tools.ietf.org/html/rfc2822) 标准的日期字符格式。 + +### 1.5.6. Shell 通配符 + + + +经常有这种情况你期望命令成串自动执行而不需要挨个输入,将文件名扩展为 **glob**,(有时候被称为 **通配符**),以此来满足这方面的需求。 + +|shell glob 模式|匹配规则描述| +|-|-| +|*|不以 "." 开头的文件名(段)| +|.*|以 "." 开头的文件名(段)| +|?|精确字符| +|[…]|包含在括号中的任意字符都可以作为精确字符| +|[a-z]|"a" 到 "z" 之间的任意一个字符都可以作为精确字符| +|[^…]|除了包含在括号中的任意字符 ( " 1^ 2"除外 ),其它字符都可以作为精确字符| + + + +尝试下列例子 + +```Shell +$ mkdir junk; cd junk; touch 1.txt 2.txt 3.c 4.h .5.txt ..6.txt +$ echo *.txt +1.txt 2.txt +$ echo * +1.txt 2.txt 3.c 4.h +$ echo *.[hc] +3.c 4.h +$ echo .* +. .. .5.txt ..6.txt +$ echo .*[^.]* +.5.txt ..6.txt +$ echo [^1-3]* +4.h +$ cd ..; rm -rf junk +``` + + +参见 `glob`(7)。 + +与 shell 通用的文件名匹配方式不同, 使用 " `-name` " 选项的 `find` (1),其 shell 模式" `*` " ,匹配以" `.` "开始的文件名.(新[ POSIX ](https://zh.wikipedia.org/wiki/POSIX)的特性) + +BASH 可以使用内置的 shopt 选项如 " `dotglob` "," `noglob` "," `nocaseglob` "," `nullglob` "," `extglob` "定制全局行为,使用 `bash` ( 1 )查看详细说明。 + +### 1.5.7. 命令的返回值 + +每个命令都会返回它的退出状态(变量:“`$?`”)作为返回值。 + +|命令的退出状态|数字返回值|逻辑返回值| +|-|-|-| +|success|zero, 0|TRUE| +|error|non-zero, -1|FALSE| + +尝试下列例子。 + +```Shell +$ [ 1 = 1 ] ; echo $? +0 +$ [ 1 = 2 ] ; echo $? +1 +``` + + +### 1.5.8. 典型的顺序命令和 shell 重定向 + +让我们试着记住下面 Shell 命令里部分命令行所使用的命令习语。 + +|命令常见用法|说明| +|-|-| +|command &|在子 shell 的后台 中执行 command| +|command1|command2| +|command1 2>&1|command2| +|command1 ; command2|依次执行 command1 和 command2| +|command1 && command2|执行 command1;如果成功,按顺序执行 command2(如果 command1 和 command2 都执行成功了,返回 success )| +|command1|| +|command > foo|将 command 的标准输出重定向到文件 foo(覆盖)| +|command 2> foo|将 command 的标准错误重定向到文件 foo(覆盖)| +|command >> foo|将 command 的标准输出重定向到文件 foo(附加)| +|command 2>> foo|将 command 的标准错误重定向到文件 foo(附加)| +|command > foo 2>&1|将 command 的标准输出和标准错误重定向到文件 foo| +|command < foo|将 command 的标准输入重定向到文件 foo| +|command << delimiter|将 command 的标准输入重定向到下面的命令行,直到遇到“delimiter”(here document)| +|command <<- delimiter|将 command 的标准输入重定向到下面的命令行,直到遇到“delimiter”(here document,命令行中开头的制表符会被忽略| + +deepin 系统是一个多任务的操作系统。后台任务让用户能够在一个 shell 中执行多个程序。后台进程的管理涉及 shell 的内建命令:`jobs`、`fg`、`bg` 和 `kill`。请阅读 bash(1) 中的章节:“SIGNALS”、“JOB CONTROL” 和 “`builtins`(1)”。 + +尝试下列例子 + +```Shell +$ foo +$ exec 3foo 4bar # open files +$ cat <&3 >&4 # redirect stdin to 3, stdout to 4 +$ exec 3<&- 4>&- # close files +$ cat bar +Hello +``` + + +预定义的文件描述符0-2。 + +|设备|说明|文件描述符| +|-|-|-| +|stdin|标准输入|0| +|stdout|标准输出|1| +|stderr|标准错误|2| + +### 1.5.9. 命令别名 + +你可以为经常使用的命令设置一个别名。 + +尝试下列例子 + +```Shell +$ alias la='ls -la' +``` + + +现在,“`la`”是“`ls -al`”的简写形式,并同样会以长列表形式列出所有的文件。 + +你可以使用 `alias` 来列出所有的别名(参见 `bash`(1) 中的“SHELL BUILTIN COMMANDS”)。 + +```Shell +$ alias +... +alias la='ls -la' +``` + + +你可以使用 `type` 来确认命令的准确路径或类型(参见 `bash`(1) 中的“SHELL BUILTIN COMMANDS”)。 + +尝试下列例子 + +```Shell +$ type ls +ls is hashed (/bin/ls) +$ type la +la is aliased to ls -la +$ type echo +echo is a shell builtin +$ type file +file is /usr/bin/file +``` + + +`ls` 在最近被使用过,而 “`file`” 没有,因此 “`ls`” 标记为 “hashed”(被录入哈希表),即 shell 有一个内部的记录用来快速访问 “`ls`” 所处的位置。 + +记住 alia命令定义的别名仅在当前shell有效,如果关闭或重启shell则不会保留别名。如果想长久保留,请将其写入坏境变量中。 + +## 1.6. 类 Unix 的文本处理 + +在类 Unix 的工作环境中,文本处理是通过使用管道组成的标准文本处理工具链完成的。这是另一个重要的 Unix 创新。 + +### 1.6.1. Unix 文本工具 + +这里有一些在类 Unix 系统中经常使用到的标准文本处理工具。 + +- 没有使用正则表达式: + + - cat(1) 连接文件并输出全部的内容。 + + - tac(1) 连接文件并反向输出。 + + - cut(1) 选择行的一部分并输出。 + + - head(1) 输出文件的开头。 + + - tail(1) 输出文件的末尾。 + + - sort(1) 对文本文件的行进行排序。 + + - uniq(1) 从已排序的文件中移除相同的行。 + + - tr(1) 转换或删除字符。 + + - diff(1) 对文件的行进行对比。 + +- 默认使用基础正则表达式( BRE ): + + - ed(1) 是一个原始行编辑器。 + + - sed(1) 是一个流编辑器。 + + - grep(1) 匹配满足 pattern 的文本。 + + - vim(1) 是一个屏幕编辑器。 + + - emacs(1) 是一个屏幕编辑器。(有些扩展的 BRE ) + + 使用扩展的正则表达式( ERE ): + +- 使用扩展的正则表达式( ERE ): + + - awk(1) 进行简单的文本处理。 + + - egrep(1) 匹配满足多个 pattern 的文本。 + + - tcl(3tcl) 可以进行任何你想得到的文本处理:参见 re_syntax(3)经常与 tk(3tk) 一起使用。 + + - perl(1) 可以进行任何你想得到的文本处理。参见 perlre(1) + + - pcregrep 软件包中的 pcregrep(1) 可以匹配满足 Perl 兼容正则表达式(PCRE) 模式的文本。 + + - ripgrep 是对grep最佳的替代,命令是rg + + - 带有 re 模块的 python(1) 可以进行任何你想得到的文本处理。参见“/usr/share/doc/python/html/index.html”。 + +- 如果你不确定这些命令究竟做了什么,请使用“man command” 来自己把它搞清楚吧。 + +推荐文本工具:neovim batcat ripgrep + +### 1.6.2. 正则表达式 + +本指南不想过多介绍正则表达式,如果你学习的编程语言有对于正则表达式的介绍,那么你可以略过这一段。 + +但是正则表达式在很多命令行软件中都有应用。 + +[https://www.runoob.com/regexp/regexp-tutorial.html](https://www.runoob.com/regexp/regexp-tutorial.html) diff --git a/docs/GNU-linux教程/简介.md b/docs/GNU-linux教程/简介.md new file mode 100644 index 0000000..880e0ed --- /dev/null +++ b/docs/GNU-linux教程/简介.md @@ -0,0 +1,7 @@ +我认为学习一个计算机系统,就像学习一门新的外语。虽然教程和文档是有帮助的,但你必须自己练习。为了帮助你平滑起步,我详细说明一些基本要点。 + +[deepin](https://www.deepin.org/) [GNU](https://zh.wikipedia.org/wiki/GNU)/[Linux](https://zh.wikipedia.org/wiki/Linux)中最强大的设计来自[Unix](https://zh.wikipedia.org/wiki/Unix)操作系统,一个[多用户](https://zh.wikipedia.org/wiki/Multi-user)[多任务](https://zh.wikipedia.org/wiki/Computer_multitasking)的操作系统。你必须学会利用这些特性以及Unix和GNU/Linux的相似性。 + +别回避面向 Unix 的文档,不要只是依赖于 GNU/Linux 文档,这样做会剥夺你了解许多有用的信息。 + +如果你在任何[类 Unix](https://zh.wikipedia.org/wiki/Unix-like) 系统中使用过一段时间的命令行工具,你可能已经掌握了这份文档中的内容。那请把它当做一个实战检验和回顾。 diff --git a/docs/index.md b/docs/index.md index 911f777..d78dbbe 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1 +1,204 @@ -# 首页 +# 序言 + +本书的目标读者:使用deepin linux的普通用户,并且愿意更加深入了解系统的高级用法。 + +## 1. 免责声明 + +所有担保条款具有免责效力。所有商标均为其各自商标所有者的财产。 + +deepin 系统本身是一个变化的事物。这导致其文档难于及时更新并且正确。虽然是以 deepin 系统当前的 `v23` 作为写作该文档的基础,但当你阅读本文的时候,部分内容仍然可能已经过时。 + +请把本文档作为第二参考。本文档不能够代替任何官方指导手册。文档作者和文档贡献者对在本文档中的错误、遗漏或歧义,不承担责任后果 + +## 2. 什么是deepin + +deepin(原名Linux deepin)致力于为全球用户提供美观易用,安全可靠的Linux发行版。deepin项目于2008年发起,并在2009年发布了以linux deepin为名称的第一个版本。2014年4月更名为Deepin,在中国常被称为“深度操作系统“。 + +deepin基于Qt技术开发了深度桌面环境和深度控制中心,并且开发了一系列面向日常使用的深度特色应用如深度商店、深度截图、深度音乐、深度影院等。深度操作系统非常注重易用的体验和美观的设计,对于多数用户来说,它易于安装和使用,能方便地进行工作与娱乐。 + +截止到 2020 年,深度操作系统下载超过 6000 万次,提供超过 50 种不同的语言版本,以及遍布六大洲的 140 多个镜像站点的升级服务。在全球开源操作系统排行榜上是排名最高的中国操作系统产品。 + +## 3. 什么是深度开源社区 + +深度开源社区成立于2021年底,是一个由开发者、设计师、普通成员及倡导者组成的开源社区——我们致力通过社区开发与协作,为所有人提供自由、开放的交流平台以及最好的开源操作系统! + +无论你是一个经验丰富的开发者,有创意的设计师,还是一个普通用户,我们都欢迎你加入我们,为社区贡献一份属于你的力量! + +深度开源社区以“开放、透明、自由、分享、协作”的理念,作为社区工作和交流的准则: +开放:不同背景、经验的人们都能加入我们并参与社区工作; +透明:不同规划决策、进展过程都将纳入社区,吸收大家的意见; +自由:确保我们的工作成果能被他人所自由使用; +分享:乐于分享,将我们的成果传递给更多人; +协作:倡导团队协作,发挥领导作用,使社区工作进展得更为有序 + +## 4. 关于本文档 + +### 4.1. 指导原则 + +写作本文档时,遵循下列指导原则。 + +- 仅提供概览,而忽略边界情况。(Big Picture 原则) + +- 保持文字简短紧凑。(KISS 原则) + +- 不重复造轮子。(使用链接指向已有参考) + +- 保持客观。 + +### 3.2. 预备知识 + +阅读本文档,你需要通过自己的努力去查找本文档未提及的问题答案。本文档仅仅提供有效的起点。 + +你必须自己从以下原始材料查找解决方案。 + +你必须自己从以下原始材料查找解决方案。 + +- Debian 网站([https://www.debian.org)上的通用信息](https://www.debian.org)上的通用信息) (注意:从deepin v23开始 deepin将过度到独立上游,部分debian网站提供的信息可能不适用,请注意甄别) + +- `/usr/share/doc/package_name` 目录下的文档 + +- Unix 风格的 manpage: "dpkg -L package_name |grep '/man/man.*/'" + +- GNU 风格的 info page: "dpkg -L package_name |grep '/info/'" + +- Debian Wiki([https://wiki.debian.org/)用于变化和特定的话题](https://wiki.deepin.org/)用于变化和特定的话题) + +- 国际开放标准组织的 UNIX 系统主页([http://www.unix.org/)上的单一](http://www.unix.org/)上的单一) UNIX 规范 + +- 自由的百科全书:维基百科([https://www.wikipedia.org/)](https://www.wikipedia.org/)) + +- RFC文档([http://www.rfc.ac.cn/](http://www.rfc.ac.cn/)) + +- Linux 文档项目(TLDP,[http://tldp.org/)的](http://tldp.org/)的) HOWTO + +### 3.3. 排版约定 + +本文通过如下使用 `bash`(1) shell 命令例子的简要方式来提供信息。 + +```Shell +# command-in-root-account +$ command-in-user-account +``` + + +这些 shell 提示符区分了所使用的帐户。为了可读性,在本手册中 shell 提示符相关的环境变量被设置为“`PS1='\$'`”和“`PS2=' '`。这与实际安装的系统所使用的 shell 提示符很有可能会不同。 + +所有的命令示例都是运行在英语语言环境“`LANG=zh_CN.UTF8`”下的。请不要期望命令示例中像 `command-in-root-account` 和 `command-in-user-account` 这样的占位符会被翻译。但是为了方便理解,后文中,如果没有特别提及,默认以user级别运行,如果需要以root权限运行,会加以说明或添加`sudo`前缀 + +这些**描述**列或类似信息在表格有一个**名词短语**,后面会紧跟[软件包短描述](https://www.debian.org/doc/manuals/developers-reference/best-pkging-practices#bpp-desc-basics),这些短语会省略掉前面的"a"和"the"。它们也可以包含一个不定式短语作**名词短语**,在联机帮助的短命令描述约定后面不带 "to"。有些人可能觉得这看起来有点可笑,这里故意保留这种风格是为了让文档看起来尽可能的简单。这些**名词短语**在短命令描述约定里并不会采用首字母大写的方式。 + +在文本段落中引用的**命令片断**由markdown 代码片段进行标记,就像`aptitude safe-upgrade`。 + +在文本段落中引用的来自配置文件的**文本数据**由双引号括起来的打印机字体进行标记,就像"`deb-src`"。 + +**命令**和置于其后的圆括号内的手册页章节数(可选),由打字机字体进行标记,就像 `bash`(1)。我们鼓励您这样通过输入以下命令来获得信息。 + +```Shell +$ man 1 bash +``` + + +**manpage** 会在打字机字体后面括号中显示 manpage 页章节号,如 `sources.list`(5)。建议你通过键入以下命令来获取帮助信息。 + +```Shell +$ man 5 sources.list +``` + + +**info page** 页是由双引号之间的打字机字体来标注,如 `info make`。建议你通过键入以下的命令来获取帮助信息。 + +```Shell +$ info make +``` + + +**文件名**将由双引号括起来的打印机字体进行标记,就像 "`/etc/passwd`"。对于配置文件,你可以输入下列的命令来获取它的信息。 + +```Plain Text +$ sensible-pager "/etc/passwd" +``` + + +**目录名**将由双引号括起来的打印机字体进行标记,就像 "`/etc/apt`"。你可以输入下列的命令来浏览目录的内容。 + +```Plain Text +$ mc "/etc/apt/" +``` + + +**软件包名称**将由打印机字体进行标记,就像 `vim`。你可以输入下列的命令来获取它的信息。 + +```Plain Text +$ dpkg -L vim +$ apt-cache show vim +$ aptitude show vim +``` + + +一个**文档**可能通过文件名来指示它的位置,文件名将由双引号括起来的打印机字体进行标记,就像"`/usr/share/doc/base-passwd/users-and-groups.txt.gz`"和" `/usr/share/doc/base-passwd/users-and-groups.html` ",或通过它的 [URL](https://zh.wikipedia.org/wiki/Uniform_Resource_Locator),就像 [https://www.debian.org](https://www.debian.org/)。你可以通过输入下列命令来阅读文档。 + +```Shell +$ zcat "/usr/share/doc/base-passwd/users-and-groups.txt.gz" | sensible-pager +$ sensible-browser "/usr/share/doc/base-passwd/users-and-groups.html" +$ sensible-browser "https://www.debian.org" +``` + + +**环境变量**将由双引号括起来的打印机字体进行标记,并带有 "`$`" 前缀,就像 "`$TERM`"。你可以输入下列命令来获取它的当前值。 + +```Plain Text +$ echo "$TERM" +``` + + +### 3.5. 软件包大小 + +软件包的大小数据同样表明了对每个包的客观衡量。它基于“`apt-cache show`”或“`aptitude show`”命令(目前在`amd64` 架构的`不稳定`版)报告的“`安装大小`”。报告的大小单位是 KiB([Kibibyte](https://zh.wikipedia.org/wiki/Kibibyte)=表示 1024 Bytes 的单位)。 + +### 3.6. 给本文档报告 Bug + +如果发现文档有任何问题,请直接在github中提出issue + +## 4. 一些对新使用者的提醒 + +这里给出对新用户的一些提醒信息: + +- 及时备份你的数据 + +- 妥善保存你的密码和安全信息 + +- [KISS(保持简单而傻瓜式)](https://zh.wikipedia.org/wiki/KISS%E5%8E%9F%E5%88%99) + +- 不要在系统中过度设计(overengineering) + +- 阅读你的日志文件 + +- **第一条** 错误信息才是最重要的 + +- [RTFM(阅读手册与指导)](https://zh.wikipedia.org/wiki/RTFM) + +- 在问问题前,先在互联网上搜索 + +- 当不是必须要使用 root 的时候,就不要使用 root + +- 不要胡乱折腾软件包管理系统(不要混源) + +- 不要输入任何你不理解的命令 + +- (在完全地检查过安全问题之前)不要随意修改文件权限 + +- 在**测试**过你所做的修改之前不要关闭 root shell + +- 总是准备好备用启动介质(USB 启动盘、启动光盘等) + +## 5. 一些对新使用者的引导 + +维基百科文章"[Unix 哲学](https://en.wikipedia.org/wiki/Unix_philosophy)"列出了一些有趣的指导。 + +阅读本文档,你需要通过自己的努力去查找本文档未提及的问题答案。本文档仅仅提供有效的起点。 + +论坛提供了用户间很好的交流方式,如果想和开发者交流,请来github + +## 6. 鸣谢 + +本文档修改自[Debian 参考手册](https://www.debian.org/doc/manuals/debian-reference/index.zh-cn.html)。感谢 Debian 项目的所有贡献者。 diff --git a/docs/中级/中级1.md b/docs/中级/中级1.md deleted file mode 100644 index 4c7006b..0000000 --- a/docs/中级/中级1.md +++ /dev/null @@ -1 +0,0 @@ -# 中级1 diff --git a/docs/中级/中级2.md b/docs/中级/中级2.md deleted file mode 100644 index 199e0f7..0000000 --- a/docs/中级/中级2.md +++ /dev/null @@ -1 +0,0 @@ -# 中级2 diff --git a/docs/中级/中级3.md b/docs/中级/中级3.md deleted file mode 100644 index 3be8f47..0000000 --- a/docs/中级/中级3.md +++ /dev/null @@ -1 +0,0 @@ -# 中级3 diff --git a/docs/初级/初级1.md b/docs/初级/初级1.md deleted file mode 100644 index cd9ee8d..0000000 --- a/docs/初级/初级1.md +++ /dev/null @@ -1 +0,0 @@ -# 初级1 diff --git a/docs/初级/初级2.md b/docs/初级/初级2.md deleted file mode 100644 index fe78793..0000000 --- a/docs/初级/初级2.md +++ /dev/null @@ -1 +0,0 @@ -# 初级2 diff --git a/docs/初级/初级3.md b/docs/初级/初级3.md deleted file mode 100644 index 24f2698..0000000 --- a/docs/初级/初级3.md +++ /dev/null @@ -1 +0,0 @@ -# 初级3 diff --git a/docs/目录/目录.md b/docs/目录/目录.md new file mode 100644 index 0000000..e69de29 diff --git a/package.json b/package.json index c011e37..dd5cad6 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,7 @@ "author": "", "license": "ISC", "devDependencies": { - "vitepress": "1.0.0-alpha.46", + "vitepress": "^1.0.0-alpha.46", "vue": "^3.2.47" }, "pnpm": {