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' Почему возникает ошибка: bash интерпретирует $CMD буквально, т. е. он не запускает то, что идет после |, а просто передает v4l2-ctl всю строку как аргумент, включая | и команду socat. Решить проблему можно с помощью eval: CMD='v4l2-ctl -d0 --stream-mmap --stream-to=- | socat - udp-sendto:192.168.1.1:5000' [Использование одинарных и двойных кавычек] В некоторых случаях переменную, передаваемую в eval, нужно заключать в двойные кавычки. Вот пример такого случая, когда во втором параметре скрипта передается имя файла. Обратите внимание, что для того, чтобы правильно работала команда echo для вывода имени файла во втором параметре скрипта, его нужно заключить в одинарные кавычки (т. е. '$2'): CMD='v4l2-ctl -d0 --stream-mmap --stream-to='$2' --stream-count=1' [Ссылки] |