【问题标题】:Setting environment variables in Linux using Bash使用 Bash 在 Linux 中设置环境变量
【发布时间】:2023-12-19 20:08:01
【问题描述】:

tcsh,我有以下脚本工作:

#!/bin/tcsh
setenv X_ROOT /some/specified/path

setenv XDB    ${X_ROOT}/db
setenv PATH   ${X_ROOT}/bin:${PATH}

xrun -d xdb1 -i $1 > $2

什么相当于 Bash 中的 tcsh setenv 函数?

有直接模拟吗?环境变量用于定位可执行文件。

【问题讨论】:

    标签: linux bash unix shell


    【解决方案1】:

    export VAR=value 将 VAR 设置为 value。如果需要空格,请将其括在单引号中,例如 export VAR='my val'。如果要对变量进行插值,请使用双引号,例如 export VAR="$MY_OTHER_VAR"

    【讨论】:

    • PS:最后一个不需要双引号。 shell 不为变量赋值执行分词。
    • 只为初学者。我没有直接理解它,这里是普通英语: interpolate "$X" 在这里意味着你已经有一个变量 X 填充了一个值,例如“A”,你想先读出那个值“A”,然后把这个值赋值为VAR的值。当然,您不希望 VAR 成为 "$X" 的字符串。然后上面的评论似乎也合乎逻辑,你甚至不需要“”。对于“A”的直接分配,使用“A”。如果我错了,请纠正我。
    • 关于插值变量的最后注释的奖励积分
    【解决方案2】:

    人们经常建议写作的原因

    VAR=value
    export VAR
    

    而不是更短的

    export VAR=value
    

    是较长的形式比短的形式在更多不同的外壳中工作。如果您知道您正在处理的是bash,那么当然可以正常工作。

    【讨论】:

      【解决方案3】:

      在 Linux 上使用 Bash 设置本地和环境变量

      在 Bash 中检查名为 LOL 的变量的本地或环境变量:

      el@server /home/el $ set | grep LOL
      el@server /home/el $
      el@server /home/el $ env | grep LOL
      el@server /home/el $
      

      完整性检查,没有称为 LOL 的本地或环境变量。

      在本地而不是环境中设置一个名为 LOL 的局部变量。所以设置它:

      el@server /home/el $ LOL="so wow much code"
      el@server /home/el $ set | grep LOL
      LOL='so wow much code'
      el@server /home/el $ env | grep LOL
      el@server /home/el $
      

      变量“LOL”存在于局部变量中,但不存在于环境变量中。如果您重新启动终端、注销/登录或运行exec bash,LOL 将消失。

      设置一个局部变量,然后清除Bash中的所有局部变量

      el@server /home/el $ LOL="so wow much code"
      el@server /home/el $ set | grep LOL
      LOL='so wow much code'
      el@server /home/el $ exec bash
      el@server /home/el $ set | grep LOL
      el@server /home/el $
      

      您也可以只取消设置一个变量:

      el@server /home/el $ LOL="so wow much code"
      el@server /home/el $ set | grep LOL
      LOL='so wow much code'
      el@server /home/el $ unset LOL
      el@server /home/el $ set | grep LOL
      el@server /home/el $
      

      局部变量 LOL 不见了。

      将局部变量提升为环境变量:

      el@server /home/el $ DOGE="such variable"
      el@server /home/el $ export DOGE
      el@server /home/el $ set | grep DOGE
      DOGE='such variable'
      el@server /home/el $ env | grep DOGE
      DOGE=such variable
      

      请注意,导出使其同时显示为局部变量和环境变量。

      上面导出的变量 DOGE 在 Bash 重置后仍然存在:

      el@server /home/el $ exec bash
      el@server /home/el $ env | grep DOGE
      DOGE=such variable
      el@server /home/el $ set | grep DOGE
      DOGE='such variable'
      

      取消设置所有环境变量:

      你必须拿出一罐 Chuck Norris 来重置所有环境变量,而无需注销/登录:

      el@server /home/el $ export CAN="chuck norris"
      el@server /home/el $ env | grep CAN
      CAN=chuck norris
      el@server /home/el $ set | grep CAN
      CAN='chuck norris'
      el@server /home/el $ env -i bash
      el@server /home/el $ set | grep CAN
      el@server /home/el $ env | grep CAN
      

      您创建了一个环境变量,然后重置终端以摆脱它们。

      或者您可以像这样手动设置和取消设置环境变量:

      el@server /home/el $ export FOO="bar"
      el@server /home/el $ env | grep FOO
      FOO=bar
      el@server /home/el $ unset FOO
      el@server /home/el $ env | grep FOO
      el@server /home/el $
      

      【讨论】:

        【解决方案4】:

        VAR=value 将 VAR 设置为值。

        之后export VAR 也会将其提供给子进程。

        export VAR=value 是两者的简写。

        【讨论】:

        • 它不是把它交给父进程,而不是子进程吗?如果一个 shell 脚本进行了导出,那么我调用它的 shell 就有那个变量 IIRC。
        • 没有。 “被标记为自动导出到随后执行的命令的环境中。”,表示导出后执行的子进程。
        • 出于好奇,引用来自哪里?
        【解决方案5】:

        我认为您正在寻找export - 虽然我可能是错的.. 我以前从未玩过 tcsh。使用以下语法:

        export VARIABLE=value
        

        【讨论】: