Різниця між -r і -R


32

Часто буває так, що я хочу застосувати операцію рекурсивно. Деякі команди, наприклад, grep, використовують малі r для позначення рекурсії. Наприклад

grep -r foo .

Інші команди, здається, віддають перевагу великому регістру R:

chmod -R 755 .

Я постійно переживаю ці помилки і забуваю, що є. Чи є якась логіка, що стоїть за вибором справи для цих аргументів?


1
"Тому що кодери вважали це розумним". (не кажучи, що це є вагомою причиною, але це, мабуть, правда)
HalosGhost

1
Що варто, хоча, здається, не багато команд розуміють --recursive, вони, ймовірно, не роблять неправильної справи.
Tanner Swett

4
що стосується chmod, це тому, що -rозначає скасувати біт читання для всіх рівнів
HorusKol

Відповіді:


37

Більшість команд POSIX , які мають рекурсивний варіант обходу каталогу ( ls, chmod, chgrp, chmod, cp, rm) є -Rдля цього.

rmтакож, -rтому що це було спочатку, задовго до POSIX.

Тепер поведінка змінюється, коли виявляються символьні посилання, коли йдеш по дереву. POSIX намагався зробити всі речі послідовними, додавши параметри -L/ -H/ P, щоб дати користувачеві можливість вирішити, що робити з посиланнями, що залишають за замовчуванням, коли жодна не вказана не визначена.

POSIX grepне має -rабо -R.

grepСпочатку ГНУ не мала жодного. -rДодано в 1998 році. Це було наступним символом.

-Rбув доданий як синонім у 2001 році для узгодженості з іншими утилітами. Це ще йшло за посиланнями.

У 2012 році (grep 2.12) -rбуло змінено, тому воно більше не слідкувало за посиланнями, можливо, тому -L, що -Hвже використовувалося для чогось іншого.

BSD grepбули засновані на GNU grep протягом тривалого часу. Деякі з них переписали свої власні і зберегли більш-менш сумісність з GNU grep. Apple OS / X вирішила проблему симпосилання по-різному. -rі -Rоднакові, і не слідкуйте за посиланнями. Там є -Sваріант , однак , що діє як chmod/ cp/ find«s -Lваріанти слідувати по символічним посиланням.


13
TL; DR : Історія.
Саммітч

10
Рання історія: rmмала рекурсивний варіант перед іншими. Це було -r. Потім cpотримали відповідність -r. Тоді lsхотіли мати рекурсивний варіант, але ls -rвже означав "зворотний сорт", так це мусило бути -R. Там напруга між собою -Rі -rпочалася. -Rбула єдиною, яку можна було послідовно додавати до кожної відповідної утиліти, але rm -rце вже було відоме традиційне використання. Потім GNU підійшов і сказав: "Послідовність і традиція - це квадрати, чоловіче!"

8

Нічого. Просто залежить від того, що обрали розробники. Це часто тому, що обидва -rі -Rє дійсними варіантами. У програмах, які ви цитували, наприклад:

  • останні версії GNU grep:

    -r, --recursive
          Read all files  under  each  directory,  recursively,  following
          symbolic  links  only  if they are on the command line.  This is
          equivalent to the -d recurse option.
    
    -R, --dereference-recursive
          Read all files under each directory,  recursively.   Follow  all
          symbolic links, unlike -r.
    
  • chmodне має жодного -rваріанту, тому, імовірно, віддають перевагу дияволам -R. Однак, звичайно, -rце дійсний рядок дозволів (як вказував @Arkadiusz Drabczykso), тому його реально не можна використовувати там.


Яка ваша grepверсія? GNU grep 2.12, -rі -Rте ж саме. З chmod, -Rвизначається POSIX.
cuonglm

@Gnouc, grep (GNU grep) 2.15і я пам'ятаю, як це бачили в попередніх версіях. Ви впевнені, що це не так у ваших? Вони дають по суті однакові результати в більшості випадків, вони поводяться по-різному лише за посиланнями. Щодо chmod, це може бути визначено POSIX, але це все-таки, імовірно, тому що оригінальні chmodдиски вибрали Rбільше r.
terdon

2
@Gnouc D'oh! Очевидно, вони не могли використовувати, -rоскільки це вже дійсний рядок дозволів.
terdon

3

Переважно, це зводиться до особистих переваг розробника. Однак іноді вибирають великі параметри, якщо бажаний варіант з малого регістру використовується для чогось іншого, що, як вважають розробники, важливіше, ніж, наприклад, рекурсивна робота. У разі chmod -r- це дійсний режим. Наприклад:

$ ll FILE
-rw-r--r-- 1 ja ja 0 Sep  9 16:42 FILE
$ chmod -r FILE
$ ll FILE
--w------- 1 ja ja 0 Sep  9 16:42 FILE

1

Я постійно переживаю ці помилки і забуваю, що є.

Де можливо, використовуйте версії GNU цих утиліт, і тоді ви можете використовувати довші імена для параметрів.

command --recursive

Чи є якась логіка, що стоїть за вибором справи для цих аргументів?

Ні.

Або не дуже. Утиліти Unix були розроблені поодиноко, а параметри команд відображають індивідуальний вибір їх головних або єдиних розробників. Доступно лише 26 літер опціональних ліній ASCII, що є кращим набором (команди, як правило, в нижньому регістрі для зручності введення тексту), і цей обмежений набір призводить до мнемічних конфліктів. Конфлікти призводять до невідповідності, оскільки нові версії команд / утиліт отримували нові функції .


-1

20 років тому, коли я навчився UNIX, мій наставник сказав мені так: "Краще завжди вводити рекурсивний варіант у верхній регістр R. Оскільки деякі команди мають різний зміст у нижньому регістрі r, але великі регістри R переважно працюють як рекурсивний варіант скрізь. І це дасть вам хорошу звичку бути обережними щодо [rm * -Rf], дратуючи натисканням клавіші shift під час введення R. "


2
Було б краще, якби він сказав вам прочитати посібник для команди в конкретній системі, на якій ви працюєте, оскільки нестандартні параметри можуть бути різними між реалізаціями інструментів.
Kusalananda
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.