让你的 环境变量 更合理

简介: 让你的 环境变量 更合理

PATH

PATH 环境变量由 shell 或 libc 读取来查找并执行程序,这就是当在终端中键入 ls 时 shell 可以找到 /bin/ls 的方式。

在基于 Debian 的桌面系统上,默认 PATH 变量如下所示:

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games

实际上,很多设置并不是必需的。

在现代的操作系统中,/{bin,sbin}/ 文件夹通常是 /usr/{bin,sbin}/ 的符号链接。

来说,/usr/local 文件夹没什么用,如果我编译或安装软件,我更倾向于将它们放在默认的位置。

有时候在编译之前我会忘记运行 ./configure --prefix=/usr 命令,因此我把 /usr/local 设置成了指向 /usr 的符号链接(通过在 /usr 目录下执行 ln -s /usr local 命令)。

对于那些在公共软件仓库中找不到,且需要作为后台进程运行的软件,我会使用 /opt 目录。

这样做可以使得路径更短:

PATH=/usr/sbin:/usr/bin:/usr/games

为了更进一步地优化系统,我删除了 /usr/games 目录,因为我是通过 .desktop 文件来启动图形用户界面程序(例如游戏)。这些 .desktop 文件通常存放在${XDG_DATA_DIRS}/applications目录下。

到了 2024 年,我的做法就是这样,我计划利用根目录下的符号链接,以便得到更简短的路径字符串:

PATH=/sbin:/bin

最终,/usr/sbin 可能会合并到/usr/bin,因此只需要/bin。

仅仅在 /etc/environment 文件中配置 PATH 环境变量是不够的。

当 shell 启动后,它还会读取 /etc/profile 和用户的 ~/.profile 文件。

像 Rust 或 Python 这样的现代编程环境,往往会自动向 PATH 环境变量添加新的路径。

不过,我更喜欢明确控制 PATH 中的内容,因此我会通过创建符号链接的方式来管理:

$ file ~/bin ~/bin-rust ~/bin-py ~/bin-go ~/bin-js
~/bin:      directory
~/bin-rust: symbolic link to .cargo/bin
~/bin-py:   symbolic link to .local/bin
~/bin-go:   symbolic link to .golang/bin
~/bin-js:   symbolic link to .nvm/versions/node/v22.1.0/bin

我还希望系统二进制文件优先于用户一,因此我的 .profile 在重新分配时确保 $PATH 首先出现:

# ...

# Hide default GOPATH
if [ -d "$HOME/.golang" ] ; then
    GOPATH="$HOME/.golang"
fi

# User's local bin if it exists
if [ -d "$HOME/bin" ] ; then
    PATH="$PATH:$HOME/bin"
fi

# RUST local bin if it exists
if [ -d "$HOME/bin-rust" ] ; then
    PATH="$PATH:$HOME/bin-rust"
fi

# Python local bin if it exists
if [ -d "$HOME/bin-py" ] ; then
    PATH="$PATH:$HOME/bin-py"
fi

# Golang local bin if it exists
if [ -d "$HOME/bin-go" ] ; then
    PATH="$PATH:$HOME/bin-go"
fi

# NodeJs local bin if it exists
if [ -d "$HOME/bin-js" ] ; then
    PATH="$PATH:$HOME/bin-js"
fi

export GOPATH
export PATH
相关文章
|
NoSQL 搜索推荐 openCL
【C/C++ 调试 GDB指南 】gdb调试基本操作
【C/C++ 调试 GDB指南 】gdb调试基本操作
1147 2
|
存储 Rust 安全
服务网格eBPF应用探索之(一)eBPF基础知识
1)技术背景在eBPF诞生之前,对内核的调试和开发有着相当高的门槛,不仅要十分熟悉庞大的内核代码及开发流程,同时重新编译内核后若希望生效还需要重启OS,开发效率也相当低下。而eBPF提供了相当友好的内核开发/观测机制,即:由用户编写符合一定规范的代码,编译后加载至内核,内核会在指定的时机执行这段代码,内核同时还会将Hook点相关的上下文传递给这段代码供使用,代码可以修改上下文,或是通过返回值来改变
1362 0
服务网格eBPF应用探索之(一)eBPF基础知识
|
开发工具 git
vscode 查看git提交日志
vscode 查看git提交日志
2217 0
|
SQL 运维 监控
关系型数据库性能监控工具
【5月更文挑战第21天】
403 2
|
分布式计算 安全 OLAP
7倍性能提升|阿里云AnalyticDB Spark向量化能力解析
AnalyticDB Spark如何通过向量化引擎提升性能?
|
存储 缓存 分布式计算
HDFS优化方案
HDFS优化方案
|
SQL 存储 人工智能
OceanBase CTO杨传辉谈AI时代下数据库技术的创新演进路径!
在「DATA+AI」见解论坛上,OceanBase CTO杨传辉先生分享了AI与数据库技术融合的最新进展。他探讨了AI如何助力数据库技术演进,并介绍了OceanBase一体化数据库的创新。OceanBase通过单机分布式一体化架构,实现了从小规模到大规模的无缝扩展,具备高可用性和高效的数据处理能力。此外,OceanBase还实现了交易处理、分析和AI的一体化,大幅提升了系统的灵活性和性能。杨传辉强调,OceanBase的目标是成为一套能满足80%工作负载需求的系统,推动AI技术在各行各业的广泛应用。关注我们,深入了解AI与大数据的未来!
OceanBase CTO杨传辉谈AI时代下数据库技术的创新演进路径!
|
SQL 分布式计算 Java
Spark SQL向量化执行引擎框架Gluten-Velox在AArch64使能和优化
本文摘自 Arm China的工程师顾煜祺关于“在 Arm 平台上使用 Native 算子库加速 Spark”的分享,主要内容包括以下四个部分: 1.技术背景 2.算子库构成 3.算子操作优化 4.未来工作
2094 0
|
机器学习/深度学习 存储 PyTorch
Pytorch-自动微分模块
PyTorch的torch.autograd模块提供了自动微分功能,用于深度学习中的梯度计算。它包括自定义操作的函数、构建计算图、数值梯度检查、错误检测模式和梯度模式设置等组件。张量通过设置`requires_grad=True`来追踪计算,`backward()`用于反向传播计算梯度,`grad`属性存储张量的梯度。示例展示了如何计算标量和向量张量的梯度,并通过`torch.no_grad()`等方法控制梯度计算。在优化过程中,梯度用于更新模型参数。注意,使用numpy转换要求先`detach()`以避免影响计算图。
391 10
|
存储 安全 Ubuntu
eBPF程序如何跟内核进行交互
【2月更文挑战第4天】 一个完整的 eBPF 程序,通常包含用户态和内核态两部分:用户态程序需要通过 BPF 系统调用跟内核进行交互,进而完成 eBPF 程序加载、事件挂载以及映射创建和更新等任务;而在内核态中,eBPF 程序也不能任意调用内核函数,而是需要通过 BPF 辅助函数完成所需的任务。尤其是在访问内存地址的时候,必须要借助 bpf_probe_read 系列函数读取内存数据,以确保内存的安全和高效访问。