2015-05-12 5 views
0

Я бег следующего простого кода в скрипте, но похоже, что не может экспортировать переменный:Переменные не получает экспортироваться

#!/bin/bash 
echo -n "Enter AWS_ACCESS_KEY_ID: " 
read aws_access_key 
export AWS_ACCESS_KEY_ID=$aws_access_key 

После этого я беру входной сигнал от пользователя, но, когда я run echo $ AWS_ACCESS_KEY_ID Я получаю пустое значение.

+2

Если вы эхо от родительской оболочки (то есть той, которая запускала './Your-script.sh'), которая не будет/не может работать. Вы можете экспортировать переменную * вверх * в дерево процессов. В этом скрипте он должен работать. –

+0

Есть только одна оболочка, которую я запускаю, и я пытаюсь выполнить эхо сразу после запуска этих трех строк. –

+0

@IshuGupta, неправильно: при запуске скрипта (без использования 'source' или его синтаксиса, совместимого с POSIX' .'), запускается вторая оболочка, которая выходит, когда скрипт выполняет. Таким образом, когда этот скрипт выходит, его переменные больше недоступны. –

ответ

3

Выполнить скрипт в текущей оболочке с помощью:

source your-script # this runs your-script in the existing shell 

... или, при использовании POSIX оболочки ...

. your-script  # likewise; that space is intentional! 

не

./your-script  # this starts a new shell just for `your-script`; its variables 
        # are lost when it exits! 

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


Чтобы быть ясно, export помещает переменную в среде текущего процесса - но переменные среды распространяются вниз в дочерние процессы, а не до родительских процессов.


Теперь, если ваша цель состоит в том, чтобы определить интерактивную команду, которую легко вызвать, вы можете рассмотреть совершенно иной подход в целом - положить функцию в .bashrc:

awsSetup() { 
    echo -n "Enter AWS_ACCESS_KEY_ID: " 
    read && [[ $REPLY ]] && export AWS_ACCESS_KEY_ID=$REPLY 
} 

. .., после чего пользователь с этим в своем .bashrc может запустить awsSetup, который будет работать в текущей оболочке.

+1

@ammoQ, действительно. Я предпочитаю багизм здесь, поскольку слишком много людей читают '. foo' в качестве опечатки для './foo', но стоит хотя бы указать форму POSIX. –

+0

Есть ли способ сделать это в текущем процессе? –

+1

@IshuGupta, вот почему я указываю форму 'source'. –

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