From a32587b4cd4817bc5d6c0ad4314b76de42c3de52 Mon Sep 17 00:00:00 2001 From: ecmadao Date: Wed, 15 May 2019 14:25:42 +0800 Subject: [PATCH] update note --- Notes/Underlaying/Linux.md | 461 +++++++++++++++++++++++++------------ 1 file changed, 318 insertions(+), 143 deletions(-) diff --git a/Notes/Underlaying/Linux.md b/Notes/Underlaying/Linux.md index f6fa204..f61cfa1 100644 --- a/Notes/Underlaying/Linux.md +++ b/Notes/Underlaying/Linux.md @@ -16,6 +16,7 @@ - [定时任务](#%E5%AE%9A%E6%97%B6%E4%BB%BB%E5%8A%A1) - [用户和用户组](#%E7%94%A8%E6%88%B7%E5%92%8C%E7%94%A8%E6%88%B7%E7%BB%84) - [磁盘管理](#%E7%A3%81%E7%9B%98%E7%AE%A1%E7%90%86) + - [软链接](#%E8%BD%AF%E9%93%BE%E6%8E%A5) - [系统信息](#%E7%B3%BB%E7%BB%9F%E4%BF%A1%E6%81%AF) - [日志记录](#%E6%97%A5%E5%BF%97%E8%AE%B0%E5%BD%95) - [信号](#%E4%BF%A1%E5%8F%B7) @@ -25,6 +26,10 @@ - [压缩/打包命令](#%E5%8E%8B%E7%BC%A9%E6%89%93%E5%8C%85%E5%91%BD%E4%BB%A4) - [备份](#%E5%A4%87%E4%BB%BD) - [shell 基础](#shell-%E5%9F%BA%E7%A1%80) + - [基础](#%E5%9F%BA%E7%A1%80) + - [输出、重定向和管道符](#%E8%BE%93%E5%87%BA%E9%87%8D%E5%AE%9A%E5%90%91%E5%92%8C%E7%AE%A1%E9%81%93%E7%AC%A6) + - [函数和流程控制](#%E5%87%BD%E6%95%B0%E5%92%8C%E6%B5%81%E7%A8%8B%E6%8E%A7%E5%88%B6) + - [比较与测试](#%E6%AF%94%E8%BE%83%E4%B8%8E%E6%B5%8B%E8%AF%95) - [正则表达式](#%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F) - [网络](#%E7%BD%91%E7%BB%9C) - [下载](#%E4%B8%8B%E8%BD%BD) @@ -42,6 +47,7 @@ - [linux基础命令介绍](https://segmentfault.com/a/1190000007258280) - [Linux工具快速教程](http://linuxtools-rst.readthedocs.io/zh_CN/latest/index.html) - [Linux 文本处理三利器](https://segmentfault.com/a/1190000007993999) +- [linux-command](https://github.com/jaywcjlove/linux-command) ### 文件和目录管理 @@ -134,11 +140,7 @@ $ ls -l | cat -n # -n 输出行号 ``` -> **注:`cat`不能使用相同的文件作为输入和重定向后的输出,否则会清空文件。** 例如: - -```bash -$ cat file1 > file1 # 并没有写入,清空了文件 -``` +> **注:`cat`不能使用相同的文件作为输入和重定向后的输出,否则会清空文件。** 例如 cat file1 > file1 并没有写入,但清空了文件 - `more filaname` - `less filename` @@ -233,6 +235,7 @@ $ cd path # 切换目录到 path $ cd - # 回到上一个目录 ``` +- `pwd` 显示当前用户所处的路径 - `pushd` 压入并切换路径 - `popd` 删除最近压入的路径并切换到下一个目录 - `dirs` 查看栈中的内容 @@ -291,8 +294,8 @@ drwxr-xr-x 100 ecmadao staff 3200 10 2 21:32 leetcode x 代表可执行 execute - 代表没有对应的权限 前 3 位为所属主的权限,中间 3 位代表所属组的权限,后 3 位代表其他非本群组用户的权限 - 用户权限(rwx------)中还有一位 setuid(S) 的特殊权限,位于执行权限(x)的位置,代表允许可执行文件以其拥有者的权限来执行,即便该文件是由其他用户运行的 - 用户组权限(---rwx---)中还有一位 setgid(S) 的特殊权限,位于执行权限(x)的位置,代表允许可执行文件以其拥有组的权限来执行,即便该文件是由其他用户组运行的 + 用户权限(rwx------)中还有一位 setuid(S/s),SUID 的特殊权限,位于执行权限(x)的位置,代表允许可执行文件以其拥有者的权限来执行,即便该文件是由其他用户运行的。如果原先没有 x 权限,则赋予特殊权限后显示为 S,否则为 s + 用户组权限(---rwx---)中还有一位 setgid(S/s),SGID 的特殊权限,位于执行权限(x)的位置,代表允许可执行文件以其拥有组的权限来执行,即便该文件是由其他用户组运行的。如果原先没有 x 权限,则赋予特殊权限后显示为 S,否则为 s 目录有一个叫作粘滞位(t/T)的特殊权限。如果设置了粘滞位,则只有创建该目录的用户才能删除目录中的文件,其他用户即便有写权限,也不能删除 - 没有执行权限但设置了粘滞位:d------rwT - 有执行权限和粘滞位:d------rwt @@ -339,14 +342,15 @@ $ chmod o-w filename # 其他用户不可写 $ chmod a+t dir # 设置粘滞位,设置后仅目录所有者可删除其中的文件 ``` -- `chattr [+-=][A/s/a/c/i] filename` +- `chattr [+-=][A/s/a/c/i] filename` 为文件增加、删除隐藏权限 +- `lsattr [-a] filename/dir` 列出文件或文件夹下文件的隐藏权限 ```bash :< 双引号`""`中的特殊字符会被转义,但单引号`''`不会 - -- 彩色输出 +#### 基础 ```bash :<`将输出重定向,`>>`为重定向追加,但仅打印`stdin`的信息。在命令前加入文件描述符则可打印对应的输出: +主要环境变量 +HOME: 用户主目录 +SHELL: 用户在使用的 shell 解释器名称 +HISTSIZE: 输出的历史记录条数 +HISTFILESIZE: 保存的历史记录条数 +MAIL: 邮件保存路径 +LANG: 系统语言、语系名称 +RANDOM: 生成一个随机数字 +PS1: Bash 解释器的提示符 +PATH: 定义解释器搜索用户执行命令的路径 +EDITOR: 用户默认的文本编辑器 COMMENT -ls -l > test.txt # 等同于 ls -l 1> test.txt -ls -l 2> test.txt # 仅打印错误信息 -ls -l &> test.txt # 打印 stdout 和 stderr -``` - -```bash -# 输出通过`>`重定向到文件后,不会再在终端输出。如果需要同时输出到文件和终端,需要使用`tee`命令 -ls -l > test.txt # 终端不会再输出 -ls -l | tee test.txt # 输入文件后,再输出到终端 - -# tee file1 file2 file3.... -# tee 命令将输入写入后,再将其作为后续命令的 stdin 传递下去 -ls -l | tee test.txt | cat -n - -# tee 默认覆盖写入。通过 -a 参入转为追加 -# tee -a file +$ echo $RANDOM # 生成一个随机数 ``` - 数组和关联数组 @@ -1197,25 +1275,6 @@ $ ls # 执行 ls -l $ \ls # 执行原生 ls ``` -- 输入/输出重定向 - -```bash -# < 输入重定向 -# > 输出重定向 -# >> 追加重定向命令 -# 2> 错误重定向 -# 2>> 追加错误重定向 - -$ echo '1' > test.md # 把 1 输入到 test.md -$ cat test.md # 1 -$ echo '2' > test.md # 把 2 输入到 test.md -$ cat test.md # 2,可以看见原内容被覆盖 -$ echo '3' >> test.md # 把 3 追加到 test.md -$ cat test.md -# 2 -# 3 -``` - - `env` 显示全部预设的系统变量 - `set` 显示系统变量和用户自定义的变量 - `unset variable` 删除某个变量 @@ -1281,6 +1340,93 @@ echo $result # 7 result=$(expr $no1 + $no2) # 3 ``` +- 子 shell + +```bash +# 将命令序列的输出赋值给变量 +# cmd_output=$(cmd) +# cmd_output=`cmd` +$ cmd_output=$(ls -l) +$ cmd_output=`ls -l` + +# 在 () 运行的命令是一个独立的子 shell 进程,不会对当前 shell 造成影响 +$ pwd # /var/ecmadao +$ (cd ../www && pwd) # /var/www +$ pwd # /var/ecmadao +``` + +#### 输出、重定向和管道符 + +- 彩色输出 + +```bash +:< 将输出重定向,>> 为重定向追加,但仅打印 stdin 的信息。在命令前加入文件描述符则可打印对应的输出: +1> 标准输出重定向 +2> 标准错误重定向 +&> 输出/错误重定向 + +cmd < file # 将文件作为命令的标准输入 +cmd << 结束符 # 从标准输入中读入,指定遇见结束符为止 +COMMENT + +ls -l > test.txt # 等同于 ls -l 1> test.txt +ls -l 2> test.txt # 仅打印错误信息 +ls -l &> test.txt # 打印 stdout 和 stderr +``` + +```bash +# 输出通过`>`重定向到文件后,不会再在终端输出。如果需要同时输出到文件和终端,需要使用`tee`命令 +ls -l > test.txt # 终端不会再输出 +ls -l | tee test.txt # 输入文件后,再输出到终端 + +# tee file1 file2 file3.... +# tee 命令将输入写入后,再将其作为后续命令的 stdin 传递下去 +ls -l | tee test.txt | cat -n + +# tee 默认覆盖写入。通过 -a 参入转为追加 +# tee -a file +``` + +- 输入/输出重定向 + +```bash +# < 输入重定向 +# > 输出重定向 +# >> 追加重定向命令 +# 2> 错误重定向 +# 2>> 追加错误重定向 + +$ echo '1' > test.md # 把 1 输入到 test.md +$ cat test.md # 1 +$ echo '2' > test.md # 把 2 输入到 test.md +$ cat test.md # 2,可以看见原内容被覆盖 +$ echo '3' >> test.md # 把 3 追加到 test.md +$ cat test.md +# 2 +# 3 +``` + - `tee file` ```bash @@ -1289,7 +1435,7 @@ result=$(expr $no1 + $no2) # 3 $ echo 'example' | tee test.txt | xargs ``` -- 管道符 `|` +- `|` 管道符 ```bash # 将前一个指令的输出作为后一个的输入 @@ -1365,7 +1511,7 @@ $ mkdir test; echo '123' # || 前一个执行失败才会执行后一个,类似于 或 操作符 ``` -- 函数 +#### 函数和流程控制 ```bash # 函数定义 @@ -1416,22 +1562,58 @@ fname a b # 2 is b ``` -- 子 shell - ```bash -# 将命令序列的输出赋值给变量 -# cmd_output=$(cmd) -# cmd_output=`cmd` -$ cmd_output=$(ls -l) -$ cmd_output=`ls -l` +:<