相关背景
我在安装 solana cli 工具的时候,查看了官方文档,我本机的环境是 macos,可以使用 shell 脚本进行安装,这里学习下安装脚本的语法规则:
命令结构分析
bash
sh -c "$(curl -sSfL https://release.anza.xyz/stable/install)"
各部分解释:
-
sh -c
:sh
是 shell 解释器-c
参数表示执行后面字符串中的命令
-
"$(...)"
:- 这是命令替换语法
$()
会先执行括号内的命令,并将其输出作为外层命令的参数
-
curl -sSfL https://release.anza.xyz/stable/install
:curl
是下载工具-s
= silent(静默模式,不显示进度条)-S
= show-error(出错时显示错误信息)-f
= fail(HTTP错误时失败退出)-L
= location(跟随重定向)- URL 是要下载的脚本地址
执行流程
- 首先执行
curl
命令从 URL 下载安装脚本内容 - 下载的脚本内容被传递给
sh -c
执行 - 相当于直接运行了远程的安装脚本
语言归属
- 主要语言:Shell Script(Bash/sh)
- 工具:curl(网络请求工具)
- 用途:这是一种常见的"一键安装"模式,用于安装软件包或工具
这种模式在开源软件安装中很常见,比如 Homebrew、Node.js、Docker 等都采用类似的安装方式。从 URL 来看,这应该是 Anza(Solana 相关工具)的安装脚本。
安装完毕后配置环境变量
bash
echo 'export PATH="/Users/louis.chu/.local/share/solana/install/active_release/bin:$PATH"' >> ~/.zshrc
我完全理解您的担心!让我详细解释这个命令,帮您消除恐惧感。
1. echo
命令
- 作用:输出文本内容
- 例子 :
echo "hello"
会在屏幕上显示hello
2. 单引号
- 作用:保护内容不被 shell 解释
- 重要 :防止
$PATH
被立即展开 - 如果用双引号 :
$PATH
会被替换成当前路径值,这不是我们想要的
3. export PATH="..."
这是环境变量的核心语法:
PATH
环境变量
- 作用:告诉系统在哪些目录中查找可执行程序
- 当前值 :您可以用
echo $PATH
查看
export
命令
- 作用:将变量导出,让子进程也能使用
- 不用 export:只在当前 shell 有效
- 用了 export:所有程序都能看到这个变量
4. 路径组成 "新路径:$PATH"
bash
/Users/louis.chu/.local/share/solana/install/active_release/bin:$PATH
- 新路径 :
/Users/louis.chu/.local/share/solana/install/active_release/bin
- 冒号
:
:路径分隔符 $PATH
:原来的所有路径
5. >>
重定向符号
>
:覆盖文件内容(危险!)>>
:追加到文件末尾(安全)
6. ~/.zshrc
~
:您的用户主目录/Users/louis.chu
.zshrc
:zsh 配置文件(每次启动 zsh 都会读取)
为什么这样做是安全的?
- 不会删除原有路径 :
:$PATH
保留了所有原来的路径 - 只是添加新路径:把 Solana 工具目录加到最前面
- 优先级控制:新路径在前面,会优先查找
类比理解
想象 PATH 就像一个书架列表:
- 原来书架:
书架A:书架B:书架C
- 添加新书架:
新书架:书架A:书架B:书架C
- 找书时:从左到右依次查找
关于 $PATH 相关问题汇总
PATH 是什么?
PATH 就像系统的"通讯录" ,告诉系统去哪里找可执行程序。
为什么需要 PATH?
当您在终端输入 solana
时,系统需要知道:
solana
这个程序在哪里?- 应该执行哪个文件?
让我演示一下:
bash
which solana
/Users/louis.chu/.local/share/solana/install/active_release/bin/solana
看!solana
实际上是一个位于很深目录里的文件。
系统查找程序的过程
当您输入 solana
时,系统会:
- 第一步 :在
/Users/louis.chu/.local/share/solana/install/active_release/bin
找solana
如果找到了!执行这个 - 如果没找到 :继续在
/Users/louis.chu/.gvm/pkgsets/go1.24.0/global/bin
找 - 如果还没找到:继续在下一个目录找
- 直到找到为止,或者报错 "command not found"
生活中的类比
PATH 就像外卖 App 的商家列表:
- 您想点"汉堡"
- App 按顺序搜索:麦当劳 → 肯德基 → 汉堡王...
- 找到第一家有汉堡的就下单
不同路径的作用
路径类型 | 示例 | 用途 |
---|---|---|
系统程序 | /usr/bin , /bin |
macOS 自带程序 (ls, cp, mv) |
用户安装 | /usr/local/bin |
Homebrew 等安装的程序 |
个人工具 | ~/.local/share/solana/.../bin |
个人安装的工具 |
开发环境 | ~/.nvm/.../bin |
Node.js 环境 |
Go 环境 | ~/.gvm/.../bin |
Go 语言环境 |
您的担心很有道理!但实际上系统的查找效率比您想象的要高很多。让我解释一下为什么:
系统优化机制
上面提到了,查找命令的时候,是每个文件目录去搜索,找不到就开始寻找下一个,这种其实效率并不高,在系统层面还有缓存机制来解决这个问题
Hash Table 缓存
让我们运行一个命令,然后查看缓存:
javascript
solana --version > /dev/null && hash
solana=/Users/louis.chu/.local/share/solana/install/active_release/bin/solana
系统已经记住了 solana
的位置。下次再输入 solana
时,直接从缓存读取,无需重新查找。
实际查找过程,第一次运行 solana
:
- 系统在 PATH 中查找(这确实需要时间)
- 找到后缓存结果
- 执行程序
后续运行 solana
:
- 直接从缓存读取位置 ⚡
- 立即执行程序