Я пытаюсь использовать , find
чтобы echo 0
в некоторые файлы, но , видимо , это работает только с sh -c
:
find /proc/sys/net/ipv6 -name accept_ra -exec sh -c 'echo 0 > {}' \;
Но использование sh -c
с find -exec
заставляет меня чувствовать себя очень неловко, потому что я подозреваю, что цитирую проблемы. Я немного поиграл с этим, и, очевидно, мои подозрения оправдались:
Моя тестовая настройка:
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
Использование
find -exec
без,sh -c
кажется, работает без проблем - здесь нет необходимости цитировать:martin@dogmeat ~ % find findtest -type f -exec cat {} \; one two three
Но когда я использую,
sh -c
{}
кажется, требует какой-то цитаты: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
Двойные кавычки работают до тех пор, пока в имени файла нет двойных кавычек:
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
Одиночные кавычки работают, пока имя файла не содержит одинарных кавычек:
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
Я не нашел решение, которое работает во всех случаях. Есть ли что-то, что я упускаю из виду, или использую sh -c
по find -exec
своей сути небезопасно?
sh
кажется, какой - то заполнитель, он тоже работает , если заменен_
, например , - очень полезно , если вы хотите вызвать Баш внутренностей:find /tmp -name 'fil*' -exec bash -c 'printf "%q\n" "$1"' _ {} \;
. Но кто-нибудь знает, где это задокументировано?$0
(обычно это имя оболочки. В этом сценарии вам нужно пропустить ее, чтобы она не использовала ни один из ваших обычных позиционных аргументов. В документации-c
упоминается об этом.argv[0]
здесь, это только$0
сценарий. Страница Свена здесь неточна,r
она не заставит оболочку войти в ограниченный режим, насколько она может судить, иzsh
не изменит режим на основании$0
.(exec -a rksh ksh -c 'cd /')
будет работать ограниченноksh
, но нетksh -c 'cd /' rksh
).find
с-exec sh -c
и встраивания{}
в код оболочки» ?