выполнить команду, жестко запрограммированную в скрипте, не работает, когда ее в переменной - PullRequest
0 голосов
/ 27 мая 2010

это работает:

nc shldvgfas005 6155 < temp.6153 

это зависает:

cmd="nc shldvgfas005 6153 < temp.6153"; $cmd

это выдает ошибку:

cmd="nc shldvgfas005 6153 < temp.6153"; "$cmd"

-bash: nc shldvgfas005 6153 <  temp.6153: command not found

HELP!

Ответы [ 2 ]

1 голос
/ 27 мая 2010

это работает:

nc shldvgfas005 6155 < temp.6153

это зависает:

cmd="nc shldvgfas005 6153 < temp.6153"; $cmd

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

это дает ошибку:

cmd="nc shldvgfas005 6153 < temp.6153"; "$cmd"

-bash: nc shldvgfas005 6153 <  temp.6153: command not found

Эта команда не выполнена, поскольку кавычки вокруг раскрытия параметра не позволяют разбить его на несколько полей. Оболочка пытается найти один исполняемый файл с именем nc shldvgfas005 6153 < temp.6153 (т. Е. В имени файла есть встроенные пробелы), но не может найти ни одного такого файла. Кроме того, перенаправление не происходит по той же причине, что и первый сбой.

Подробнее о синтаксическом анализе вашей оболочки см. В его руководстве (или в том, что касается связанной оболочки; возможно, спецификацию POSIX Shell Command Language ). В общем, все Bourne-подобные оболочки разбирают перенаправления перед расширениями. Таким образом, оператор перенаправления не может быть частью переменной (хотя источник / цель перенаправления (имя файла) может быть переменной). Некоторым людям нравится использовать eval , чтобы сделать подобные вещи, но это плохая идея, если вы не полностью осведомлены о последствиях для безопасности.

1 голос
/ 27 мая 2010

BASH FAQ запись # 50 :

Я пытаюсь поместить команду в переменную, но сложные случаи всегда дают сбой!

Переменные содержат данные. Функции содержат код. Не помещайте код в переменные! Есть много ситуаций, в которых люди пытаются вставить команды или аргументы команд в переменные, а затем запустить их. Каждый случай должен рассматриваться отдельно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...