передача команды экспорта функции в сценарии оболочки

Установил oh-my-zsh и вроде все работает нормально. Задача решена.

3
29.08.2017, 02:32
1 ответ

Непонятно, что вы хотите сделать. $($@)не имеет смысла, но что вы хотите сделать вместо этого?

Что делает $($@):

  • Принимает аргументы функции. Это список строк.
  • Разделить каждую часть дальше, если она содержит пробелы¹.
  • Возьмите каждую расколотую часть и интерпретируйте ее как подстановочный шаблон. Если шаблон соответствует какому-либо файлу, замените фрагмент списком совпадающих имен файлов.
  • Используйте первую часть в качестве имени команды для выполнения (функции, встроенной оболочки или исполняемого файла), а остальные части передайте в качестве аргументов.
  • Возьмите вывод команды и разделите его там, где он содержит пробелы.
  • Возьмите каждую расколотую часть и интерпретируйте ее как подстановочный шаблон. Если шаблон соответствует какому-либо файлу, замените фрагмент списком совпадающих имен файлов.
  • Используйте первую часть в качестве имени команды для выполнения (функции, встроенной оболочки или исполняемого файла), а остальные части передайте в качестве аргументов.

Если это звучит сложно, это потому, что так оно и есть.

Если вы хотите, чтобы execute_cmd export MY_VAR=my_valвыполнял export MY_VAR=my_val, зачем вы вообще возитесь с execute_cmd?

Это можно толковать двумя способами.

  1. Вы хотите передать команду с параметрами функции. Команда с параметрами представляет собой список строк, первая из которых является именем функции, встроенной оболочкой или исполняемым файлом. Тогда синтаксис для вызова этой команды с предоставленными параметрами будет "$@".

     execute_cmd () {
     "$@"
    }
    execute_cmd экспорт MY_VAR=my_val
    

    Двойные кавычки позволяют избежать шагов разделения и раскрытия подстановочных знаков, о которых я упоминал выше. Всегда заключайте подстановки переменных в двойные кавычки.

    Также обратите внимание на двойственную природу ключевого слова/встроенной команды export. В то время как export MY_VAR=$(seq 10)работает при назначении вывода seq 10на $MY_VAR, поскольку оболочка анализирует MY_VAR=$(seq 10)из-за наличия ключевого слова exportоболочка не анализировала MY_VAR=$(seq 10)как присваивание в execute_cmd export MY_VAR= $(seq 10), потому что здесь команда не export, а execute_cmd, так что MY_VAR=$(seq 10)анализируется как в любом аргументе любой обычной команды, а split+glob выполняется при $(seq 10), поэтому вам нужно: execute_cmd export MY_VAR="$(seq 10)".

  2. Вы хотите запустить фрагмент оболочки. Фрагмент оболочки — это одна строка, которая передается как один аргумент. Чтобы запустить строку, содержащую шелл-код, используйте встроенную функцию eval.

    execute_cmd () {
    оценка "$1"
    }
    execute_cmd 'экспортировать MY_VAR=my_val'
    

¹ Предполагается значение по умолчанию IFS. Если вы знаете об этом, вам не нужно читать этот абзац.

5
27.01.2020, 21:13

Теги

Похожие вопросы