Почему мой простой скрипт bash не работает?


1

Я просто пишу простой Bash-скрипт на CentOS 6.2:

[root@hadoop1 ~]# vi bash_startup

#! /bin/bash
export r=1

Возвращение в командную строку: и запуск с использованием ./bash_startup

[root@hadoop1 ~]# echo $r

[root@hadoop1 ~]#

эхо не $rдает мне результата, почему?


Что происходит в вашем сценарии, если вы измените ! /bin/bash(что неверно) на #!/bin/bashправильный?
JakeGould

Ответы:


3

Изменения переменных среды в скрипте влияют только на вызывающую оболочку, если вы вызываете скрипт следующим образом:

. ./script.sh

Или же:

source ./script.sh

Не:

bash ./script.sh

Или же:

./script.sh

Это связано с тем, что первые два способа запускают сценарий в текущей оболочке, а два последних запускают подоболочку, а изменения переменных среды не распространяются вверх из подоболочек.


Как насчет этого ! /bin/bash. Разве это не должно быть #!/bin/bash? То, что вы говорите, правильно, но, похоже, у этого скрипта есть несколько проблем.
JakeGould

1
@JakeGould Хотя это действительно неправильно, я не думаю, что это имеет отношение к проблеме, о которой спрашивает OP.
Джозеф Сибл

1
Довольно актуально. ! /bin/bashбудет работать bashи отрицать свой статус выхода. Эта новая оболочка на первый взгляд может быть неотличима от старой. ОП может подумать, что все было получено, и попробовать echo $r; он вернет пустую строку, как будто ваше решение ничего не изменило. export r=1будет получен в старой оболочке только после выхода из новой оболочки.
Камиль Мачоровский

1
@Mat В ответе явно сказано, что вы должны исходный файл, а не запускать его.
Камиль Мачоровски

1
Вы попробовали две точные команды, которые, как я сказал, не сработают.
Джозеф Сибл
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.