Eu estou tentando usar find
para echo 0
em alguns arquivos, mas aparentemente isso só funciona com sh -c
:
find /proc/sys/net/ipv6 -name accept_ra -exec sh -c 'echo 0 > {}' \;
Mas usar sh -c
com find -exec
me deixa muito desconfortável porque suspeito de citar problemas. Eu brinquei um pouco com isso e, aparentemente, minhas suspeitas eram justificadas:
Minha configuração de teste:
martin@dogmeat ~ % cd findtest martin@dogmeat ~/findtest % echo one > file\ with\ spaces martin@dogmeat ~/findtest % echo two > file\ with\ \'single\ quotes\' martin@dogmeat ~/findtest % echo three > file\ with\ \"double\ quotes\" martin@dogmeat ~/findtest % ll insgesamt 12K -rw-rw-r-- 1 martin martin 6 Sep 17 12:01 file with "double quotes" -rw-rw-r-- 1 martin martin 4 Sep 17 12:01 file with 'single quotes' -rw-rw-r-- 1 martin martin 4 Sep 17 12:01 file with spaces
Usar
find -exec
semsh -c
parece funcionar sem problemas - não é necessário citar aqui:martin@dogmeat ~ % find findtest -type f -exec cat {} \; one two three
Mas quando estou usando
sh -c
{}
parece exigir algum tipo de citação:martin@dogmeat ~ % LANG=C find findtest -type f -exec sh -c 'cat {}' \; cat: findtest/file: No such file or directory cat: with: No such file or directory cat: spaces: No such file or directory cat: findtest/file: No such file or directory cat: with: No such file or directory cat: single quotes: No such file or directory cat: findtest/file: No such file or directory cat: with: No such file or directory cat: double quotes: No such file or directory
As aspas duplas funcionam desde que nenhum nome de arquivo contenha aspas duplas:
martin@dogmeat ~ % LANG=C find findtest -type f -exec sh -c 'cat "{}"' \; one two cat: findtest/file with double: No such file or directory cat: quotes: No such file or directory
As aspas simples funcionam desde que nenhum nome de arquivo contenha aspas simples:
martin@dogmeat ~ % LANG=C find findtest -type f -exec sh -c "cat '{}'" \; one cat: findtest/file with single: No such file or directory cat: quotes: No such file or directory three
Não encontrei uma solução que funcione em todos os casos. Existe algo que estou ignorando ou que estou usando de sh -c
forma find -exec
inerentemente insegura?
sh
parece ser algum tipo de espaço reservado, ele funciona também se substituído por_
, por exemplo - muito útil se você quiser chamar internos festança:find /tmp -name 'fil*' -exec bash -c 'printf "%q\n" "$1"' _ {} \;
. Mas alguém sabe onde isso está documentado?$0
(geralmente o nome do shell. Você precisa ignorá-lo nesse cenário para que ele não coma um de seus argumentos posicionais normais. A documentação para-c
mencionar isso.argv[0]
aqui, é apenas$0
o script. A página de Sven é imprecisa aqui,r
não fará com que o shell entre em um modo restrito, tanto quanto é possível, ezsh
não mudará de modo com base$0
.(exec -a rksh ksh -c 'cd /')
executará uma restriçãoksh
, mas nãoksh -c 'cd /' rksh
).find
com-exec sh -c
e incorporação{}
no código shell" ?