Linux 基础:Shell 概念解析与 Python 环境安装指南
本文介绍 Linux Shell 的概念及其与 Windows 的区别,讲解内置命令与外部命令的差异及执行流程。同时提供 Ubuntu 下 Python3 的安装步骤,包括软链接与别名的设置方法,帮助新手解决常见的环境配置问题。

本文介绍 Linux Shell 的概念及其与 Windows 的区别,讲解内置命令与外部命令的差异及执行流程。同时提供 Ubuntu 下 Python3 的安装步骤,包括软链接与别名的设置方法,帮助新手解决常见的环境配置问题。

(Windows 和 Linux 中都有 Shell,但二者不是一个东西)
Linux 中的 Shell : 是 Linux 系统的"标准命令解释器",常见的有 bash zsh sh…Linux 用户几乎都用 Shell 操作系统 (Shell 本质是用户和操作系统内核之间的桥梁程序)
Windows 中的 Shell : 早期是 CMD,后来是 PowerShell,它们都属于 Shell 范围,是 Windows 的命令解释器
你在终端/命令行里输入的命令 (eg : ls cd…)电脑硬件是听不懂的,Shell 的作用就是 :
比喻 : Shell 就像你和 Linux/Windows 系统之间"翻译",你说人话命令,它帮你和系统沟通
Linux 命令分为两类 : 内置命令(Shell 内置命令只有十几个) + 外部命令(几乎都是外部命令)
(不管是 Linux 还是 Windows Shell,命令都分为两种,核心区别是是否有独立的可执行文件)
# 怎么判断一个命令是 内置命令 or 外置命令
type cd
# 输出 : cd is a shell builtin # (内置命令)
type ls
# 输出 : ls is /bin/ls # (外部命令)
type 作用 : 查看命令调用的类型 + 真实调用路径 + 本质 (只返回一个结果,按照优先级)
# 情况 1
type cd
# 输出:cd is a shell builtin
# 表示 cd 命令是一个 Shell 内置命令
# 这一类内置命令,没有独立的可执行文件,无需安装,直接可用 (只有十几个)
# 情况 2
# 事前设置了别名 alias python=python3
# (注意 : 重启后别名失效)
type python # 输出 : python is aliased to `python3'
# 表示 python 是 python3 的别名
# 情况 3
# 事先设置了软链接 ln -s /usr/bin/python /usr/bin/python3
type python # 输出 : python is /usr/bin/python
type python3 # 输出 : python3 is /usr/bin/python3
# 表示命令的可执行文件位置
# type -a 命令名
type -a python # -a 是 all 的缩写
# 意思是显示所有结果
type 显示的优先级 : alias(别名) > builtin(内置命令) > 外部命令/软链接 (file 文件路径)
which 命令是查看某一个命令的可执行文件
# cd 是一个内置命令,没有可执行文件
which cd
# 输出结果在不同 Shell 中表现不同
# 在 bash 中,没有结果,因为 cd 命令是内置命令,找不到可执行文件
# 在 zsh 中,输出一个提示信息 : cd: shell built-in command (表示 cd 是一个内置命令,找不到可执行文件)
# 综上所述 :
# which 命令是查找某一个命令的可执行文件在哪里
# 对于内置命令,找不到 (因为根本没有可执行文件)
# 对于外置命令,显示可执行文件的路径
(Linux Shell 的内置命令只有十几个,很简单,执行的时候就是直接执行,不在过多阐述,而且实际工作中外部命令使用最多)
下面以在 bash 中执行 python train.py 命令为例 (python 是外部命令,有独立的可执行文件/usr/bin/python)
| 步骤 | 实例 | 备注 |
|---|---|---|
| 1. 接收用户输入,拆分命令参数 | Shell 首先读取你输入的命令 python train.py,然后按照空格分割,拆成两部分 : 命令主体—python(要执行的外部程序) 命令参数—train.py(传给 python 的参数,指定要运行的脚本) | |
| 2. 检查命令是否是"别名" | Shell 会先判读那 python 是不是你设置的别名 (比如 你可能之前把 python3 设置为 python) | 可以用 alias 命令查看所有别名,如果是别名,Shell 会先把别名替换成真实命令 (比如 把 python 替换为 python3) |
| 3. 在 PATH 环境中,查找命令的可执行文件 | Shell 会拿着命令主体 python,去 PATH 环境变量记录中按顺序查找可执行文件,找到第一个匹配的文件就停止查找 (如果找不到,直接报错"command not found ") | 最关键一步 |
| 4. 创建子进程,执行外部命令 | 外部命令不能再 Shell 自身的进程里进行 fork 一个子进程:复制自己的进程,生成一个独立的子进程(相当于「分身」).exec 替换子进程:子进程用找到的 /usr/bin/python 程序,替换掉自己原来的内容,然后执行 python train.py。执行过程中,你的终端会被命令占用(比如训练模型时,会打印 loss 日志) | |
| 5. 等待命令执行完毕,回收子进程,返回结果 | Shell 会等待进程执行完,子进程执行完后会退出,Shell 会回收这个子进程的资源(防止「僵尸进程」)。把命令的执行结果(日志、报错信息)输出到终端,然后回到等待输入状态,等你敲下一个命令。 |
Shell 执行外部命令的核心流程:接收命令 → 拆参数 → 查别名 → 查 PATH 找文件 → 创子进程执行 → 回收进程返回结果
Shell 有内置命令,有外部命令 而有些外部命令需要安装才可以使用 (如 :python git…)
# python(默认指的是 python2,早淘汰 out 了) 和 python3 都是两个独立的命令名,核心区别是 python 版本不一样,所以 python 和 python3 是两个完全不一样的命令
# 更新系统软件源 (刷新软件商店)
apt update
# 安装 python3
apt install python3 -y # -y 自动确认
# 安装 python3-pip(python3 的包管理工具,用来装算法库)
apt install python3-pip -y # -y 自动确认
安装 python3 和 python3-pip 后,系统中只有 python3 和 pip3 命令,直接敲 python/pip 会提示找不到,给它设置软链接=Linux 的快捷方式,永久生效
# 给 python3 和 python3-pip 创建软链接
ln -s /usr/bin/python3 /usr/bin/python
# -s 是 symbolic
ln -s /usr/bin/pip3 /usr/bin/pip
alias python=python3 # 把 python 设置为 python3 的别名
alias pip=pip3 # 把 pip 设置为 pip3 的别名
ln -s /usr/bin/python /usr/bin/python3 # 把 python 文件夹指向 python3 ,创建了快捷方式
ln -s /usr/bin/pip /usr/bin/pip3 # 把 pip 文件夹指向 pip3 ,创建了快捷方式
软链接 (永久有效) 是以指针 (本质是指针) 的方式创建了一个新文件夹,这个文件夹指向 python3,这样在执行 python 命令的时候,Shell 先找到 python 的文件夹,在通过指针找到 python3 文件,执行 python3 文件
别名 (临时生效,重启就消失,相当于 Shell 的临时记忆) 是给 python3 起一个别名 python,当执行 python 时,Shell 会找到 python 的原本名字 python3,替换后再去执行命令
不管是软链接,还是别名,都是既可以使用 python 命令,也可以使用 python3 命令
root@CP:/ apt install python3
Reading package lists... Done # 读取包列表...完成
Building dependency tree... Done # 构建软件依赖树...完成
Reading state information... Done # 读取状态信息...完成
python3 is already the newest version (3.10.6-1~22.04.1). # python 已经被安装在新版本 (3.10.6)
python3 set to manually installed. # python3 被设置为手动安装 (系统永远不会把它自动卸载)
0 upgraded, 0 newly installed, 0 to remove and 40 not upgraded. # 0 个软件升级 0 个新的安装 0 个卸载并且 40 个软件没有升级
command [-options] [parameter] 命令单词 (命令可以由 主命令 + 子命令 组成 eg : apt install) 选项 参数 (一般,选项和参数的顺序可以互换) (但是当选项和参数绑定时,不可以交换 eg : find -name "test" -size +100k ./dir)
命令名 --help
内容最权威,最全面,是解决复杂问题的终极工具
man 命令名 # space : 向下翻一页
# enter : 向下翻一行
# q(quit) : 退出手册
# /关键字 : 在手册中搜索关键字 (eg : 在 man ls 中输入/h,就能找到-h 选项的解释)
info 是比 man 更详细的帮助工具,
它的内容是结构化的,像一本电子书,包含命令的背景,原理,详细用法 有层级结构
info 命令名 # enter : 进入子章节
# u : 返回上一级
# q(quit) : 退出
Linux 命令分为两种 : 外部命令 (eg : ls grep…有独立的可执行文件) 和 shell 内置命令 (eg : cd echo …属于 shell 本身的一部分) 内置命令用–help 可能无效,需要用 help 命令查看帮助
help 内置命令名

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online
通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online
将JSON字符串修饰为友好的可读格式。 在线工具,JSON美化和格式化在线工具,online