Установил oh-my-zsh и вроде все работает нормально. Задача решена.
Непонятно, что вы хотите сделать. $($@)
не имеет смысла, но что вы хотите сделать вместо этого?
Что делает $($@)
:
Если это звучит сложно, это потому, что так оно и есть.
Если вы хотите, чтобы execute_cmd export MY_VAR=my_val
выполнял export MY_VAR=my_val
, зачем вы вообще возитесь с execute_cmd
?
Это можно толковать двумя способами.
Вы хотите передать команду с параметрами функции. Команда с параметрами представляет собой список строк, первая из которых является именем функции, встроенной оболочкой или исполняемым файлом. Тогда синтаксис для вызова этой команды с предоставленными параметрами будет "$@"
.
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)"
.
Вы хотите запустить фрагмент оболочки. Фрагмент оболочки — это одна строка, которая передается как один аргумент. Чтобы запустить строку, содержащую шелл-код, используйте встроенную функцию eval
.
execute_cmd () {
оценка "$1"
}
execute_cmd 'экспортировать MY_VAR=my_val'
¹ Предполагается значение по умолчанию IFS
. Если вы знаете об этом, вам не нужно читать этот абзац.