2013-10-27 53 views
9

我想从我的bash脚本的环境变量源,但它不起作用。如何从bash脚本源文件

这是我的脚本的内容(test.sh),它位于~/scripts/test.sh

#!/bin/bash 
FILE_NAME=/tmp/source_file 
touch $FILE_NAME 
echo "export TEST=\"test\"" > $FILE_NAME 
source $FILE_NAME 

然后我my ~/.bashrc使用alias

alias testScript=~/scripts/test.sh 

但是,当我使用我的脚本testScript,它没有设置环境变量。

+0

?你的预期结果是什么? – 2013-10-27 18:00:49

+0

当我尝试echo $ TEST时,我没有看到任何值 – franki3xe

+0

文件'/ tmp/source_file'是否包含您期望的内容? – 2013-10-27 18:02:57

回答

9

环境变量只在流程树中向下游流动。

当你键入testScript到bash进程,它会创建一个子进程和高管/bin/bash或任何由#!

设置任何环境变量设置有只与子进程仍然存在。导出会导致将变量复制到可能从该子项产生的其他子孙(该子项的子项)。

没有东西可以复制回父母。您需要使用源文件而不是运行该文件。看乔纳森的答案。

您可以尝试编辑文件~/.bashrc~/.login以设置您需要频繁使用的环境变量。

另请参阅https://superuser.com/q/153371https://superuser.com/questions/18988/difference-between-a-b-and-export-a-b-in-bash关于export的更多解释请参见bash

9

您需要使用:

alias testScript=". ~/scripts/test.sh" 

到源文件。或者您可以使用source代替.,但我不太喜欢C shell,所以我不使用C shell外壳符号,例如source

+0

这正是我需要的 - 谢谢。 Upvoted –

3

无其他方法为我工作[source /path/to/file VS . ./path/to/file,别名,等等],直到,由于this tutorial我发现,使用:

#!/usr/bin/env bash家当

代替简单的#!/usr/bin/env可以让参数传递给解释器,我认为这里是关键 - 有关更多信息,请参阅this document

在任何情况下,如果任何形式的源命令不适合您,请检查你的家当,这可能是你的“它没有设置环境变量”的意思的问题:)