Próbuję użyć find
do echo 0
niektórych plików, ale najwyraźniej działa to tylko z sh -c
:
find /proc/sys/net/ipv6 -name accept_ra -exec sh -c 'echo 0 > {}' \;
Ale używanie sh -c
z find -exec
sprawia, że czuję się bardzo nieswojo, ponieważ podejrzewam, że mam problemy z cytowaniem. Trochę się z tym bawiłem i najwyraźniej moje podejrzenia były uzasadnione:
Moja konfiguracja testowa:
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
Używanie
find -exec
bezsh -c
wydaje się działać bezproblemowo - nie trzeba tutaj cytowaćmartin@dogmeat ~ % find findtest -type f -exec cat {} \; one two three
Ale kiedy używam
sh -c
{}
wydaje się wymagać pewnego rodzaju cytowania: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
Podwójne cudzysłowy działają, dopóki żadna nazwa pliku nie zawiera podwójnych cudzysłowów:
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
Pojedyncze cudzysłowy działają, dopóki żadna nazwa pliku nie zawiera pojedynczych cudzysłowów:
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
Nie znalazłem rozwiązania, które działa we wszystkich przypadkach. Czy jest coś, co przeoczam lub używa sh -c
z find -exec
natury niebezpiecznego?
sh
wydaje się być jakiś zastępczy, to działa też jeśli zastąpione_
na przykład - bardzo przydatna, jeśli chcesz zadzwonić wewnętrzne bash:find /tmp -name 'fil*' -exec bash -c 'printf "%q\n" "$1"' _ {} \;
. Ale czy ktoś wie, gdzie to jest udokumentowane?$0
(zwykle nazwa powłoki. Musisz pominąć ją w tym scenariuszu, aby nie zjadł jednego z twoich normalnych argumentów pozycyjnych. Dokumentacja na-c
ten temat wspomina.argv[0]
tutaj, to tylko$0
scenariusz. Strona Svena jest tutaj niedokładna,r
nie spowoduje, że powłoka wejdzie w tryb ograniczony, o ile jest to możliwe, izsh
nie zmieni trybu na podstawie$0
.(exec -a rksh ksh -c 'cd /')
uruchomi ograniczonyksh
, ale nieksh -c 'cd /' rksh
).find
z-exec sh -c
i osadzanie{}
w Shellcode” ?