c - 为什么 bash 在分配时不自动导出 PATH?

标签 c linux bash shell operating-system

我们通常用脚本写:

PATH="xxx"
export PATH

我知道 PATH 是 bash 中的一个公共(public)变量,然后 export 调用 setenv() 来做一些事情。

但是当 PATH 被赋值时,为什么 bash 不自动导出 PATH。

是否有人只想更改 PATH 变量而不导出它?或者,其他一些原因?

最佳答案

事实上,您可以在您的情况下省略导出语句。尝试一下:打开一个子 shell(通过键入 bash),然后将 PATH 变量设置为不同的值而不导出它,然后打开另一个子 shell(这次通过键入 bash --norc,以避免 .bashrc 由于更改 PATH 而可能出现的错误),然后执行 echo $PATH。您会看到 PATH 变量已更改,即使您没有导出它也是如此。

然而,原因并不是 PATH 有任何特殊之处(即由 bash shell 的某些内部魔法自动导出)。它被导出,因为您标记一次用于导出的变量被放入环境中——这就是“导出”的实际含义——因此被所有子进程继承。对于 PATH,很可能已经在/etc/profile 中设置了一些 PATH,当然您会在此文件中找到 export PATH。每当 bash 作为登录 shell 运行时都会获取此文件,因此由它产生的所有其他进程继承。

在您自己的点文件中导出 PATH 仍然是一个好主意,因为您的 bash 将独立于父进程的环境。毕竟,可以构建一个示例,其中一个交互式非登录 bash shell 由一个在其环境中没有有 PATH 的进程调用。

关于c - 为什么 bash 在分配时不自动导出 PATH?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53551088/

相关文章:

mysql - 如何在bash脚本中执行带有参数的SQL命令

c - 如何运行这个编译好的开放MPI程序(C)?

c - IAR Embedded Workbench : stdarg. h 未预处理

c - 我应该释放 setlocale 返回的指针吗?

c - GNU Triplet、GCC 和 Linux 内核编译

sql - 我下载了 mac os 的 mssql 工具,但它说 "sqlcmd: command not found"

bash - 使用 xargs 显示 git 别名中的命令

c - 我需要生成一组97到122之间的随机数

c - 如何尽可能快地输出固定缓冲区?

c - 易于为 C 扩展 IDE