bash – источник, не загрязняя собственное пространство имен

Я хотел бы присвоить содержимое переменных другого скрипта bash переменным в вызывающем скрипте.

В частности, я source этот файл: https://projects.archlinux.org/svntogit/packages.git/plain/trunk/PKGBUILD?h=packages/firefox (и другие подобные файлы).

Файл содержит переменные с именем makedepends , makedepends и т. Д.

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

 depends="$(source "/path/to/file" ; printf '%s' "${depends[@]}")" makedepends="$(source "/path/to/file" ; printf '%s' "${makedepends[@]}")" ... 

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

Есть ли другой способ, который включает в себя запуск только одной части оболочки , исходный файл и получение содержимого указанных переменных файла, назначенного указанным переменным в вызывающей оболочке, без загрязнения среды вызывающей оболочки?

————————————————– ———————-

Поскольку Марк Манн указал на опасность source внешних сценариев, у меня появилось другое решение. Вместо использования source для получения переменных другого скрипта можно использовать многострочный grep с регулярным выражением perl для grep всех необходимых переменных из файла (varName = (…), varName2 = "…", varname3 = ' … ', varName4 = …) и eval результат:

 $ grepvars='(license)|(depends)|(makedepends)|(url)|(pkgdesc)|(pkgver)' $ $ eval $(grep -Pzo "^(${grepvars})=\([^\)\(\`]*\)|^(${grepvars})=\"[^\"\(\`]*\"|^(${grepvars})='\''[^'\'']*'\''|^(${grepvars})=[^\s;\(\`]*" /tmp/above_mentioned_file) $ echo $url https://www.mozilla.org/firefox/ $ $ echo ${depends[@]} gtk3 gtk2 mozilla-common libxt startup-notification mime-types dbus-glib alsa-lib ffmpeg2.8 desktop-file-utils hicolor-icon-theme libvpx icu libevent nss hunspell sqlite ttf-font 

  • Функция проверки переменной BASH
  • Проблема с переменной чтения от AWK
  • Как удалить файлы в одной папке, которая старше 60 дней в UNIX?
  • Заменить текст / строку новой строкой
  • Команда mv для перемещения и переименования набора файлов
  • Сравните файлы, которые находятся в каталоге 1, но не в каталоге 2?
  • Как я могу добавить и добавить к каждому члену массива?
  • fdupes - удалять файлы после сравнения двух каталогов
  • 2 Solutions collect form web for “bash – источник, не загрязняя собственное пространство имен”

    Используйте eval .

    Если у вас есть источник (в /tmp/other.sh):

     a=1 b=2 c=3 

    И вы хотите только часть, вы можете использовать eval для получения только этих элементов (здесь, в /tmp/main.sh):

     eval $(source /tmp/other.sh; echo a="$a"; echo b="$b";) echo a is $a "(expect 1)" echo b is $b "(expect 2)" echo c is $c "(expect nothing)" 

    И запустив его:

     $ bash /tmp/main.sh a is 1 (expect 1) b is 2 (expect 2) c is (expect nothing) 

    ПРЕДУПРЕЖДЕНИЕ : Выполнение eval или source на ненадежном скрипте очень опасно. Вы выполняете скрипт оболочки, и этот скрипт может выполнять все, что вы можете сделать самостоятельно. ПРЕДУПРЕЖДЕНИЕ

    Без использования eval вы все равно можете сделать это с помощью замены процесса, если вы используете bash или подобное:

     source <(source "/path/to/file" ; printf %s\\n "depends=${depends[*]}" "makedepends=${makedepends[*]}") 

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

    Это точно отвечает на следующую часть вашего вопроса:

    Есть ли другой способ, который включает в себя запуск только одной части оболочки, исходный файл и получение содержимого указанных переменных файла, назначенного указанным переменным в вызывающей оболочке, без загрязнения среды вызывающей оболочки?

    Но, конечно же, опасности использования внешних скриптов по-прежнему применяются. Не используйте источник ненадежного сценария.

    Если вы сами написали сценарий, и вы абсолютно уверены, что он не имеет побочных эффектов (и не производит никакого вывода), то вы можете использовать выше для своего персонального компьютера . Это не то, что должно быть в сценарии производства. Очень большое отверстие для безопасности.

    Interesting Posts

    Может только доступ к gvfs-mount в nautilus

    Как я могу получить доступ к удаленному открытому файлу в Linux (вывод запущенной задачи crontab)?

    Передача больших (8 ГБ) файлов по ssh

    Удалите дополнительные строки заголовков из файла, кроме первой строки

    Невозможно установить адрес mac для вызова интерфейса с помощью systemd-networkd

    Как перенаправить tty1 в оболочку Konsole X11 (KDE)?

    Минимальная команда для создания копии файла

    Исключение отдельных папок при копировании материалов из одного каталога в другой

    Включение или выключение подсветки клавиатуры

    Какую файловую систему использовать во встроенном статическом устройстве?

    выполнить удаленную команду sqlite

    Может ли OpenSSH 6.7 опционально не зависеть от OpenSSL?

    Archlinux 2014.04 64bit и проблема подключения при установке

    Как зашифровать git на моем сервере?

    строки отсутствуют после конкатенирования двух или более переменных строк в bash

    Linux и Unix - лучшая ОС в мире.