Я пишу скрипт, который функционирует как «говорящий терминал» (вы вводите команды, и он говорит о выходе), и до сих пор мой код:Выполнение команды, которая хранится в переменной (включая каналы и перенаправления)
#!/bin/bash
while [ 1=1 ]; do
echo -n "~>"
read COMMAND
espeak "$($COMMAND)"
done
и это работает для простых команд:
bash$ ./talkingterminal.sh
~> ls
# espeak says "talkingterminal.sh"
но когда я использую трубы и т.д.:
bash$ ./talkingterminal.sh
~>ip addr | grep inet
Command "|" is unknown, try "ip addr help".
~>
и эта команда работает в bash и дает ожидаемый результат. любая помощь? спасибо, Martin
Не ответ, но для объяснения, я бы сказал, что это потому, что разделение команд происходит в начальная фаза разбиения слов, поэтому расширение команды не может сделать одну команду в конвейере из двух. Ссылка: [Как выполнить команду, хранящуюся в переменной?] (Http://stackoverflow.com/a/4668800/12274) Следовательно, 'eval'. –