Часто бывает, что я хочу применить операцию рекурсивно. Некоторые команды, такие как grep, используют строчную букву r для обозначения рекурсии. Например
grep -r foo .
Другие команды предпочитают заглавные буквы R:
chmod -R 755 .
Я постоянно ошибаюсь и забываю, что есть что. Есть ли какая-то логика в выборе случая для этих аргументов?
--recursive
, они вряд ли сделают неправильно.-r
означаетОтветы:
Большинство команд POSIX , которые имеют рекурсивный вариант обхода каталога (
ls
,chmod
,chgrp
,chmod
,cp
,rm
) есть-R
для этого.rm
также-r
потому, что так было изначально, задолго до POSIX.Теперь поведение меняется, когда в ходьбе по дереву обнаруживаются символические ссылки. POSIX пытался сделать вещи согласованными, добавив опции
-L
/-H
/P
, чтобы дать пользователю возможность решить, что делать с символическими ссылками, оставляя значение по умолчанию, если ни одна из них не указана без указания.POSIX
grep
не имеет-r
или-R
.У GNU
grep
изначально не было ни того, ни другого.-r
был добавлен в 1998 году. Это были следующие символические ссылки.-R
был добавлен как синоним в 2001 году для согласованности с другими утилитами. Это все еще следовало за символическими ссылками.В 2012 году (grep 2.12) он
-r
был изменен, и теперь он больше не следует символическим ссылкам, возможно потому-L
, что он-H
уже использовался для чего-то другого.BSD
grep
долгое время были основаны на GNU grep. Некоторые из них переписали свои собственные и сохранили более или менее совместимость с GNUgrep
. Apple OS / X решает проблему символической ссылки по-другому.-r
и-R
то же самое и не переходите по символическим ссылкам. Там есть-S
вариант , однако , что действует какchmod
/cp
/find
«s-L
варианта следовать по символическим ссылкам.источник
rm
была рекурсивная опция перед другими. Это было-r
. Затемcp
получил соответствие-r
. Затемls
хотел иметь рекурсивную опцию, ноls -r
уже имел в виду «обратную сортировку», так что должно было быть-R
. Там напряжение между-R
и-r
началось.-R
был единственным, который мог последовательно добавляться к каждой соответствующей утилите, ноrm -r
уже был широко известным традиционным использованием. Затем появился GNU и сказал: «Последовательность и традиция для квадратов, чувак!»Никак нет. Это просто зависит от того, что выбрали разработчики. Это часто потому, что оба
-r
и-R
являются действительными вариантами. Например, в указанных вами программах:последние версии GNU
grep
:chmod
не имеет-r
выбора, так что, по-видимому, разработчики предпочитают-R
. Тем не менее, конечно,-r
это допустимая строка прав доступа (как указано @Arkadiusz Drabczykso), поэтому ее нельзя использовать там.источник
grep
версия? GNU grep 2.12-r
и-R
тоже самое. С chmod-R
определяется POSIX.grep (GNU grep) 2.15
и я помню, как видел это в предыдущих версиях. Вы уверены, что это не так в вашем? Они дают практически одинаковые результаты в большинстве случаев, но ведут себя по-разному только со ссылками. Что же касаетсяchmod
, он также может быть определено POSIX , но это до сих пор, по- видимому, потому что первоначальноchmod
разработчики выбралиR
болееr
.-r
так как это уже допустимая строка разрешений.В основном все сводится к личным предпочтениям разработчика. Однако иногда выбирается заглавная опция, если предпочтительная строчная опция выбрана для чего-то другого, что разработчики считают более важным, чем, например, рекурсивная работа. В случае chmod
-r
это действительный режим. Например:источник
Где возможно, используйте GNU-версии этих утилит, а затем вы можете использовать более длинные имена для опций.
Нет.
Или не очень. Утилиты Unix были разработаны по частям, а параметры команд отражают индивидуальный выбор их ведущего или единственного разработчика. Доступно только 26 букв ASCII строчных букв, что является предпочтительным набором (команды обычно пишутся в нижнем регистре для простоты ввода), и этот ограниченный набор приводит к мнемоническим конфликтам. Конфликты приводят к несогласованности, поскольку новые версии команд / утилит получают новые функции .
источник
20 лет назад, когда я изучал UNIX, мой наставник сказал мне так: «Вам лучше всегда набирать рекурсивную опцию в верхнем регистре R, потому что некоторые команды имеют другое значение в нижнем регистре r, но верхний регистр R в основном работает как рекурсивный вариант. везде. И это даст вам хорошую привычку быть осторожным с [rm * -Rf], раздражая нажатие клавиши Shift при вводе R. "
источник