Apa perbedaan antara "realpath" dan "readlink -f"

68

Saya sudah membaca banyak tentang realpathperintah dan bagaimana itu sudah usang dengan readlink -fyang sekarang direkomendasikan. Saya juga telah melihat di beberapa tempat bahwa alasan mengapa realpath diperkenalkan adalah karena kurangnya fungsi seperti itu di readlink dan setelah diperkenalkan, realpath tidak lagi diperlukan dan dukungannya dihentikan oleh sebagian besar vendor OS.

Alasan untuk pertanyaan saya adalah bahwa saya juga telah melihat banyak orang merekomendasikan readlink -fsebagai perintah "sangat mirip" dengan realpath, dan itulah yang mengganggu saya, karena tidak ada yang menjelaskan bagian "cukup mirip" itu. Apa perbedaan yang sebenarnya?

Felipe Leão
sumber

Jawaban:

73

Ada beberapa realpathperintah di sekitar.

The realpathutilitas adalah pembungkus sekitar realpathfungsi perpustakaan dan telah diciptakan kembali banyak kali .

Debian digunakan untuk memelihara realpathpaket ( terpisah dari dwwwsejak kayu ) yang tidak berubah kecuali mengenai pengemasan dan dokumentasi sejak 2001, tetapi sekarang telah dihapus. Utilitas ini sudah tidak digunakan lagi karena sekarang ada lebih banyak alternatif standar (GNU readlinkdan segera GNU realpath), tetapi pada saat itu, utilitas GNU bahkan tidak memiliki readlinksama sekali. Implementasi realpathbeberapa dukungan ini optionsuntuk mencegah resolusi tautan simbolis atau menghasilkan keluaran yang diakhiri dengan nol. BusyBox juga menyertakan realpathperintahnya sendiri (yang tidak memiliki opsi).

GNU coreutils memperkenalkan realpathperintah dalam versi 8.15 pada Januari 2012. Ini adalah pengganti yang kompatibel untuk BusyBox dan Debian realpath, dan juga memiliki banyak opsi yang sama dengan GNU readlink.

realpathmemiliki efek yang sama readlink -fdengan GNU readlink. Yang membedakan kedua perintah (atau lebih tepatnya berbagai realpathperintah dari readlink -f) adalah opsi tambahan yang mereka dukung.

GNU realpathtidak ditinggalkan; itu memiliki masalah yang berlawanan: itu terlalu baru untuk tersedia di mana-mana. Debian digunakan untuk menghilangkan GNUrealpath dari coreutilspaketnya dan tetap dengan GNU sendiri realpath. Saya tidak tahu mengapa, karena GNU realpathharus menjadi pengganti drop-in. Namun pada Debian jessie dan Ubuntu 16.04, GNU realpathdigunakan.

Pada sistem Linux, saat ini, taruhan terbaik Anda untuk mengkanonik jalan yang mungkin mengandung tautan simbolik readlink -f.

Sistem BSD memiliki readlinkperintah, dengan kemampuan berbeda dari GNU readlink. Secara khusus, BSD readlinktidak memiliki opsi untuk mengkanonik path, itu hanya melintasi symlink yang diteruskan ke sana.

readlink, kebetulan, memiliki masalah yang sama - itu juga ditemukan berkali-kali (tidak menambahkan utilitas ini ketika tautan simbolis ditambahkan ke Unix adalah kelalaian yang disesalkan). Sekarang telah stabil di beberapa implementasi dengan banyak flag yang tidak kompatibel (khususnya BSD vs GNU).

Gilles 'SANGAT berhenti menjadi jahat'
sumber
8
readlink -fberada di OpenBSD jauh sebelum GNU. Semua NetBSD, FreeBSD dan OpenBSD sekarang memiliki readlink -f( tautan Anda bahkan menyebutkannya). realpathtelah berada di FreeBSD dan IRIX untuk waktu yang lama (tidak tahu apakah itu sudah ada sebelum Debian). HPUX dan IRIX juga memiliki readlink, meskipun tidak -f. The realpathpaket di Debian eksperimental sekarang satu dari coreutils (sebagai percobaan untuk melihat kalau rusak hal). The dwww realpathbertindak lebih seperti readlink -esementara yang GNU suka readlink -fjadi itu bukan pengganti
dropin
2
realpathtelah di FreeBSD sejak tahun 2002. Sebelum itu, pwdmelakukannya (sejak tahun 2000, pwd some-fileakan memanggil realpath()di file). Debian telah memiliki realpathpaket sejak tahun 1996. Yang di IRIX mungkin mendahului itu meskipun saya tidak menemukan bukti selain itu di IRIX 6.5 pada tahun 1998. OpenBSD menambahkan -funtuk readlink tahun 1997 . GNU ditambahkan readlinkpada tahun 2003 dan sudah -fsejak awal.
Stéphane Chazelas
2
Ringkasan yang luar biasa terima kasih. Catat bug yang lebih baik untuk permintaan debian untuk beralih ke varian GNU adalah bugs.debian.org/730779 Bahkan pengelola traktor yang ada menginginkan perubahan terjadi
Pádraig Brady
1
Jawaban yang luar biasa. Referensi yang terlewat hanya untuk implementasi RHEL dari realpath. Adakah yang tahu kalau itu berbeda dari readlink -fversi?
Felipe Leão
1
@ StéphaneChazelas Oh wow, memang banyak kesalahan dalam jawaban saya. Terima kasih telah menunjukkannya. Bisakah Anda memposting jawaban yang benar, dan saya akan menghapus jawaban saya? (Kalau tidak, aku akan memperbaiki kesalahannya, tapi lebih sulit untuk melanjutkan ke daftar tugasku yang panjang ...)
Gilles 'SANGAT berhenti menjadi jahat'
17

tl; dr readlink -f akan kembali 0untuk file yang tidak ada di direktori yang sudah ada sedangkan realpathpengembalian 1. Namun, readlink -eakan berperilaku seperti realpathdan kembali 1untuk file yang tidak ada (lihat Catatan editor di akhir).

readlink -f

$ readlink -f non-existent-file
/home/user/non-existent-file
$ echo $?
0

readlink -e

$ readlink -e non-existent-file
$ echo $?
1

realpath

$ realpath non-existent-file
non-existent-file: No such file or directory
$ echo $?
1

readlink -f dengan direktori tidak ada

readlink -f perilaku bervariasi tergantung pada bagian mana dari jalan tidak ada.

$ readlink -f /tmp/non-existent-dir/foo
$ echo $?
1

Ketersediaan

readlinkdiinstal di sebagian besar distribusi Linux. Padahal, realpathharus sering dipasang secara eksplisit.

Singkatnya

Jika Anda ingin mengganti panggilan untuk realpath ...kemudian gunakan readlink -e ....


Diuji dengan readlink (GNU coreutils) 8.21 dan versi realpath 1.19 di Ubuntu 16.

( Ed .: @AnthonyGeoghegan menulis " ini merujuk ke versi Debian dari realpath. Versi GNU realpathberperilaku sama denganreadlink -f ")

JamesThomasMoon1979
sumber
3
Saya memutakhirkan jawaban ini tetapi saya akan menyarankan klarifikasi bahwa ini merujuk ke versi Debian realpath. Versi GNU realpathberperilaku sama dengan readlink -f.
Anthony G - keadilan untuk Monica
2
Dapat mengonfirmasi bahwa ini tidak berfungsi pada MacOS High Sierra.
Pred