Shell 在其提示符下执行程序。当你输入命令时,Shell 会搜索该程序,然后执行它。例如,当你输入命令 ls 时,Shell 会搜索名为 ls 的工具/程序,然后在 Shell 中运行它。你提供的参数和选项会影响你获得的结果。Shell 也被称为 CLI(命令行界面)。4.1 更改默认 Shell
大多数现代发行版都预装了 BASH(Bourne Again SHell),并配置为默认 shell。在 Linux 中负责更改 shell 的命令(实际上是可执行二进制文件,ELF)是 chsh(change shell)。我们可以首先使用 chsh -l 命令检查机器上已经安装和配置了哪些 shell,它会输出类似以下的结果:[archuser@archlinux ~]$ chsh-l/bin/sh/bin/bash/bin/rbash/usr/bin/sh/usr/bin/bash/usr/bin/rbash/usr/bin/systemd-home-fallback-shell
在某些 Linux 发行版中,chsh -l 是无效的。在这种情况下,可以在 /etc/shells 文件中找到所有可用 shell 的列表。你可以使用 cat 显示文件内容:[archuser@archlinux ~]$ cat /etc/shells# Pathnames of valid login shells.# See shells(5) for details./bin/sh/bin/bash/bin/rbash/usr/bin/sh/usr/bin/bash/usr/bin/rbash/usr/bin/systemd-home-fallback-shell
现在我们可以选择新的默认 shell,例如 fish,并使用 chsh -s 进行配置:[archuser@archlinux ~]$ chsh-s /usr/bin/shChanging shell for archuser.Password:Shell changed.
现在剩下要做的就是执行注销-登录循环,然后享受我们的新默认 shell。如果你希望为其他用户更改默认 shell,并且你在机器上拥有管理权限,你将能够通过使用 root 权限运行 chsh 来完成此操作。因此,假设我们想将 user_2 的默认 shell 更改为 fish,我们将使用与之前相同的命令,但加上其他用户的用户名:chsh -s /usr/bin/fish user_2要检查当前的默认 shell 是什么,我们可以查看 $SHELL 环境变量,它指向我们默认 shell 的路径,因此更改后,我们期望得到类似以下的结果:- -s shell - 将 shell 设置为登录 shell
- -l, --list-shells - 打印 /etc/shells 中列出的 shell 列表并退出
- -v, --version - 打印版本信息并退出
4.2 基础 Shell 工具
自定义 Shell 提示符
默认的命令提示符可以更改为看起来不同且更短的形式。如果当前目录很长,默认命令提示符会变得太大。在这些情况下使用 PS1 很有用。简短且自定义的命令提示符看起来漂亮而优雅。下表使用了许多参数的 PS1 来显示不同形式的 shell 提示符。默认命令提示符看起来像这样:user@host ~$,在我的情况下看起来像这样:devops@archlinux ~$。它可以按照下表进行更改:| 命令 | 效果 |
|---|
| Shell 提示符显示为目录名。在这种情况下,根目录显示为 Root。 |
| Shell 提示符显示为主机名 |
| Shell 提示符显示为用户名 |
| Shell 提示符显示为24小时格式时间 |
| Shell 提示符显示为12小时格式时间 |
| 显示命令在历史记录中的编号,代替 shell 提示符 |
| 按照你喜欢的方式显示 shell 提示符 |
一些基础 shell 命令
| 快捷键 | 命令 | 用途 |
|---|
Ctrl-k | cut/kill | 剪切/删除 |
Ctrl-y | yank/paste | 粘贴 |
Ctrl-a | | 将光标移到行首 |
Ctrl-e | | 将光标移到行尾 |
Ctrl-d | | 删除光标后/处的字符 |
Ctrl-l | | 清屏/终端 |
Ctrl-u | | 清除提示符和光标之间的所有内容 |
Ctrl-_ | | 撤销命令行上最后输入的内容 |
Ctrl-c | | 中断/停止在前台运行的作业/进程 |
Ctrl-r - 在 ~/.bash_history 中反向搜索历史记录,该文件存储了 shell 上使用的最后 500 条命令/事件 history - 显示命令历史 history | grep - 显示历史记录中包含关键词 的所有命令(在你只记得过去使用的命令的一部分时很有用)4.3 创建你自己的命令别名
如果你厌倦了在 bash 中使用长命令,你可以创建自己的命令别名。 最好的方法是修改(或创建,如果不存在)主文件夹中名为 .bash_aliases 的文件。一般语法是: alias command_alias='actual_command'
其中 actual_command 是你正在重命名的命令,command_alias 是你给它起的新名称。例如: alias install='sudo pacman -Sy'
将新命令别名 install 映射到实际命令 sudo pacman -Sy。这意味着当你在终端中使用 install 时,bash 会将其解释为 sudo pacman -Sy。4.4 在系统上定位文件
使用 bash,你可以使用 locate 命令轻松定位文件。例如,假设你正在寻找文件 mykey.pem:有时文件有奇怪的名字,例如你可能有一个名为 random7897_mykey_0fidw.pem 的文件。假设你正在寻找这个文件,但你只记得 mykey 和 pem 部分。你可以像这样使用管道将 locate 命令与 grep 结合使用:请注意,并非所有系统都安装了 locate 实用程序,而且许多安装了它的系统也没有启用它。locate 快速高效,因为它会定期扫描你的系统并缓存系统上每个文件的名称和位置,但如果未启用数据收集,它就无法告诉你任何信息。你可以使用 updatedb 手动启动文件系统扫描,以更新关于系统上文件的缓存信息。如果你没有可用的 locate,你可以回退到 find 实用程序:find / -name mykey.pem -print
这大致等同于 locate mykey.pem,但每次运行时都必须扫描你的文件系统以查找所讨论的文件,而不是使用缓存数据。这显然更慢且效率更低,但更实时。find 实用程序能做的远不止查找文件,但对其功能的完整描述超出了本章的范围。