У меня есть 2 сценария оболочки, file1.sh и file2.sh
file1.sh
#!/usr/bin/env bash
export var1="/data/share"
export var2='password'
echo "Hello"
file2.sh
#!/usr/bin/env bash
source file1.sh
echo $var1
echo $var2
Когда я выполняю file2.sh, я получаю следующий вывод
Hello
/data/share
password
Но мой ожидаемый результат
/data/share
password
file1.sh выполняется, когда указано в file2.sh. Как мне импортировать только переменные в file2.sh без выполнения file1.sh?
linux
command-line
bash
shell
shell-script
Mathew
источник
источник
source
значит выполнить. Наиболее очевидное решение - поместить определения переменных в файл конфигурации и использовать их в обоих сценариях.[[ $1 == "SourceIt" ]] & echo "Hello"
после этого вы можете получить var из скрипта. Используйте это как это/path/of/file.sh SourceIt
Ответы:
Есть три варианта, которые я использую, когда у меня есть bash-скрипт, который я хочу вести себя по-разному, когда он получен по сравнению с тем, когда он выполняется (или другими словами, есть элементы данных в скрипте, к которым я хочу получить доступ без выполнения какого-либо кода при этом время). Комментарии затронули их до некоторой степени.
Вариант первый
Определить, когда получен источник, и завершить поиск источников в подходящее время.
Разделяйте сценарий на два раздела, выходите из сценария при получении перед тем, как перейти на второй
Создайте верхнюю часть скрипта с определениями (функции / назначения переменных / и т. Д.), Но без прямого выполнения кода.
Непосредственно перед началом секции исполняемого кода разместите логику, которая будет выходить из скрипта, если он обнаружит, что он получен. Следующий сегмент кода сделает это:
file1.sh
file2.sh
Выход работает ./file2.sh
Вариант второй
Этот обычно используется только в сложных ситуациях, и для этого конкретного примера это излишне. Я создаю в файле функцию, которую хочу получить, и в этой функции определяю, что должно быть доступно вызывающей стороне. В данном случае это две экспортируемые переменные. Обычно я использую этот режим, когда у меня есть ассоциативные массивы, которые иначе практически невозможно передать. Кроме того, файл tmp должен быть удален вызывающей стороной; но я не сделал в этом случае:
file1.sh
file2.sh
Результат выполнения file2.sh такой же, как и выше
Вариант 3
Последний общий способ, которым я справляюсь, это просто с библиотечным файлом, который содержит только определения, и не имеет никакого кода, который будет выполняться при получении или непосредственном запуске. Это просто вопрос разделения вашего кода. У меня есть группа библиотек bash, которые содержат часто используемые функции, и для каждого проекта обычно устанавливают небольшую исходную библиотеку для хранения данных конфигурации (констант). Если эти данные включают заполненные массивы, я также буду использовать версию Варианта 2.
источник
Если ваши переменные экспортируются одинаково ( export foo = bar ), то вы можете легко найти их все, используя удар особенность процесса замены:
Извлечение справочной страницы:
источник