Estoy tratando de utilizar find
a echo 0
en algunos archivos, pero al parecer esto sólo funciona con sh -c
:
find /proc/sys/net/ipv6 -name accept_ra -exec sh -c 'echo 0 > {}' \;
Pero usar sh -c
con find -exec
me hace sentir muy incómodo porque sospecho que tengo problemas de citas. Jugueteé un poco y aparentemente mis sospechas estaban justificadas:
Mi configuración de prueba:
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
sinsh -c
parece funcionar sin problemas: no es necesario citar aquí:martin@dogmeat ~ % find findtest -type f -exec cat {} \; one two three
Pero cuando estoy usando
sh -c
{}
parece requerir algún tipo de cita: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
Las comillas dobles funcionan siempre que ningún nombre de archivo contenga comillas dobles:
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
Las comillas simples funcionan siempre que ningún nombre de archivo contenga comillas 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
No he encontrado una solución que funcione en todos los casos. ¿Hay algo que estoy pasando por alto o que estoy usando sh -c
de forma find -exec
inherentemente insegura?
sh
parece ser algún tipo de marcador de posición, también funciona si se sustituye por_
, por ejemplo, - muy útil si se desea llamar internos de bash:find /tmp -name 'fil*' -exec bash -c 'printf "%q\n" "$1"' _ {} \;
. ¿Pero alguien sabe dónde está documentado esto?$0
(por lo general, el nombre del shell. Debe omitirlo en este escenario para que no coma uno de sus argumentos posicionales normales. La documentación lo-c
menciona.argv[0]
aquí, es solo$0
el guión. La página de Sven es inexacta aquí, yr
no hará que el shell ingrese a un modo restringido por lo que puede ver yzsh
no cambiará el modo según$0
.(exec -a rksh ksh -c 'cd /')
ejecutará un restringidoksh
, pero noksh -c 'cd /' rksh
).find
la-exec sh -c
e incrustar{}
en el código shell" ?