Use set -x
para ver o que o shell realmente tenta para executar:
$ command='find foo -iname "TEST*" -exec grep --color -F -Hn "main" {} \;'
$ echo "$command"
find foo -iname TEST* -exec grep --color -F -Hn main {} \;
$ set -x
$ $command
+ find foo -iname 'TEST*' -exec grep --color -F -Hn main '{}' '\;'
find: missing argument to '-exec'
Observe o '\;'
: você está dando find
uma barra invertida literal, o que não é o que ele espera.
As aspas duplas cumprem a mesma função que a barra invertida, escapando do ponto-e-vírgula para que seja tomada como um caractere, e não como um separador de comando.
Estes devem ser equivalentes:
$ foo="something ;"
$ foo=something\ \;
Além disso, observe que executar uma linha de comando com $command
é um pouco complicado: se você tiver espaços em algum dos argumentos que vão para o comando resultante (por exemplo, no nome do caminho que você possui em $where
), eles Dividido. As matrizes da Shell oferecem uma maneira mais robusta de fazer isso.