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

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

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

  • Как grep аргумент командной строки, на который был применен RegEx?
  • Использовать терминал в качестве доски
  • удалить пробелы из всех элементов в каталоге и подкаталоге
  • экспортировать HTTP_PROXY и специальные символы в passwd
  • экранная подошва для каждого окна
  • bash alias, начинающийся с pipe, не работает?
  • Файл содержит переменные с именем 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 

  • В чем разница между объявлением и набором
  • Почему я не могу использовать `kill $!` С расширением параметра в Bash, когда самый последний процесс «уведомлять-отправлять»?
  • Подключение через telnet и выполнение определенных операций
  • Подстановочный знак Bash для соответствия точно n символам
  • получить выходное и возвращаемое значение grep в одной операции в bash
  • вернитесь к концу истории bash при использовании обратного поиска?
  • 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 - лучшая ОС в мире.