Shell脚本设置环境变量


82

我希望编写一个Shell脚本来导出变量。

下面我列出了脚本。

echo "Perform Operation in su mode"
export ARCH=arm
echo "Export ARCH=arm Executed"
export PATH='/home/linux/Practise/linux-devkit/bin/:$PATH';
echo "Export path done"
export CROSS_COMPILE='/home/linux/Practise/linux-devkit/bin/arm-arago-linux-gnueabi-';
echo "Export CROSS_COMPILE done"

但这似乎无法正常工作。我必须改为在shell提示符下单独执行命令。


您使用的是哪个shell(例如bash,ksh,sh)
Tom



可能的导出
用户

Answers:


48

请向我们展示脚本的更多部分,并告诉我们您必须分别执行和希望简单执行的命令。

同时,您必须使用双引号而不是单引号来扩展变量:

export PATH="/home/linux/Practise/linux-devkit/bin/:$PATH"

在单个命令末尾也不需要分号。

至今:

#!/bin/sh
echo "Perform Operation in su mode"
export ARCH=arm
echo "Export ARCH=arm Executed"
export PATH="/home/linux/Practise/linux-devkit/bin/:$PATH"
echo "Export path done"
export CROSS_COMPILE='/home/linux/Practise/linux-devkit/bin/arm-arago-linux-gnueabi-' ## What's next to -?
echo "Export CROSS_COMPILE done"
# continue your compilation commands here
...

对于su您可以运行它:

su -c 'sh /path/to/script.sh'

注意:OP并未明确要求有关如何使用Shell脚本在交互式Shell中创建导出变量的步骤。他只要求对脚本进行最多评估。他没有提及有关如何使用其脚本的细节。可以通过使用.source来自交互式外壳来实现。它可能是一个独立的脚本,也可能是source来自另一个脚本。环境变量并非特定于交互式外壳。这个答案解决了他的问题。


1
嗨konsolebox!非常感谢你 。但是我不明白区别.. export PATH =“ / home / linux / Practise / linux-devkit / bin /:$ PATH”用双引号引起来。&导出CROSS_COMPILE ='/ home / linux / Practise / linux-devkit / bin / arm-arago-linux-gnueabi-'用单引号引起来。你修改的脚本工作正常。
Prag Rao

@PragRao Paramater扩展根本不会用单引号引起。您可以在此处解释有关进一步报价的详细信息
konsolebox

3
@konsolebox的问题名称听起来像是“用于设置环境变量的Shell脚本”-社区的大部分人都发现了这个问题,只是为了解决从当前Shell(source.)运行这种脚本的问题。非常感谢您回答关于OP的问题,但我从Google找到了这个主题,下一个答案对我的帮助比对您的帮助大。赞成第二个答案(source.确认我的观点……
avtomaton

@avtomaton再次强调,与在Google上找到它的人无关。这只是关于问题的原始方法。如果您对如何更改问题或如何给出答案有疑问,请考虑在meta中进行讨论。
konsolebox

225

您需要以source或速记运行脚本.

source ./myscript.sh

要么

. ./myscript.sh

这将在现有外壳程序中运行,确保脚本完成后,由脚本创建或修改的任何变量均可用。

仅使用文件名运行脚本将在单独的子shell中执行脚本。


2
通过使用source ./setenv.sh-:给出未找到源的错误。并使用。./setenv.sh它不能打开setenv.sh。你能帮我这个忙吗?谢谢
维沙尔2015年

1
为什么要挠头一个小时,为什么那些该死的出口vars arent(zsh)尝试typeset -gx,出口等等,并拥有我的wtf?片刻而尚未-不知道子shell是用自己的作用域执行的。由于从即将到来的愤怒小姐管理救了我的一天
不能手术


0

我无法用解决source ./myscript.sh。它说源未找到错误。
使用时也失败. ./myscript.sh。它给出了无法打开myscript.sh的信息。

因此,我的选择是将其放在一个文本文件中,以在下一个脚本中调用。

#!/bin/sh
echo "Perform Operation in su mode"
echo "ARCH=arm" >> environment.txt
echo "Export ARCH=arm Executed"
export PATH="/home/linux/Practise/linux-devkit/bin/:$PATH"
echo "Export path done"
export "CROSS_COMPILE='/home/linux/Practise/linux-devkit/bin/arm-arago-linux-gnueabi-' ## What's next to -?" >> environment.txt
echo "Export CROSS_COMPILE done"
# continue your compilation commands here
...

可以在需要时调用它:

while read -r line; do
    line=$(sed -e 's/[[:space:]]*$//' <<<${line})
    var=`echo $line | cut -d '=' -f1`; test=$(echo $var)
    if [ -z "$(test)" ];then eval export "$line";fi
done <environment.txt

1
您可以进行修改myscript.sh,以使其生成一个名为environment.sh(带有export语句)的文件,然后仅environment.sh在需要时才使用source而不是while循环。
slajma
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.