如何写一个bash脚本设置全局环境变量?(How to write a bash script to

2019-06-28 03:26发布

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

#!/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可用只是在本地,我的意思是在控制台窗口,在这里我跑了剧本。

如何写一个脚本,让我出口的全球环境变量,随处可见?

Answer 1:

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

它甚至更严格。 如果一个壳产生一个子shell,子shell访问父的环境变量,但如果子shell创建一个环境变量,它不是在父shell访问。

如果你所有的炮弹都需要访问相同的变量,你可以创建一个将它们设置为你的启动文件。 这是在BASH通过做$HOME/.bash_profile$HOME/.bashrc的文件,并通过$HOME/.profile ,如果$HOME/.bash_profile不存在)。 其他炮弹有自己的一套的启动文件。 一个用于登录,另一个用于不登录催生了炮弹。 请参阅手册页,了解究竟是用来启动脚本和他们正在执行什么样的顺序)。

您可以尝试使用共享内存,但我相信,只有当进程正在运行的工作,因此,即使你想出一个办法来设置一块共享内存,其将尽快为命令完成走开。 (我很少使用的共享内存命名管道除外)。 否则,真的没有办法自动设置在一个外壳的环境变量,并有另一种外壳把它捡起来。 您可以尝试使用命名管道或编写环境变量为其他炮弹文件把它捡起来。

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



Answer 2:

只要运行前面有你的shell脚本“ ”(点间隙)。 .

这将导致脚本运行在原来的壳中的说明。 因此,该变量的脚本完成后仍然存在

例如:

cat setmyvar.sh
export myvar=exists

. ./setmyvar.sh

echo $myvar
exists


Answer 3:

你必须添加变量在.profile位于/home/$USER/.profile

哟可以做到这一点下面的命令:

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

或者通过编辑与emacs的文件,例如。 如果你想使用这个变量为所有用户,你必须编辑/ etc / profile文件(根)



Answer 4:

下面分别从戴维W的回答第二个段落中提取:“如果一个壳产生一个子shell,子shell访问父的环境变量,但如果子shell创建一个环境变量,它不是在父shell访问。 “

如果用户需要让父shell访问您的新的环境变量,只是问题父shell下面的命令:

source <your_subshell_script>

或者使用快捷键

. <your_subshell_script>


Answer 5:

没有全球的环境,真的,在UNIX。

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

您只能修改自己的,除非你去使用调试器的过程中四处。



Answer 6:

环境变量始终是“本地”,以流程执行export命令允许设置环境变量的子流程。 你可以看一下的.bashrc在bash shell中开始设置环境变量。 作为一个过程不能修改另一个进程的环境变量(或访问?)你正在尝试做的似乎是不可能的。



Answer 7:

您可以更新这是用来初始化环境的〜/ .bashrc或者〜/ .bash_profile文件中。



Answer 8:

看看你的shell的装载行为(在联机帮助解释,通常是指.XXXshrc或.profile)。 一些配置文件在交互的shell的登录时间被加载,有些是每次运行shell的时候加载。 后者将您的变量可能会导致你想要的,比如总是有使用不同的外壳(例如bash)的变量集合的行为。



Answer 9:

如果您需要在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


Answer 10:

~/.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


Answer 11:

写入到一个临时文件,可以说〜/ .myglobalvar从任何地方阅读

echo "$myglobal" > ~/.myglobalvar


Answer 12:

其实我发现了一个方法来实现这一目标(这在我的情况是使用bash脚本设置一些安全证书)

我只是调用bash从脚本内部和催生壳现在有出口值

export API_USERNAME=abc
export API_PASSWORD=bbbb
bash

现在要求使用文件~/.app-x-setup.sh会给我一个交互式的外壳与环境的值设置



文章来源: How to write a bash script to set global environment variable?