Администрирование FreeBSD, Linux, ... eval: правильный запуск команды из переменных Fri, October 10 2025  

Поделиться

Нашли опечатку?

Пожалуйста, сообщите об этом - просто выделите ошибочное слово или фразу и нажмите Shift Enter.


eval: правильный запуск команды из переменных Печать
Добавил(а) microsin   

Столкнулся с проблемой: если в команде используется pipe (|) и её запустить в скрипте с помощью переменной, то возникает ошибка.

Например, следующая команда в bash-скрипте работает нормально:

v4l2-ctl -d0 --stream-mmap --stream-to=- | socat - udp-sendto:192.168.1.1:5000

Но если её запустить с помощью переменной, то возникает ошибка "unknown arguments: | socat - udp-sendto:192.168.1.1:5000":

CMD='v4l2-ctl -d0 --stream-mmap --stream-to=- | socat - udp-sendto:192.168.1.1:5000'
$CMD

Почему возникает ошибка: bash интерпретирует $CMD буквально, т. е. он не запускает то, что идет после |, а просто передает v4l2-ctl всю строку как аргумент, включая | и команду socat.

Решить проблему можно с помощью eval:

CMD='v4l2-ctl -d0 --stream-mmap --stream-to=- | socat - udp-sendto:192.168.1.1:5000'
eval $CMD

[Использование одинарных и двойных кавычек]

В некоторых случаях переменную, передаваемую в eval, нужно заключать в двойные кавычки. Вот пример такого случая, когда во втором параметре скрипта передается имя файла. Обратите внимание, что для того, чтобы правильно работала команда echo для вывода имени файла во втором параметре скрипта, его нужно заключить в одинарные кавычки (т. е. '$2'):

CMD='v4l2-ctl -d0 --stream-mmap --stream-to='$2' --stream-count=1'
echo "$CMD"
eval "$CMD"

[Ссылки]

1. Примеры использования команды eval.

 

Добавить комментарий


Защитный код
Обновить

Top of Page