Regarding quotes, the OP might find a module that provides shell escaping useful. Such as String::ShellQuote.
printf is probably more surefire than echo there:
printf "%s" "$cmd" | grep -e '----'But shelling out is very error-prone (as the OP discovered) and pretty vain when the code can be reproduced in Perl in a few lines.
In reply to Re^4: sh: -c: line 1: syntax error near unexpected token `|'
by Anonymous Monk
in thread sh: -c: line 1: syntax error near unexpected token `|'
by perl@1983
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |