Perbedaan antara -r dan -R

32

Sering terjadi bahwa saya ingin menerapkan operasi secara rekursif. Beberapa perintah, seperti grep, menggunakan huruf kecil r untuk menunjukkan rekursi. Sebagai contoh

grep -r foo .

Perintah lain tampaknya lebih suka huruf R besar:

chmod -R 755 .

Saya terus mendapatkan yang salah dan lupa yang mana. Apakah ada logika di balik pemilihan kasus untuk argumen ini?

cjol
sumber
1
"Karena para pembuat kode menganggap itu masuk akal." (tidak mengatakan ini adalah alasan yang bagus, tapi itu mungkin kebenarannya)
HalosGhost
1
Untuk apa nilainya, meskipun tidak banyak perintah tampaknya mengerti --recursive, mereka tidak akan melakukan hal yang salah.
Tanner Swett
4
dalam kasus chmod, itu karena -rsarana untuk
menghapus

Jawaban:

37

Kebanyakan POSIX perintah yang memiliki pilihan direktori traversal rekursif ( ls, chmod, chgrp, chmod, cp, rm) memiliki -Runtuk itu.

rmjuga memiliki -rkarena itulah yang awalnya, jauh sebelum POSIX.

Sekarang, perilaku bervariasi ketika symlink ditemukan berjalan menuruni pohon. POSIX mencoba untuk membuat hal-hal yang konsisten dengan menambahkan opsi -L/ -H/ Puntuk memberikan pengguna kesempatan untuk memutuskan apa yang harus dilakukan dengan symlink meninggalkan default ketika tidak ada yang disediakan tidak ditentukan.

POSIX greptidak memiliki -ratau -R.

GNU grepawalnya tidak memiliki keduanya. -rditambahkan pada tahun 1998. Itu mengikuti symlinks.

-Rditambahkan sebagai sinonim pada tahun 2001 untuk konsistensi dengan utilitas lain. Itu masih mengikuti symlink.

Pada 2012 (grep 2.12), -rdiubah sehingga tidak lagi mengikuti symlink, mungkin karena -L, -Hsudah digunakan untuk hal lain.

BSD grepdidasarkan pada GNU grep untuk waktu yang lama. Beberapa dari mereka telah menulis ulang sendiri dan menjaga kompatibilitas dengan GNU grep. Apple OS / X menangani masalah symlink secara berbeda. -rdan -Rsama dan tidak mengikuti symlink. Ada -Spilihan namun yang bertindak seperti chmod/ cp/ find's -Lpilihan untuk mengikuti symlink.

Stéphane Chazelas
sumber
13
TL; DR : Sejarah.
Sammitch
10
Sejarah awal: rmmemiliki opsi rekursif sebelum yang lain. Itu tadi -r. Kemudian cpmendapat kecocokan -r. Kemudian lsingin memiliki opsi rekursif, tetapi ls -rsudah berarti "sortir terbalik" jadi itu harus -R. Di sana ketegangan antara -Rdan -rdimulai. -Radalah satu-satunya yang dapat ditambahkan secara konsisten ke setiap utilitas yang relevan, tetapi rm -rsudah menjadi penggunaan tradisional yang terkenal. Kemudian GNU datang dan berkata "konsistensi dan tradisi untuk kotak, bung!"
8

Tidak ada sama sekali. Ini tergantung pada apa yang dipilih pengembang. Seringkali karena keduanya -rdan -Rmerupakan opsi yang valid. Dalam program yang Anda kutip, misalnya:

  • GNU versi terbaru 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.
    
  • chmodtidak punya -rpilihan jadi, mungkin, para devs lebih suka -R. Namun, tentu saja, -radalah string izin yang valid (seperti yang ditunjukkan oleh @Arkadiusz Drabczykso) sehingga tidak dapat benar-benar digunakan di sana.

terdon
sumber
Apa grepversimu? GNU grep 2.12, -rdan -Rsama. Dengan chmod, -Rdidefinisikan oleh POSIX.
cuonglm
@ Gnouc grep (GNU grep) 2.15dan saya ingat melihat ini di versi sebelumnya. Apakah Anda yakin itu tidak terjadi pada Anda? Mereka pada dasarnya memberikan hasil yang sama dalam banyak kasus, mereka hanya berperilaku berbeda dengan tautan. Adapun chmod, itu mungkin didefinisikan oleh POSIX tetapi itu masih, mungkin, karena chmoddevs asli memilih Rlebih r.
terdon
2
@Gnouc D'oh! Jelas, mereka tidak dapat menggunakan -rkarena itu sudah menjadi string izin yang valid.
terdon
3

Sebagian besar, itu tergantung pada preferensi pribadi pengembang. Namun, kadang-kadang, opsi huruf besar dipilih jika opsi huruf kecil yang lebih disukai diambil untuk hal lain yang menurut pengembang lebih penting daripada, misalnya, beroperasi secara rekursif. Dalam kasus chmod -radalah mode yang valid. Sebagai contoh:

$ 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
Arkadiusz Drabczyk
sumber
1

Saya terus mendapatkan yang salah dan lupa yang mana.

Jika memungkinkan, gunakan versi GNU dari utilitas ini dan kemudian Anda dapat menggunakan nama yang lebih panjang untuk opsi.

command --recursive

Apakah ada logika di balik pemilihan kasus untuk argumen ini?

Tidak.

Atau tidak banyak. Utilitas Unix dikembangkan sedikit demi sedikit dan opsi perintah mencerminkan pilihan individu dari pengembang utama atau pengembang tunggal mereka. Hanya ada 26 huruf opsi ASCII huruf kecil yang tersedia, yang merupakan himpunan pilihan (perintah umumnya dalam huruf kecil untuk kemudahan mengetik), dan himpunan terbatas ini mengarah ke konflik mnemonik. Konflik menyebabkan inkonsistensi karena versi baru perintah / utilitas mendapatkan fitur baru .

RedGrittyBrick
sumber
-1

20 tahun yang lalu ketika saya telah belajar UNIX, mentor saya mengatakan kepada saya seperti ini: "Anda sebaiknya mengetikkan opsi rekursif dalam huruf R selalu. Karena beberapa perintah memiliki arti yang berbeda pada opsi r huruf kecil, tetapi huruf besar R sebagian besar berfungsi sebagai opsi rekursif di mana-mana. Dan Anda akan terbiasa dengan [rm * -Rf] dengan menekan tombol shift saat mengetik R. "

Enzim
sumber
2
Akan lebih baik jika dia mengatakan kepada Anda untuk membaca manual untuk perintah pada sistem tertentu yang Anda gunakan, karena opsi non-standar mungkin berbeda antara implementasi alat.
Kusalananda