Linux Shell 与 Linux 内核的接口
我们将介绍 Linux shell,它是 Linux 的命令解释器。 Shell 提供了一个环境,其中在特定的已知路径中存在很少的 C 可执行程序。 Shell 找到这些可执行文件并将这些命令的输出提供给控制台。我们将讨论一些示例命令和 shell 的环境变量。
描述:
Shell 为用户提供了一个环境,用户可以在其中执行多个可执行程序,并且这些程序的输出显示在显示器上。基本上,shell 的工作原理是不断等待用户输入字符串。然后,搜索该字符串并将其与 shell 环境中存在的已知可执行程序进行匹配。如果找到匹配的可执行程序,则在创建子进程后启动可执行程序。这个新创建的子进程执行该程序。程序的输出被交给父进程,即shell。如果输出未重定向,Shell 会将输出打印到控制台。 shell 搜索可执行程序的位置存在于环境变量“PATH”中。 PATH 变量将“:”分隔在 shell 搜索可执行程序的多个路径中。
shell的框图如下所示:
从提供的框图中,我们可以得出结论,我们需要一个 shell 来在 Linux 环境中执行任何 C 可执行文件。如果没有shell,就不可能动态执行C 程序。有一些预定义的可执行程序,称为 shell 命令。 shell 命令的一些示例包括 ls、ps 等。
让我们讨论一下 shell 命令。 shell 命令有两种类型:
a) 内置命令
这些命令是 shell 本身的一部分。执行这些命令时,shell 不会分叉。这些命令作为 shell 本身的一部分执行。要更新这些命令,我们需要更新 shell 本身。这些命令与 shell 相关。
内置命令的一些例子有 cd、echo、kill、break、alias、bg 等。我们可以使用“help”命令来查看内置命令的完整列表。
b) 外部命令
这些命令是单独的 C 程序可执行文件。这些不是外壳的一部分。这些是特定路径上的地方。 Shell 查找这些路径、执行程序并显示输出。将新命令添加到已知命令列表中很容易;只需将新的可执行程序/命令复制到已知路径即可。一般这些命令都放在/usr/bin、/usr/sbin等路径下。所有的位置都在PATH中指定。
在我的系统中,可以检查 shell 的已知路径(即 echo 命令)以获取路径的完整列表:
/home/cienauser/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/
bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
如果我们想为此列表引入新路径,我们可以更新 PATH 环境变量的值。 “export”命令可用于使用新值更新 PATH。
使用“type”命令,我们可以知道任何命令是内置的还是外部的。让我们了解一下“类型”的用法。使用“cd”执行类型会产生以下输出:
cd is a shell builtin
Ubuntu@srathore:~/$
上一个命令的输出是不言自明的。
现在,让我们尝试使用 lspci 命令来执行“type”命令:
lspci is /usr/bin/lspci
Ubuntu@srathore:~/$
由于输出显示了可执行文件的路径,我们可以得出结论,这是一个外部命令。
环境变量
为 shell 定义的环境变量很少。到目前为止,我们已经了解了 PATH 变量。 PATH 是一个环境变量,它提供要搜索外部命令的路径列表。可以借助 env 命令检查环境变量的完整列表。 env 命令提供了环境变量的完整列表。
shell 环境变量的一些例子是:
PATH:外部命令的路径列表。
SHELL:当前活动的 shell 类型。
OLDPWD:最后一个工作目录。
PWD:指当前工作目录。
USER:活动 shell 的用户名。
HOME:用户的主目录。
还有更多。如前所述,可以使用 env 命令检查完整列表。
更改环境变量
需要的值可以直接赋给变量,因为 shell 允许我们使用赋值运算符。任何 shell 变量的当前值都可以借助 echo 命令查看。例如,如果我们想检查 PATH 的值。执行以下命令应该可以做到这一点:
回显`路径
在 shell 内的变量之前使用 $运算符会打印变量的值。这是 echo 命令提供的功能。同样,echo 可用于打印任何环境变量。
如果我们想更新 PATH 变量,我们需要更新自定义路径,例如 /usr/cutom,我们要添加到 PATH 中。我们将自定义命令放置在这条路径上。为了让 shell 执行这些命令,需要在 PATH 中更新其值。如果我们执行这些自定义程序而不更新 PATH,我们会收到错误消息“没有这样的文件或目录”。此错误清楚地表明 shell 无法找到命令。
作为实验,我们将自定义命令 myls 和 myps 放置在 /home/srathore/custom 中。当我们从 /home/srathore 执行 myls 或 myps 时,我们会从 shell 收到以下消息:
Command 'myls' not found, did you mean:
command 'tyls' from deb terminology
command 'mmls' from deb sleuthkit
Try: sudo apt install <deb name>
srathore@srathore:~$ myps
Command 'myps' not found, did you mean:
command 'mypy' from deb mypy
Try: sudo apt install <deb name>
srathore@srathore:~$
前面的消息显示未找到这些命令,操作系统建议安装这些命令。
现在,让我们将新的自定义路径添加到现有的 PATH 中,如下所示:
/home/cienauser/.local/bin:/usr/local/sbin:/usr/local/bin:
/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
srathore@srathore:~$ export PATH=$PATH:/home/srathore/custom
srathore@srathore:~$ echo $PATH
/home/cienauser/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:
/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/home/srathore/custom
srathore@srathore:~$
我们新添加的路径以粗体突出显示。我们可以看到 PATH 环境变量已更新为新值。
现在,让我们再次尝试执行自定义路径中存在的命令。通过执行“myps”和“myls”,我们得到以下输出:
PID TTY TIME CMD
2112 pts/0 00:00:00 bash
2783 pts/0 00:00:00 myps
srathore@srathore:~$ myls
a.out pack-installed spd_tool build_root_fs kernel_articles patches stime
coreboot kernel_ubuntu pcie_transfer_app stime.c
bash_arm custom lmsensors Redfishtool telnet_scripts nvm_cli
openssh snap
srathore@srathore:~$
之前的日志显示这两个命令都运行良好。正如我们在更新 PATH 变量之前观察到的那样,没有任何错误。我们讨论了最重要的 shell 变量,我们通常在日常开发工作中修改它。如果我们安装任何新的软件包,该变量就会更新,以便 shell 可以轻松找到新的工具命令。
结论
我们讨论了 shell 的定义。我们还了解了 shell 提供的不同类型命令的 shell 实现以及 shell 的环境变量背后的原理。我们还了解了一些环境变量。最重要的是,我们讨论了 PATH 变量。我们还看到了更新 PATH 的方法以及通过示例演示的变量的重要性。我们了解了 shell 及其产品的重要性。