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 

  • SSH для сервера, а также команды выполнения и печати
  • Как прекратить поиск «родительского» скрипта?
  • Получить PID создания файла
  • Задача SED, агрегирование строки, содержащей фигурные скобки
  • Сценарий Bash для автоматического резервного копирования tar выбранных файлов и каталогов
  • Перенаправление активного порта
  • Как получить код выхода grep, но распечатать все строки?
  • Оптимизируйте find -exec {} с несколькими условиями: конкретные файлы в каталоге и определенных подкаталогах в этом каталоге
  • 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[*]}") 

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

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

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

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

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

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