Как запустить команды сценария из переменных? - PullRequest
8 голосов
/ 12 августа 2010

Я пытался запускать команды, используя каналы.

Basic

single="ls -l"
$single

, который работает как ожидалось

Трубы :

multi="ls -l | grep e"
$multi
ls: |: No such file or directory
ls: grep: No such file or directory
ls: e: No such file or directory

... не удивительно

bash < $multi

$multi: ambiguous redirect

следующая попытка

bash $multi
/bin/ls: /bin/ls: cannot execute binary file

Только

echo $multi > tmp.sh
bash tmp.sh

работал.

Есть ли способ выполнить более сложные команды, не создавая сценарий для выполнения?

Ответы [ 3 ]

13 голосов
/ 12 августа 2010

Вы демонстрируете разницу между оболочкой и ядром.

"ls -l" исполняется системным вызовом execve ().Вы можете man execve для деталей, но это, вероятно, слишком много деталей для вас.

"ls -l | grep e" требуется интерпретация оболочки для настройки канала.Без использования оболочки, '|'символ просто передается в execve () в качестве аргумента для ls.Вот почему вы видите ошибки «Нет такого файла или каталога».

Решение:

cmd="ls -l | grep e"
bash -c "$cmd"
0 голосов
/ 23 ноября 2013

Вам нужно heredoc, чтобы сделать это правильно. В ответ на POSIX-совместимый способ узнать, определена ли функция в скрипте sh , я подробно описал, как прочитать скрипт в переменную, программно проанализировать его для получения информации и / или изменить его при необходимости, а затем выполнить это из другого скрипта или функции оболочки. Это в основном то, что вы пытаетесь сделать, и heredoc делает это возможным, поскольку предоставляет дескриптор файла:

% multi='ls -l | grep e'
% sh <<_EOF_
> ${multi}
> _EOF_
< desired output >

Это решило бы ваш простой пример. Смотрите мой другой ответ для более.

-Mike

0 голосов
/ 12 августа 2010

, если вы хотите запускать команды с каналами, просто запустите его. Никогда не помещайте команду в переменную и не пытайтесь ее запустить. Просто выполните это

ls -l |grep

Если вы хотите захватить вывод, используйте $ ()

var=$(ls -l |grep .. )

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