Сценарий оболочки для установки переменных среды


84

Я хочу написать сценарий оболочки для экспорта переменных.

Ниже я перечислил сценарий.

echo "Perform Operation in su mode"
export ARCH=arm
echo "Export ARCH=arm Executed"
export PATH='/home/linux/Practise/linux-devkit/bin/:$PATH';
echo "Export path done"
export CROSS_COMPILE='/home/linux/Practise/linux-devkit/bin/arm-arago-linux-gnueabi-';
echo "Export CROSS_COMPILE done"

Но, похоже, это не работает должным образом. Вместо этого я должен индивидуально выполнять команды в приглашении оболочки.


Какую оболочку вы используете (например, bash, ksh, sh)
Том



Ответы:


49

Пожалуйста, покажите нам больше частей скрипта и расскажите, какие команды вам нужно было выполнить индивидуально и которые вы хотите просто выполнить.

Между тем вы должны использовать двойные кавычки, а не одиночные кавычки, чтобы раскрыть переменные:

export PATH="/home/linux/Practise/linux-devkit/bin/:$PATH"

Точки с запятой в конце одной команды также не нужны.

Слишком далеко:

#!/bin/sh
echo "Perform Operation in su mode"
export ARCH=arm
echo "Export ARCH=arm Executed"
export PATH="/home/linux/Practise/linux-devkit/bin/:$PATH"
echo "Export path done"
export CROSS_COMPILE='/home/linux/Practise/linux-devkit/bin/arm-arago-linux-gnueabi-' ## What's next to -?
echo "Export CROSS_COMPILE done"
# continue your compilation commands here
...

Ибо suвы можете запустить его с помощью:

su -c 'sh /path/to/script.sh'

Примечание. OP явно не запрашивал шаги по созданию переменных экспорта в интерактивной оболочке с помощью сценария оболочки. Он только попросил, чтобы его сценарий был оценен по максимуму. Он не упомянул подробностей о том, как будет использоваться его сценарий. Это могло быть с помощью интерактивной оболочки .или sourceиз нее . Это мог быть отдельный скрипт, или он мог быть взят sourceиз другого скрипта. Переменные среды не относятся к интерактивным оболочкам. Этот ответ решил его проблему.


1
Привет, консольбокс !! Большое спасибо . но я не понимал разницы .. export PATH = "/ home / linux / Practice / linux-devkit / bin /: $ PATH" в двойных кавычках. & export CROSS_COMPILE = '/ home / linux / Practice / linux-devkit / bin / arm-arago-linux-gnueabi-' в одинарных кавычках. сценарий, измененный u, работает нормально.
Prag Rao,

@PragRao Расширение Paramater просто не происходит в одинарных кавычках. Вы можете подробнее рассказать о цитировании здесь .
konsolebox

3
Название вопроса @konsolebox звучит как «Сценарий оболочки для установки переменных окружения» - большая часть сообщества нашла этот вопрос только для решения проблемы запуска этого вида скрипта из текущей оболочки ( sourceили .). Я ценю, что вы отвечаете именно на вопрос OP, но я нашел эту тему в Google, и следующий ответ помог мне больше, чем ваш. Upvotes для второго ответа (с sourceи .подтвердить мое мнение ...
avtomaton

@avtomaton Опять же, дело не в людях, которые находят это в Google. Дело только в оригинальном подходе к вопросу. Если у вас есть сомнения по поводу того, как следует изменить вопрос или как должен быть представлен ответ, подумайте о том, чтобы обсудить его в мета.
konsolebox 02

230

Вам нужно запустить скрипт как sourceили сокращение.

source ./myscript.sh

или же

. ./myscript.sh

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

Запуск сценария с использованием имени файла приведет к его выполнению в отдельной подоболочке.


2
с использованием source ./setenv.sh -: выдает ошибку "Источник не найден". и используя. ./setenv.sh не может открыть setenv.sh. Не могли бы вы помочь мне в этом. Спасибо
Vishal

1
чесал голову в течение часа, почему эти чертовы экспортные вары не пробовали (zsh) typeset -gx, экспортируют и т.д. момент и все же - не знал, что подоболочка выполняется с собственной областью видимости. спасибо за спасение моего дня от надвигающегося гнева, промах-менеджмент
Inoperable


0

Я не могу решить это с помощью source ./myscript.sh. В нем говорится, что источник не найден.
Не удалось также при использовании . ./myscript.sh. Это не может открыть myscript.sh.

Так что мой вариант - поместить его в текстовый файл, который будет вызываться в следующем скрипте.

#!/bin/sh
echo "Perform Operation in su mode"
echo "ARCH=arm" >> environment.txt
echo "Export ARCH=arm Executed"
export PATH="/home/linux/Practise/linux-devkit/bin/:$PATH"
echo "Export path done"
export "CROSS_COMPILE='/home/linux/Practise/linux-devkit/bin/arm-arago-linux-gnueabi-' ## What's next to -?" >> environment.txt
echo "Export CROSS_COMPILE done"
# continue your compilation commands here
...

Вызывайте его всякий раз, когда это необходимо:

while read -r line; do
    line=$(sed -e 's/[[:space:]]*$//' <<<${line})
    var=`echo $line | cut -d '=' -f1`; test=$(echo $var)
    if [ -z "$(test)" ];then eval export "$line";fi
done <environment.txt

1
Вы можете изменить myscript.shтак, чтобы он генерировал файл с именем environment.sh(с операторами экспорта), а затем просто source environment.shвместо цикла while, когда это необходимо.
slajma 02
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.