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 для запуска команд tmux и issue
  • автоматизация конфигурации CentOS 7 с использованием сценариев оболочки
  • Использование awk для объединения двух файлов csv на три поля также создает новый файл csv
  • Перенаправление stdout игнорирует строки без символа перевода строки
  • Неверный код выхода awk
  • Выполнять команду на нескольких секундах параллельно с помощью сценария оболочки
  • 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

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

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

    Постоянное решение: файлы, строки без добавления \ n в командной строке

    как выполнить команду bash в скрипте python

    Как распечатать текущие ключевые слова в Linux / Debian?

    Текстовый файл в полях (столбцах) каждого n-го вхождения строки

    Удалить заголовок в результатах журнала

    Защита постфикса от атак с использованием bruteforce

    Как сопоставить ключ ALT в .vimrc?

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

    Почему возникает ошибка при двойном цитировании одинарных кавычек в скрипте, который запускает удаленную команду SSH?

    Текущее состояние графического драйвера AMD для Linux?

    Монитор Fedora 20 мерцает / трепещет

    Правила IPSET игнорируются (CentOS 7)

    Как найти файл в пакетах apk

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