从solana安装脚本中学习的知识

  • Louis
  • 发布于 10小时前
  • 阅读 41

相关背景我在安装solanacli工具的时候,查看了官方文档,我本机的环境是macos,可以使用shell脚本进行安装,这里学习下安装脚本的语法规则

相关背景

我在安装 solana cli 工具的时候,查看了官方文档,我本机的环境是 macos,可以使用 shell 脚本进行安装,这里学习下安装脚本的语法规则:

命令结构分析

sh -c "$(curl -sSfL https://release.anza.xyz/stable/install)"

各部分解释:

  1. sh -c

    • sh 是 shell 解释器
    • -c 参数表示执行后面字符串中的命令
  2. "$(...)"

    • 这是命令替换语法
    • $() 会先执行括号内的命令,并将其输出作为外层命令的参数
  3. curl -sSfL https://release.anza.xyz/stable/install

    • curl 是下载工具
    • -s = silent(静默模式,不显示进度条)
    • -S = show-error(出错时显示错误信息)
    • -f = fail(HTTP错误时失败退出)
    • -L = location(跟随重定向)
    • URL 是要下载的脚本地址

执行流程

  1. 首先执行 curl 命令从 URL 下载安装脚本内容
  2. 下载的脚本内容被传递给 sh -c 执行
  3. 相当于直接运行了远程的安装脚本

语言归属

  • 主要语言:Shell Script(Bash/sh)
  • 工具:curl(网络请求工具)
  • 用途:这是一种常见的"一键安装"模式,用于安装软件包或工具

这种模式在开源软件安装中很常见,比如 Homebrew、Node.js、Docker 等都采用类似的安装方式。从 URL 来看,这应该是 Anza(Solana 相关工具)的安装脚本。

安装完毕后配置环境变量

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"

/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 都会读取)

为什么这样做是安全的?

  1. 不会删除原有路径:$PATH 保留了所有原来的路径
  2. 只是添加新路径:把 Solana 工具目录加到最前面
  3. 优先级控制:新路径在前面,会优先查找

类比理解

想象 PATH 就像一个书架列表

  • 原来书架:书架A:书架B:书架C
  • 添加新书架:新书架:书架A:书架B:书架C
  • 找书时:从左到右依次查找

关于 $PATH 相关问题汇总

PATH 是什么?

PATH 就像系统的"通讯录" ,告诉系统去哪里找可执行程序。

为什么需要 PATH?

当您在终端输入 solana 时,系统需要知道:

  1. solana 这个程序在哪里?
  2. 应该执行哪个文件?

让我演示一下:

which solana

/Users/louis.chu/.local/share/solana/install/active_release/bin/solana

看!solana 实际上是一个位于很深目录里的文件。

系统查找程序的过程

当您输入 solana 时,系统会:

  1. 第一步:在 /Users/louis.chu/.local/share/solana/install/active_release/binsolana如果找到了!执行这个
  2. 如果没找到:继续在 /Users/louis.chu/.gvm/pkgsets/go1.24.0/global/bin
  3. 如果还没找到:继续在下一个目录找
  4. 直到找到为止,或者报错 "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 缓存

让我们运行一个命令,然后查看缓存:

solana --version > /dev/null && hash

solana=/Users/louis.chu/.local/share/solana/install/active_release/bin/solana

系统已经记住了 solana 的位置。下次再输入 solana 时,直接从缓存读取,无需重新查找。

实际查找过程,第一次运行 solana

  1. 系统在 PATH 中查找(这确实需要时间)
  2. 找到后缓存结果
  3. 执行程序

后续运行 solana

  1. 直接从缓存读取位置 ⚡
  2. 立即执行程序
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论