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

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)
Том
возможный дубликат сохранения глобальных переменных BASH
tripleee 01
Возможный дубликат экспорта не работает в моем сценарии оболочки
пользователь

Ответы:

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

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

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

mbaird
источник
2
с использованием source ./setenv.sh -: выдает ошибку "Источник не найден". и используя. ./setenv.sh не может открыть setenv.sh. Не могли бы вы помочь мне в этом. Спасибо
Vishal
1
чесал голову в течение часа, почему эти чертовы экспортные вары не пробовали (zsh) typeset -gx, экспортируют и т.д. момент и все же - не знал, что подоболочка выполняется с собственной областью видимости. спасибо за спасение моего дня от надвигающегося гнева, промах-менеджмент
Inoperable
1

Запустите сценарий как source = для запуска в режиме отладки.

source= ./myscript.sh
Анураг Мондаль
источник
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