57

最近我写了一个设置环境变量的脚本,看看:

#!/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"

它工作得很好,但问题是它my_var只能在本地使用,我的意思是在我运行脚本的控制台窗口中。

如何编写允许我导出随处可见的全局环境变量的脚本?

4

13 回答 13

144

只需运行前面带有“ .”(点空间)的 shell 脚本。

这会导致脚本在原始 shell 中运行指令。因此脚本完成后变量仍然存在

前任:

cat setmyvar.sh
export myvar=exists

. ./setmyvar.sh

echo $myvar
exists
于 2014-05-29T15:22:05.613 回答
51

每个 shell 都有自己的环境。没有通用环境会神奇地出现在所有控制台窗口中。在一个 shell 中创建的环境变量不能在另一个 shell 中访问。

它甚至更加严格。如果一个 shell 生成了一个子 shell,则该子 shell 可以访问父 shell 的环境变量,但如果该子 shell 创建了一个环境变量,则无法在父 shell 中访问它。

如果您的所有 shell 都需要访问同一组变量,您可以创建一个启动文件来为您设置它们。这是在 BASH 中通过$HOME/.bash_profile文件(或通过$HOME/.profile如果$HOME/.bash_profile不存在)或通过$HOME/.bashrc. 其他 shell 有自己的一组启动文件。一个用于登录,一个用于在没有登录的情况下生成的 shell(和 bash 一样,第三个用于非交互式 shell)。请参阅手册页以准确了解使用了哪些启动脚本以及它们的执行顺序)。

您可以尝试使用共享内存,但我相信只有在进程运行时才有效,因此即使您找到了设置共享内存的方法,它也会在该命令完成后立即消失。(除了命名管道,我很少使用共享内存)。否则,真的没有办法在一个 shell 中设置环境变量并让另一个 shell 自动拾取它。您可以尝试使用命名管道或将该环境变量写入文件以供其他 shell 获取。

想象一下,如果有人可以在我不知情的情况下更改一个 shell 的环境,可能会发生什么问题。

于 2012-09-10T14:01:23.467 回答
7

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

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

export API_USERNAME=abc
export API_PASSWORD=bbbb
bash

现在调用该文件~/.app-x-setup.sh将为我提供一个带有这些环境值设置的交互式外壳

于 2017-02-20T10:07:18.530 回答
4

您必须在位于 /home/$USER/.profile 的 .profile 中添加变量

哟可以用这个命令做到这一点:

echo 'TEST="hi"' >> $HOME/.profile

例如,或者通过使用 emacs 编辑文件。如果要为所有用户设置此变量,则必须编辑 /etc/profile (root)

于 2012-09-10T12:38:28.530 回答
3

实际上,在 UNIX 中没有全局环境。

每个进程都有一个环境,最初是从父进程继承的,但在初始创建后它是进程本地的。

您只能修改自己的,除非您使用调试器在过程中进行挖掘。

于 2012-09-10T12:33:23.340 回答
3

以下内容摘自 David W. 的回答的第 2 段:“如果一个 shell 生成一个子 shell,则该子 shell 可以访问父 shell 的环境变量,但如果该子 shell 创建了一个环境变量,则它在父 shell 中是不可访问的。 "

如果用户需要让父 shell 访问您的新环境变量,只需在父 shell 中发出以下命令:

source <your_subshell_script>

或使用快捷方式

. <your_subshell_script>
于 2014-11-05T23:59:07.527 回答
3

将它写入一个临时文件,比如说 ~/.myglobalvar 并从任何地方读取它

echo "$myglobal" > ~/.myglobalvar
于 2017-01-16T02:11:20.520 回答
2

环境变量对于进程执行总是“本地”的,导出命令允许为子进程设置环境变量。您可以查看 .bashrc 以在 bash shell 的开头设置环境变量。您尝试做的事情似乎不可能,因为一个进程无法修改(或访问?)另一个进程的环境变量。

于 2012-09-10T12:33:43.453 回答
1

看看你的 shell 的加载行为(在手册页中有解释,通常是指 .XXXshrc 或 .profile)。一些配置文件在交互式 shell 的登录时加载,一些配置文件在每次运行 shell 时加载。将您的变量放在后者中可能会导致您想要的行为,例如始终使用该不同的shell(例如bash)设置变量。

于 2012-09-10T12:39:35.883 回答
1

~/.bin/SOURCED/lazy脚本将数据保存和加载为系统的平面文件。

[ ! -d ~/.megadata ] && mkdir ~/.megadata

function save_data {
[ -z "$1" -o -z "$2" ] && echo 'save_data [:id:] [:data:]' && return
local overwrite=${3-false}
[ "$overwrite" = 'true' ] && echo "$2" > ~/.megadata/$1 && return
[ ! -f ~/.megadata/$1 ]   && echo "$2" > ~/.megadata/$1 || echo ID TAKEN set third param to true to overwrite
}

save_data computer engine
cat ~/.megadata/computer
save_data computer engine
save_data computer megaengine true

function get_data {
[ -z "$1" -o -f $1 ] && echo 'get_data [:id:]' && return


[ -f ~/.megadata/$1 ]   && cat ~/.megadata/$1 || echo ID NOT FOUND
:
}

get_data computer
get_data computer
于 2013-06-29T03:11:09.260 回答
1

如果您需要在 shell 脚本中动态设置和引用环境变量,有一种变通方法。自己判断是否值得做,但在这里。

该策略涉及拥有一个“设置”脚本,该脚本动态编写一个“加载”脚本,该脚本具有设置和导出环境变量的代码。然后,需要引用该变量的其他脚本会定期执行“加载”脚本。顺便说一句,可以通过写入和读取文件而不是变量来完成相同的策略。

这是一个简单的例子......

Set_Load_PROCESSING_SIGNAL.sh

#!/bin/bash
PROCESSING_SIGNAL_SCRIPT=./Load_PROCESSING_SIGNAL.sh
echo "#!/bin/bash" > $PROCESSING_SIGNAL_SCRIPT
echo "export PROCESSING_SIGNAL=$1" >> $PROCESSING_SIGNAL_SCRIPT
chmod ug+rwx $PROCESSING_SIGNAL_SCRIPT

Load_PROCESSING_SIGNAL.sh (在上面运行时动态创建)

#!/bin/bash
export PROCESSING_SIGNAL=1

您可以使用 Test_PROCESSING_SIGNAL.sh 对此进行测试

#!/bin/bash
PROCESSING_SIGNAL_SCRIPT=./Load_PROCESSING_SIGNAL.sh
N=1
LIM=100
while [ $N -le $LIM ]
do
# DO WHATEVER LOOP PROCESSING IS NEEDED
echo "N = $N"
sleep 5
N=$(( $N + 1 ))

# CHECK PROCESSING_SIGNAL
source $PROCESSING_SIGNAL_SCRIPT
if [[ $PROCESSING_SIGNAL -eq 0 ]]; then
# Write log info indicating that the signal to stop processing was detected
# Write out all relevent info
# Send an alert email of this too
# Then exit
echo "Detected PROCESSING_SIGNAL for all stop. Exiting..."
exit 1
fi
done
于 2013-10-04T14:35:32.687 回答
1

您可以更新用于初始化环境的 ~/.bashrc 或 ~/.bash_profile 文件。

于 2012-09-10T12:38:12.437 回答
0

也许有点跑题了,但是当你真的需要它来临时设置它来执行一些脚本并最终在这里寻找答案时:

如果您需要运行具有某些环境变量的脚本,而这些环境变量在执行后不需要保留,您可以执行以下操作:

#!/usr/bin/env sh

export XDEBUG_SESSION=$(hostname);echo "running with xdebug: $XDEBUG_SESSION";$@

在我的示例中,我只是将 XDEBUG_SESSION 与主机名一起使用,但您可以使用多个变量。用分号将它们分开。执行如下(假设您调用了脚本 debug.sh 并将其放在与您的 php 脚本相同的目录中):

$ debug.sh php yourscript.php
于 2021-05-28T18:41:36.613 回答