/ usr / bin / find não funciona quando usada com a substituição de comando [duplicado]

0

Em um script, tenho:

CMD='/usr/bin/find /etc -type f -exec /usr/bin/md5sum {} \; '

MD5=$("${CMD}")

Mas o script apresenta o erro:

-bash: /usr/bin/find /etc -type f -exec /usr/bin/md5sum {} \; : No such file or directory

No entanto, o conteúdo do trabalho $ CMD é digitado na linha de comando, ou seja,

/usr/bin/find /etc -type f -exec /usr/bin/md5sum {} \;

Gera corretamente uma lista de hashes md5.

Eu tentei tudo o que posso imaginar, incluindo escapar da barra invertida e ponto-e-vírgula na string, mas parece que não consigo fazer isso funcionar.

Eu também tentei invocar o comando com backticks, o que não altera o resultado.

O que estou fazendo de errado?

    
por tmark 29.03.2016 / 15:57

2 respostas

1

A string inteira entre aspas simples (incluindo espaços) é procurada como o binário / script para executar por bash, exatamente como o erro indica. Ou seja isso não tenta iniciar /usr/bin/find com argumentos que ele tenta iniciar /usr/bin/find /etc -type f -exec /usr/bin/md5sum {} \; .

    
por 29.03.2016 / 16:00
0

Você usou "${CMD}" dentro de aspas duplas, portanto, o resultado da expansão $CMD não foi executado divisão de campo (e também expansão de nome de arquivo ), a string inteira /usr/bin/find /etc -type f -exec /usr/bin/md5sum {} \; é considerado como o comando a ser executado. Não existe um comando com esse nome, então o shell reportou o erro No such file or directory .

Como você usa bash , é melhor usar uma matriz:

$ CMD=( /usr/bin/find /etc -type f -exec /usr/bin/md5sum {} \; )
$ "${CMD[@]}"

ou POSIXly, use "$@" :

$ set -- /usr/bin/find /etc -type f -exec /usr/bin/md5sum {} \;
$ "$@"

No seu primeiro caso, você pode usar $CMD sem aspas duplas, mas é não recomendado e falha facilmente . Pelo menos você precisa de set -f antes de executar $CMD .

    
por 29.03.2016 / 16:08