por que o seguinte comando 'find' não 'ls -l' cada arquivo no diretório atual?

1
$ ls -l
total 0
-rw-rw-r-- 1 t t 0 Jun  8 16:37 'file; echo hello'
$ find . -exec echo {} \;
.
./file; echo hello

Eu estava me perguntando por que o seguinte comando não contém ls -l de cada arquivo no diretório atual? Por que ele reporta algum arquivo chamado 1 ? Obrigado.

$ find . -exec sh -c "ls -l $@" sh {} \;
ls: cannot access '1': No such file or directory
ls: cannot access '1': No such file or directory

$ find . -exec sh -c "echo ls -l $@" sh {} \;
ls -l 1
ls -l 1
    
por Tim 08.06.2018 / 22:47

1 resposta

2

Em ambos os casos, $@ é expandido pelo seu shell atual, antes de executar find , porque ele está em uma sequência de aspas duplas. Estou supondo que você tenha $1 definido como 1 (execute printf "%s\n" "$@" para ver os valores atuais dos parâmetros posicionais).

Para executar suas experiências como você espera, você deve usar aspas simples ao redor do comando e aspas duplas em torno de $@ (para evitar divisão extra); por exemplo:

find . -exec sh -c 'ls -l "$@"' sh {} \;
    
por 08.06.2018 / 22:52

Tags