Os backticks não podem funcionar lá porque eles são avaliados uma vez antes e findsão executados e o resultado é usado como um parâmetro estático para localização.
Sven
Respostas:
10
A melhor maneira de fazer isso é usar parâmetros posicionais. E $()é preferível para substituição de comandos em backticks, porque é mais legível (não é confundido com aspas simples) e pode ser facilmente aninhado sem ter que fazer muito para escapar.
Obrigado por resolver meu problema imediato, mas ainda estou curioso para saber se os backticks podem ser usados conforme descrito. Apenas para ampliar meus horizontes.
RomanSt
Você precisaria invocar o shell via bash -cou similar.
Ignacio Vazquez-Abrams
0
A única maneira de usá-los (AFAIK) é colocá-los em um arquivo de script bash e usar o script em -exec. A mesma coisa com$()
Não esqueça xargs! Seu exemplo chamaria um novo processo de shell para cada arquivo encontrado.
Eu preferiria isso:
find ... | xargs stat -c "Blah: %a"
findgera uma lista de tudo o que foi encontrado, xargslê uma lista de argumentos stdine executa seu parâmetro com esses argumentos na linha de comando, construindo a maior linha de comando possível. Funciona porque stat, como a maioria dos outros comandos / programas adequados, aceita qualquer número de parâmetros. (comparar ls, rme echopor exemplo)
Se você acha que é absolutamente necessário iniciar um novo processo para cada arquivo, use xargs -n 1apenas para passar 1parâmetros para cada comando. Dessa forma, você pode imitar os métodos ineficientes como este:
find ... | xargs -n 1 stat -c "Blah: %a"
(Experimente em um grande sistema de arquivos em um computador lento e calcule as diferenças!)
Agradeço o esforço, mas preciso desses bastidores. Obviamente, meu exemplo é simplificado e usa echo + stat; o script real não usa eco nem stat; portanto, seu truque para reuni-los na string de formato do stat não ajuda em nada.
find
são executados e o resultado é usado como um parâmetro estático para localização.Respostas:
A melhor maneira de fazer isso é usar parâmetros posicionais. E
$()
é preferível para substituição de comandos em backticks, porque é mais legível (não é confundido com aspas simples) e pode ser facilmente aninhado sem ter que fazer muito para escapar.O sublinhado é um espaço reservado para
$0
.fonte
Pelo que?
Ou use
bash -c
se você realmente precisar:fonte
bash -c
ou similar.A única maneira de usá-los (AFAIK) é colocá-los em um arquivo de script bash e usar o script em -exec. A mesma coisa com
$()
fonte
Não esqueça
xargs
! Seu exemplo chamaria um novo processo de shell para cada arquivo encontrado.Eu preferiria isso:
find ... | xargs stat -c "Blah: %a"
find
gera uma lista de tudo o que foi encontrado,xargs
lê uma lista de argumentosstdin
e executa seu parâmetro com esses argumentos na linha de comando, construindo a maior linha de comando possível. Funciona porquestat
, como a maioria dos outros comandos / programas adequados, aceita qualquer número de parâmetros. (compararls
,rm
eecho
por exemplo)Se você acha que é absolutamente necessário iniciar um novo processo para cada arquivo, use
xargs -n 1
apenas para passar1
parâmetros para cada comando. Dessa forma, você pode imitar os métodos ineficientes como este:find ... | xargs -n 1 stat -c "Blah: %a"
(Experimente em um grande sistema de arquivos em um computador lento e calcule as diferenças!)
fonte