2013-04-26 74 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