【问题标题】:Setting Enviroment Variables Dynamically on Linux在 Linux 上动态设置环境变量
【发布时间】:2009-11-12 10:26:20
【问题描述】:

我目前正在寻找一种通过简单的 shell 脚本在 Linux 中设置环境变量的方法。在脚本中,我目前正在使用“导出”命令,但是这仅在脚本中具有需要系统范围范围的范围。

我是否可以通过 shell 脚本执行此操作,还是需要使用其他方法?

【问题讨论】:

    标签: linux shell environment-variables


    【解决方案1】:

    当您运行 shell 脚本时,它会在子 shell 中执行。您需要的是在当前 shell 的上下文中执行它,通过以下方式对其进行采购:

    source myshell.sh
    

    或:

    . myshell.sh
    

    后者是我的首选方法,因为我天生懒惰。

    如果您谈论的是系统范围的范围,因为您想影响每个人,您需要将您的命令放在登录时(或外壳创建时)获取它们的位置,/etc/profile例如。您将命令放在哪里取决于所使用的 shell。

    您可以通过检查您的 shell 的 man 页面来了解执行了哪些脚本:

    man bash
    

    bash shell,当作为登录 shell(包括作为非登录 shell,但带有 --login 参数)调用时,将使用 /etc/profile~/.bash_profile~/.bash_login 或 @ 中的第一个987654331@.

    非登录 bash shells 将使用。除非使用--norc--rcfile <filename> 调用,否则文件/etc/bash.bashrc~/.bashrc

    我很确定它甚至更多复杂,具体取决于外壳的运行方式,但就我的记忆而言。 man 页面应该详细说明。

    【讨论】:

    • 不幸的是,脚本要从带有多个参数的不同应用程序中运行(每次登录时也会运行多次)
    • 不能直接影响其他进程的环境,如果bash启动执行链不够,可能需要另找办法。
    【解决方案2】:

    您可以让您的脚本检查诸如 /var/myprog/env-vars-to-load 之类的东西是否存在,并“源”它,然后如果它存在则取消链接,可能使用陷阱和信号。很难说,我对你的程序不熟悉。

    没有办法将环境变量“注入”到另一个进程的地址空间中,因此您必须找到某种 IPC 方法来指示进程设置什么。

    【讨论】:

      【解决方案3】:

      环境变量的一个基本方面是您不能影响任何进程的环境,但您自己和您生成的子进程除外。您不能创建一个脚本来设置“系统范围”的环境变量,而这些环境变量以某种方式可以被其他进程使用。

      【讨论】:

        【解决方案4】:

        在 shell 提示符下:

        $ source script.sh
        

        并在 script.sh 中设置环境变量

        【讨论】:

          【解决方案5】:

          test.sh

          #!/bin/bash
          echo "export MY_VAR=STACK_OVERFLOW" >> $HOME/.bashrc
          . $HOME/.bashrc
          sh task.sh
          

          task.sh

          #!/bin/sh
          
          echo $MY_VAR
          

          添加可执行权限:

          chmod +x test.sh task.sh
          

          然后启动 test.sh

          ./test.sh
          

          结果:

          STACK_OVERFLOW
          

          【讨论】:

            猜你喜欢
            • 2021-12-10
            • 2015-02-14
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2022-11-20
            • 1970-01-01
            • 1970-01-01
            • 2015-08-07
            相关资源
            最近更新 更多