2013-04-26 1 views
0

Когда я запускаю команду 'set' в оболочке bash, я вижу, что переменная имеет значение. Однако, когда я запускаю команду set в скрипте bash, переменная не существует. Зачем? Как я могу это сделать?в bash, почему переменная видима в оболочке, но не в сценарии оболочки

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

Мой сценарий оболочки 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# ./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

+1

обычно при запуске сценария он работает в подоболочках. поэтому после его выхода все изменения теряются. Чтобы запустить его в текущей оболочке, запустите его как '. script.sh', и он будет запущен в текущей оболочке. это исправляет проблему? иначе как @Useless сказал, например, пожалуйста, – Doon

+0

@Doon: Это исправило это. Но я смущен, почему. Я думал. был синонимом источника данного файла. Думаю, это имеет смысл. Исходный файл, начинающийся с #!/Bin/bash, запускает скрипт. Имеет ли это смысл? –

ответ

0

Это потому, что сценарий оболочки запускается в отдельном процессе с отдельной средой от вызывающего. Вы хотите использовать 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

Не могли бы вы добавить пример? –

2

Некоторые (но не обязательно все) переменные оболочки маркируются для экспорта в среду. Только эти переменные видны в дочернем процессе (например, сценарии оболочки). Например:

$ 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 будет работать в новая оболочка, которая поднимает оригинальную проблему. Мне нужно что-то в существующей оболочке, чтобы быть доступным в подчиненном сценарии оболочки, и единственный способ сделать это - либо передать его так, как было предложено hd1 ниже, либо использовать его, как было предложено Doon. –

Смежные вопросы