Je suis en train d'utiliser find
pour echo 0
dans certains fichiers, mais apparemment , cela fonctionne uniquement avec sh -c
:
find /proc/sys/net/ipv6 -name accept_ra -exec sh -c 'echo 0 > {}' \;
Mais utiliser sh -c
avec find -exec
me fait me sentir très mal à l'aise parce que je soupçonne de citer des problèmes. J'en ai un peu tripoté et apparemment mes soupçons étaient justifiés:
Ma configuration de test:
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
Utiliser
find -exec
sanssh -c
semble fonctionner sans problème - aucune citation n'est nécessaire ici:martin@dogmeat ~ % find findtest -type f -exec cat {} \; one two three
Mais lorsque j'utilise
sh -c
{}
semble nécessiter une sorte de citation: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
Les guillemets doubles fonctionnent tant qu'aucun nom de fichier ne contient de guillemets doubles:
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
Les guillemets simples fonctionnent tant qu'aucun nom de fichier ne contient de guillemets 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
Je n'ai pas trouvé de solution qui fonctionne dans tous les cas. Y at - il quelque chose que je donne sur, ou utilise sh -c
en find -exec
soi dangereux?
sh
semble être une sorte d'espace réservé, cela fonctionne aussi si elle est remplacée par_
par exemple - très utile si vous voulez appeler bash internals:find /tmp -name 'fil*' -exec bash -c 'printf "%q\n" "$1"' _ {} \;
. Mais quelqu'un sait-il où cela est documenté?$0
(généralement le nom du shell. Vous devez le sauter dans ce scénario afin qu'il ne mange pas l'un de vos arguments positionnels normaux. La documentation pour le-c
mentionne.argv[0]
ici, c'est juste$0
le script. La page de Sven est inexacte ici, unr
ne fera pas entrer le shell dans un mode restreint pour autant que l'on puisse dire etzsh
ne changera pas de mode en fonction de$0
.(exec -a rksh ksh -c 'cd /')
exécutera une restrictionksh
, mais pasksh -c 'cd /' rksh
).find
avec-exec sh -c
et de l'intégration{}
dans le code shell" ?