Скобки представляют собой синтаксис оболочки.
К отражает синтаксис, который хранится в переменной обратно в оболочку для обработки, вы должны использовать команду eval
.
Простая интерполяция значения переменной в командную строку не вызывает eval
оценки синтаксиса. Это было бы нежелательным вторжением eval, которое вызовет всевозможные проблемы.
Например, рассмотрим следующее:
arg="(parenthesized)"
somecommand $arg
Мы просто хотим somecommand
быть вызван с символьной строки (parenthesized)
в качестве аргумента; мы не хотим запускать подоболочку. Такой неявный eval превратит безвредные данные в живой код, создавая дыру в безопасности, не говоря уже о кошмарном кодировании, чтобы попытаться избежать этого.
Правила обработки $arg
не зависят от положения; расширение происходит таким же образом, даже если $arg
является первым элементом в командной строке:
$arg foo
замена параметров превращает $arg
в текст (parenthesized)
, а затем, что пробуется в качестве команды, а не как синтаксис оболочки.
Чтобы выполнить часть скрипта, хранящегося в input
, используйте:
eval "$input"
Вы также можете сделать это следующим образом:
input="echo 1" # no parentheses
/bin/sh -c "$input" # run in subshell explicitly
Конечно, подоболочка подход подает фрагмент кода в ту же оболочку, которая выполняет окружающий скрипт, тогда как здесь мы выбрали /bin/sh
, который может отличаться от вызывающей оболочки или иметь другое поведение, даже если это символическая ссылка на ту же оболочку.
См [BashFAQ # 50] (Http: // mywiki.wooledge.org/BashFAQ/050). Некотированное расширение распространяется только на два этапа разбора (разложение поля и расширение glob); это верно по очень веским причинам (было бы гораздо сложнее написать защищенный код в bash в противном случае). Связанные FAQ подробно рассматриваются, в том числе обсуждение лучших практик для случаев, когда вы могли бы захотеть сохранить код в переменной. –
Вы не можете поместить такие команды в переменную. Фактически, размещение команд в переменных подвержено ошибкам. Переменные сохраняют _data_, а не _commands! _, Если вы хотите хранить команды где-то для будущего использования, используйте _function._ –
Кстати, ваш код и ваша ошибка не выстраиваются в линию. Вы будете получать '(: command not found', если вы использовали точный код, указанный здесь. Обязательно скопируйте/вставьте код в свой вопрос * точно так, как было задано *, чтобы избежать таких ситуаций в будущем, в случаях, когда эти различия могут иметь значение. –