Kat*_*tie 40 bash shell environment-variables
最近我写了一个设置环境变量的脚本,看看:
#!/bin/bash
echo "Pass a path:"
read path
echo $path
defaultPath=/home/$(whoami)/Desktop
if [ -n "$path" ]; then
export my_var=$path
else
echo "Path is empty! Exporting default path ..."
export my_var=$defaultPath
fi
echo "Exported path: $my_var"
Run Code Online (Sandbox Code Playgroud)
它工作得很好但问题是my_var只在本地可用,我的意思是在我运行脚本的控制台窗口中.
如何编写一个脚本,允许我导出可以随处看到的全局环境变量?
小智 99
只需运行以" ."(点空格)开头的shell脚本.
这会导致脚本运行原始shell中的指令.因此,在脚本完成后,变量仍然存在
例如:
cat setmyvar.sh
export myvar=exists
. ./setmyvar.sh
echo $myvar
exists
Run Code Online (Sandbox Code Playgroud)
Dav*_* W. 39
每个shell都有自己的环境.没有通用环境可以神奇地出现在所有控制台窗口中.在一个shell中创建的环境变量无法在另一个shell中访问.
它更具限制性.如果一个shell生成一个子shell,那个子shell可以访问父的环境变量,但是如果该子shell创建了一个环境变量,那么它在父shell中是不可访问的.
如果所有shell都需要访问同一组变量,则可以创建一个启动文件来为您设置它们.这是通过$HOME/.bash_profile和$HOME/.profile文件在BASH中完成的,$HOME/.bash_profile如果$HOME/.bashrc不存在则通过.其他shell有自己的一组启动文件.一个用于登录,一个用于生成没有登录的shell.请参阅联机帮助页以了解确切使用了哪些启动脚本以及它们执行的顺序.
您可以尝试使用共享内存,但我相信只有在进程运行时才有效,所以即使您想出了一种设置共享内存的方法,它也会在该命令完成后立即消失.(除了命名管道,我很少使用共享内存).否则,实际上没有办法在一个shell中设置环境变量,并让另一个shell自动获取它.您可以尝试使用命名管道或将该环境变量写入文件以供其他shell使用.
想象一下如果有人在我不知情的情况下改变一个shell的环境就可能发生的问题.
以下内容摘自 David W. 的回答的第二段:“如果一个 shell 生成一个子 shell,则该子 shell 可以访问父 shell 的环境变量,但如果该子 shell 创建一个环境变量,则在父 shell 中无法访问它。 ”
如果用户需要让父 shell 访问您的新环境变量,只需在父 shell 中发出以下命令:
source <your_subshell_script>
Run Code Online (Sandbox Code Playgroud)
或使用快捷方式
. <your_subshell_script>
Run Code Online (Sandbox Code Playgroud)
实际上我找到了一种方法来实现这一点(在我的例子中是使用 bash 脚本来设置一些安全凭证)
我只是bash从脚本内部调用,生成的外壳现在具有导出值
export API_USERNAME=abc
export API_PASSWORD=bbbb
bash
Run Code Online (Sandbox Code Playgroud)
现在调用文件 using~/.app-x-setup.sh会给我一个带有这些环境值设置的交互式 shell