2013-04-26 52 views
0

当我在bash shell中运行'set'命令时,我看到一个变量有一个值。但是,当我在bash脚本中运行'set'命令时,变量不存在。为什么?我该如何做到这一点?在bash中,为什么变量在shell中可见,但不在shell脚本中

tmp.sh包含

#!/bin/bash 
svcid=`set | grep ^SERIAL_NUMBER | awk '{ split($1,a,"=");print a[2] }'` 
echo ${svcid} 

AxOS(7iq1) root:/mnt/ax/scratch/roshi# set 
--snip-- 
SERIAL_NUMBER=7iq1 
--snip-- 
AxOS(7iq1) root:/mnt/ax/scratch/roshi# 

我的shell脚本,如果我执行脚本如下,我没有得到任何输出

AxOS(7iq1) root:/mnt/ax/scratch/roshi# ./tmp.sh 

AxOS(7iq1) root:/mnt/ax/scratch/roshi# 

如果我执行脚本(首次提出Doon)

AxOS(7iq1) root:/mnt/ax/scratch/roshi# . ./tmp.sh 
7iq1 
AxOS(7iq1) root:/mnt/ax/scratch/roshi# 
+1

请发布一个(小)示例 – Useless 2013-04-26 18:29:05

+1

通常当您运行一个脚本它运行在一个子shell。所以一旦退出,所有更改都会丢失。在当前的shell中运行它就像''运行一样。 script.sh',它将在当前shell中运行。这是否解决了这个问题?否则就像@Useless说的那样,例如请 – Doon 2013-04-26 18:30:48

+0

@Doon:修正了它。但我为什么困惑。我以为。是给定文件的来源的同义词。我想这是有道理的。输入以#!/ bin/bash开头的当前文件,以便运行该脚本。那有意义吗? – 2013-04-26 18:50:23

回答

0

这是因为shell脚本在独立的进程中与调用者分开的环境运行。你想用env VAR=[value] [script-command]来解决这个问题。你问了一个例子,在这里你去:

% bash # I use zsh and this is a paste from the terminal 
$ echo "echo $VAR" > /tmp/echo.sh 
$ sh /tmp/echo.sh 

$ env VAR='hello' sh /tmp/echo.sh 
hello 
$ 
+0

你介意添加一个例子吗? – 2013-04-26 18:42:23

2

一些(但不一定是全部)的shell变量被标记为出口环境。只有这些变量在子进程中可见(例如shell脚本)。例如:

$ x=3   # shell variable 
$ export y=5 # shell variable exported to the environment 
$ cat example.sh 
echo "value of x: $x" 
echo "value of y: $y" 
$ bash example.sh 
example of x: 
example of y: 5 
+0

我的问题已经解决,所以谢谢你的反应。 ,但我却试着你有什么建议和似乎没有为我工作的唯一部分是 庆典example.sh 我可能是错的,但做这种方式,引起example.sh在一个运行新的外壳,这带来了原来的问题。我需要在现有shell中的某些东西在下面的shell脚本中可用,唯一的方法是按照hd1所提议的那样传递它,或者按照Doon的建议来源。 – 2013-04-26 19:16:45