Столкнулся с проблемой: если в команде используется 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. |