%% # 纲要 > 主干纲要、Hint/线索/路标 # Q&A #### 已明确 #### 待明确 > 当下仍存有的疑惑 **❓<font color="#c0504d"> 有什么问题?</font>** %% # 帮助手册 > 说明参见 #### man 手册 - `$ man [section] command `: 查看指定命令的手册页(或**指定章节** ) - `$ man -k keyword`: 根据**关键词**搜索手册页,会列出所有相关的手册页。 - `$ man -f name`: 打印**对该命令的简短描述(一行)**,等价于 `whatis` 命令 - `$ whatis [COMMAND...]`: 显示**对该命令的一行 `man` 手册描述** #### info 文档 - `info command`:查看指定命令的 info 文档 #### help 说明 - `$ help`:概览所有 shell 内置命令 - `$ help command`:查看指定**shell 内置命令**的说明 - `-s`:只显示命令的语法 #### TLDR 手册(开源项目) - `$ tldr <command>`:查询命令的使用说明 <br><br> # Linux 命令语法说明 man 手册页中的命令语法格式说明: ![[_attachment/02-开发笔记/11-Linux/Linux 命令行/Linux-命令行基本使用.assets/IMG-Linux-命令行基本使用-F5A201AE6E15D1B64564B0FCF41FAF97.png|534]] > [!example] > (1): > ![[_attachment/02-开发笔记/11-Linux/Linux 命令行/Linux-命令行基本使用.assets/IMG-Linux-命令行基本使用-6DC0D5CB05E8C1BE729DE722D9394082.png|626]] > (2): > ![[_attachment/02-开发笔记/11-Linux/Linux 命令行/Linux-命令行基本使用.assets/IMG-Linux-命令行基本使用-08D9C982C89C00604BEBA789B9143443.png|607]] > (3): > ![[_attachment/02-开发笔记/11-Linux/Linux 命令行/Linux-命令行基本使用.assets/IMG-Linux-命令行基本使用-69B4BBCAC9C2CA0344F4E6A55693948B.png|632]] > <br><br><br> # 命令列表 命令列表:在单行中指定要**依次运行**的一系列命令,各个命令之间以**分号`;`分隔**。 ```shell true; echo "Hello world" ``` <br> # 命令编组 🐢 "**命令编组**"(`grouping`) 用于指示 **"==创建一个新的子 shell== 并在该==子 shell 中执行括号内命令=="**: - 语法: `(commands)`,即圆括号包围一组命令 - 圆括号中的命令将在**新创建的子 shell 中依次执行**; - 子 shell 在命令执行完成后会**自动退出**。 > [!NOTE] 命令编组的主要目的:**==环境隔离==** > > - 括号内的命令在一个新的子 shell 中执行,**任何在括号内进行的环境变量修改、目录切换等操作不会影响当前 shell**。 > > > - 适用于 "**需要临时改变环境变量或目录的场景**"。 ```shell # 示例: 利用命令编组创建一个子shell, 并在子shell中切换目录, 修改环境变量 MYVAR="Hello" (cd ../mydir; export MYVAR="World"; pwd; echo $MYVAR) pwd; echo $MYVAR ``` ### 命令编组的用途 ![[_attachment/02-开发笔记/11-Linux/Linux 命令行/Linux-命令行基本使用.assets/IMG-Linux-命令行基本使用-5A4B013986EAC11E416C7381292A02CE.png|435]] <br> # 条件执行 🐢 - `command1 && command2`: 在**前一条命令==成功执行==的情况下** 执行第二条命令 - `command1 || command2`: 在**前一条命令==没有成功执行==时**执行第二条命令 <br><br> # 命令替换 🐢 ![[02-开发笔记/11-Linux/shell 相关/shell 脚本#命令替换|命令替换]] # 进程替换 🐢 进程替换:**将一个命令的==标准输入或输出==与一个 "==伪文件==" (临时文件)关联**,同时 "**进程替换**" 语法本身会被替换为该 "**伪文件**",因而可用在任何 **"==文件==" 作为参数或输入的位置**。 - **输出**进程替换:`<(command)`—— **将 `command` 的==标准输出== 重定向到伪文件**,同时**将指令 `<(command)` 替换为该伪文件**。 - **输入**进程替换:`>(command)`—— **将 `command` 的==标准输入== 重定向到伪文件**,同时**将指令 `>(command)` 替换为该伪文件**。 参见[[02-开发笔记/11-Linux/shell 相关/shell-输入输出与重定向#进程替换|输入输出与重定向-进程替换]] <br> # 将标准输入作为参数传递给另一命令——`xargs` 命令 `xargs` 工具**将==来自其 `stdin` 的输入==作为==参数==传递给另一个命令**。 `xargs [options] [command [initial-arguments]]`: - `-r`:若 `xargs` 没有输入则不运行命令 ```shell # 删除当前目录下所有文件 ls | xargs rm # 递归删除当前目录及其子目录中的所有`.tmp`文件 find . -name "*.tmp" | xargs rm # 统计指定目录下所有`.c`和`.h`文件中的代码行数 find /path -name '*.c' -p -name '*.h' | xargs wc -l ``` <br><br> # 别名 🐢 #### 查看别名 - `$ alias [name]` 🐢:查看**所有别名**或**指定别名**的定义 #### 创建别名 - `$ alias name='command'` 🐢 : 为指定**命令或命令序列**创建别名 > [!NOTE] > > - 在 **shell 或 shell 脚本**中定义的别名仅在**其被定义的 shell 进程中**有效。 > - 在**环境变量**中定义的别名将在任何地方都有效。 > > 创建永久别名:为了使别名在**每次启动 shel l 时都可用**,可以将别名添加到 shell 的配置文件 `~/.bashrc` 中: > > ```shell > # 示例: > echo "alias ll='ls -l'" >> ~/. bashrc > echo "alias la='ls -la'" >> ~/. bashrc > echo "alias gs='git status'" >> ~/. bashrc > ``` > #### 删除别名 - `$ unalias name` 🐢:删除指定别名 <br> # 标准通配符 ![image-20230922155347313|277](_attachment/02-开发笔记/11-Linux/Linux%20命令行/Linux-命令行基本使用.assets/IMG-Linux-命令行基本使用-50BCB1AF939EBEA88F9465BEE7FD9E30.png) ```shell ls f?ll # 匹配任意单个字符 ls f*ll # 匹配0个或多个字符 ls f[ai]ll # 匹配a或i ls f[a-i]ll # 匹配字母范围 ls f[!a]ll # 排除字符 ``` <br> # 花括号展开 当在一个 **"字符串" 中包含花括号 `{}`** 时,**花括号内的内容(以`,`分隔)将会==自动展开==**。 ```shell convert image.{png,jpg} # Will expand to convert image.png image.jpg cp /path/to/project/{foo,bar,baz}.sh /newpath # Will expand to cp /path/to/project/foo.sh /path/to/project/bar.sh /path/to/project/baz.sh /newpath # Globbing techniques can also be combined mv *{.py,.sh} folder # Will move all *.py and *.sh files ``` <br> # 单引号与双引号 - 单引号 `'` 括起来的字符串只作为 "**==字符串字面量==**",不会进行 "**变量引用**"; - 双引号 `"` 括起来的字符串中,`
会被解释为 "**变量引用**" ```shell foo=bar echo '$foo' # print $foo echo "$foo" # print bar ``` <br> # 一些快捷用法 - `cd -`:返回上一个目录 - `!!`:重复执行上一条指令 - `$_`:表示上一个命令的**最后一项参数**,可借此重复上一 "路径"、"文件名" 等。 <br><br> # shell 相关 #### 查看 shell 选项 - `$ set -o`:以**容易阅读的方式**显示所有 shell 选项的当前状态。 - `$ set +o`:以**紧凑的方式**显示所有 shell 选项的当前状态 #### 设置/复位 shell 选项 - `$ set -o <option>`: 打开/设置指定 shell 选项 - `$ set +o <option>`: 取消/复位指定 shell 选项 <br><br> # 变量相关 > [!NOTE] > - 当需要**使用**环境变量的**值**,"**引用**"环境变量时,需要在环境变量名前加`
。 > - 例如 `echo $var` > - `printvar` 命令除外 > > - 当需要**操作**环境变量时,不需要加`
。 > - 例如`export`,`unset` ; #### 查看所有环境变量 - `$ printenv` | `$ env` : 查看**所有环境变量 #### 查看指定变量 - `$ printenv var` :查看**指定 "环境变量" 的值** (变量名前**不需要**带有`
) - `$ echo $var`: 查看**指定变量(环境变量或 shell 变量)的值** (变量名前需要带有 `
) ```shell # 示例: 查看环境变量HOME printenv HOME echo $HOME ``` #### 查看 shell 变量和函数 > 所有通过 env 命令或 printenv 命令能看到的环境变量也会显示在 `set` 的输出中 - `$ set` 🐢 :显示**当前 shell 进程**中的**所有 shell 变量**(包括环境变量、用户自定义的局部变量)和**shell 函数**,输出结果按字母序排序 #### 定义 shell 变量 `$ variable=value` (注:**等号两边不能有空格**) > 示例:`$ PATH=$PATH:/home/ddd`,将新的路径"追加"到现有环境变量中。 > > 注:如果希望子进程该环境变量,则务必确保将修改后的 PATH 环境变量通过`export` 导出。 #### 将 shell 变量导出为环境变量 - `$ export var` :导出某个已定义的 shell 变量为 "环境变量" - `$ export var=value` : 定义并导出为环境变量 > [!NOTE] 如果 value 字符串包含空格,则必须用单引号或双引号来界定起止。 > > 示例:`$ my_var="Hello World"` > #### 删除变量 `$ unset var` 删除某个变量 #### bash shell 特殊变量 ![[02-开发笔记/11-Linux/shell 相关/shell 变量#bash shell 特殊变量|shell 变量]] # 历史命令 🐢 - `$ ![OPTION]`:**事件提示符** - `$ !<N>` :**执行 `history` 中序号为 `N` 的历史指令** - `$ !-<N>`:**执行`history` 中==倒数==第 `N` 个命令** - `$!!` | `$ !-1`:执行上一条命令(`!!` 是 `!-1` 的别名) - `$ history [num]` **查看最近使用过的历史命令**(通常默认保存最近 1000 条,保存于在`.bash_history` 文件中) - `-a`:强制将命令历史记录写入`.bash_history` 文件; - 默认情况下,在 CLI 会话期间,bash 命令的历史记录被保存在内存中。当 shell 退出时才被写入历史文件。 - `-c`:**清空**当前用户在本机上的历史指令记录 - `[num]`:指定 `num` 时,显示 "**最近使用的 `num` 条指令**" <br><br> # 参考资料 # Footnotes