это работает:
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 , чтобы сделать подобные вещи, но это плохая идея, если вы не полностью осведомлены о последствиях для безопасности.