如何编写bash脚本来设置全局环境变量?

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)

  • 这确实应该是带有绿色大问号的答案。 (3认同)
  • 这应该是公认的答案.这个答案最能满足原始要求. (3认同)
  • 答对了。这解决了问题中描述的问题(在调用 shell 中设置环境变量)。 (2认同)

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的环境就可能发生的问题.

  • 一个壳在不知情或不同意的情况下改变另一个壳确实是坏事.但是最初的问题,虽然有一个措辞严厉的标题,但询问如何在控制台窗口中更改"运行脚本"的变量,即知识和同意,这是合法和有用的.JDembinski的答案显示了如何. (2认同)
  • 可以使用系统范围的环境文件,例如`/etc/environment`、`/etc/profile` 和`/etc/profile.d/` 或`/etc/bash.bashrc`。就我而言,我使用 `/etc/environment` 来存储 `cron` 任务的变量。 (2认同)

Jon*_*n L 9

以下内容摘自 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)


Din*_*ruz 5

实际上我找到了一种方法来实现这一点(在我的例子中是使用 bash 脚本来设置一些安全凭证)

我只是bash从脚本内部调用,生成的外壳现在具有导出值

export API_USERNAME=abc
export API_PASSWORD=bbbb
bash
Run Code Online (Sandbox Code Playgroud)

现在调用文件 using~/.app-x-setup.sh会给我一个带有这些环境值设置的交互式 shell

  • 或者你可以直接获取它而不是执行它。现在你有了一个嵌套的 shell。 (4认同)