Perintah readlink Linux: membaca target tautan simbolik
readlink adalah perintah yang mengeluarkan jalur target yang tersimpan dalam file tautan simbolik. Ini berguna untuk memeriksa apakah tautan berisi jalur relatif atau ke mana tautan yang rusak menunjuk.
GNU readlink juga mendukung normalisasi jalur dengan -f, -e, dan -m. Untuk normalisasi umum, dokumentasi GNU merekomendasikan realpath untuk jalur absolut dan kanonik. Normalisasi berbeda dari membaca isi file target.
Apa itu perintah readlink?
Ketika Anda menentukan tautan simbolik sebagai argumen, itu akan menampilkan string target yang disimpan dalam tautan tersebut.
readlink current
Jika tautan current mengarah ke releases/2026-09, itu akan menampilkan sebagai berikut.
releases/2026-09
Nilai ini dapat berupa jalur relatif yang ditafsirkan berdasarkan lokasi tautan. Mode dasar tidak mengubahnya menjadi jalur absolut atau menelusuri seluruh rantai tautan. Pada versi GNU yang mengutip keluaran terminal, karakter khusus dapat ditampilkan dalam bentuk kutipan atau escape; tampilan terminal perlu dibedakan dari data yang diteruskan melalui pipa.
Sintaks dan Penggunaan Dasar
readlink [opsi] file...
Panduan ini memakai GNU Coreutils; periksa readlink --version dan readlink --help pada sistem Anda. Mulailah di direktori latihan baru yang dapat ditulisi, misalnya buat dengan mktemp -d, lalu masuk ke jalur yang dicetak dengan cd. Buat direktori target dengan mkdir -p releases/2026-09 sebelum contoh berikut. Nama current belum boleh ada, termasuk sebagai direktori, agar ln membuat tautan pada nama yang dimaksud.
ln -s releases/2026-09 current
readlink current
Tanpa opsi kanonisasi, file biasa atau direktori bukan tautan tidak memiliki string target: perintah tidak mencetak hasil dan mengembalikan status bukan nol. Contoh berikut mengasumsikan /etc/passwd berupa file biasa; sesuaikan bila sistem Anda berbeda. printf menampilkan status perintah sebelumnya, biasanya 1 untuk kegagalan ini.
readlink /etc/passwd
printf '%s\n' "$?"
Memahami Tautan Relatif dan Absolut
Menyimpan Tautan dengan Jalur Relatif
Target dari tautan relatif ditafsirkan berdasarkan direktori tempat tautan berada, bukan lokasi terminal saat ini. Contoh /srv berikut menggambarkan struktur aplikasi: direktori /srv/app harus ada dan dapat ditulisi, serta nama /srv/app/config.yml belum ada. Untuk latihan, sesuaikan seluruh prefiks ke direktori milik Anda. Target /srv/shared/config.yml boleh belum ada saat tautan dibuat.
ln -s ../shared/config.yml /srv/app/config.yml
readlink /srv/app/config.yml
Keluaran adalah ../shared/config.yml. Jika /srv/app merupakan direktori biasa tanpa tautan pada prefiksnya, jalur itu menunjuk /srv/shared/config.yml. Memindahkan tautan ke direktori lain dapat mengubah lokasi yang dituju.
Menyimpan Tautan dengan Jalur Absolut
Contoh ini terpisah dari latihan current sebelumnya. Direktori /srv harus dapat ditulisi dan nama /srv/current belum ada. Tautan absolut menyimpan prefiks lengkap; sesuaikan kedua jalur jika memakai direktori latihan.
ln -s /srv/releases/2026-09 /srv/current
readlink /srv/current
Tautan absolut menghasilkan string target yang dimulai dari root, seperti ini.
/srv/releases/2026-09
Tautan absolut memiliki lokasi yang jelas, tetapi dapat dengan mudah rusak jika pohon file dipindahkan ke jalur yang berbeda. Pilih tautan relatif atau absolut dengan mempertimbangkan struktur penyebaran dan portabilitas Anda.
Memeriksa Tautan Simbolik yang Rusak
Walaupun file target tidak ada, mode dasar dapat membaca string yang tersimpan selama tautan itu sendiri dapat diakses. Jalankan contoh di direktori latihan dengan nama broken-link dan missing-target yang belum ada.
ln -s missing-target broken-link
readlink broken-link
missing-target
Keberadaan target tautan dapat diperiksa secara terpisah sebagai berikut.
if [ -L broken-link ] && [ ! -e broken-link ]; then
printf '%s\n' 'Tautan simbolik ada, tetapi targetnya tidak dapat diselesaikan.'
fi
-L menguji apakah komponen terakhir merupakan tautan simbolik; -e mengikuti tautan dan menguji apakah target dapat diselesaikan. Spasi sesudah [ dan sebelum ] wajib karena operator harus menjadi argumen terpisah. Hasil di atas sesuai dengan tautan putus pada latihan, tetapi pada sistem lain izin pencarian direktori atau siklus tautan juga dapat membuat target tidak terselesaikan; hasil itu bukan bukti tunggal bahwa file telah dihapus.
Opsi normalisasi jalur
GNU readlink juga menyediakan mode untuk menormalkan jalur selain mengeluarkan string target tautan.
| Opsi | Tindakan |
|---|---|
-f, --canonicalize |
Semua komponen jalur kecuali yang terakhir harus ada, dan tautan simbolik serta komponen titik diselesaikan. |
-e, --canonicalize-existing |
Semua komponen termasuk item terakhir harus ada. |
-m, --canonicalize-missing |
Komponen yang tidak ada juga diasumsikan sebagai direktori untuk menormalkan jalur. |
Cetak jalur kanonik dengan -f
readlink -f /srv/current/config.yml
Hasilnya jalur absolut dengan tautan dan komponen titik diselesaikan. Komponen terakhir hasil resolusi boleh belum ada, sedangkan prefiksnya harus tersedia sebagai direktori. Contoh mengasumsikan /srv/current mengarah ke direktori rilis yang tersedia. GNU -f mengabaikan garis miring di akhir.
Mengharuskan setiap komponen ada dengan -e
readlink -e /srv/current/config.yml
Seluruh jalur, termasuk target akhir, harus dapat diselesaikan. Dengan -e, garis miring di akhir juga mengharuskan target berupa direktori. Keberhasilan tidak membuktikan file dapat dibaca atau mencegah target berubah antara pemeriksaan dan pemakaiannya.
Mengizinkan komponen yang hilang dengan -m
readlink -m /srv/future/../uploads/new-file.txt
Komponen yang hilang atau tidak tersedia diperlakukan sebagai direktori, sehingga opsi ini berguna untuk merencanakan jalur. Tautan yang tersedia masih dapat diselesaikan: -m bukan sekadar pembersihan string. Hasil tidak menjamin lokasi itu ada atau dapat dibuat.
Menangani beberapa tautan dan pemisahan output
Periksa beberapa tautan simbolik
GNU readlink dapat menangani beberapa tautan sekaligus. Di direktori latihan, current sudah dibuat sebelumnya; buat dua tautan tambahan dengan ln -s releases/2026-09 previous dan ln -s releases/2026-09/config.yml config-link, dengan kedua nama tujuan belum ada.
readlink current previous config-link
Setiap string target ditampilkan per baris. Jika kesesuaian antara input dan output penting, lebih jelas menampilkan nama tautan bersama hasilnya dalam sebuah loop.
for link in current previous config-link; do
target=$(readlink -- "$link") || continue
printf '%s -> %s\n' "$link" "$target"
done
Loop mencetak pasangan seperti current -> releases/2026-09 dan melewati input yang gagal. Substitusi perintah $(...) membuang baris baru di akhir, jadi contoh ini untuk laporan manusia dengan nama biasa. Jangan menganggapnya format pertukaran yang menjaga semua byte nama file.
Perbedaan antara -n dan -z
-n atau --no-newline menghilangkan karakter pemisah di akhir saat memproses satu tautan. Menggunakannya dengan beberapa file dapat menghasilkan peringatan.
readlink -n current
-z atau --zero mengakhiri setiap hasil dengan byte NUL. Ini memisahkan target yang mengandung baris baru secara tidak ambigu jika program penerima juga memahami NUL. Gunakan pipa atau file; variabel shell biasa tidak dapat menyimpan aliran NUL secara utuh.
readlink -z current previous
Perbandingan readlink, realpath, ls, dan stat
| Perintah | Tujuan Utama | Fitur |
|---|---|---|
readlink |
Periksa string target yang disimpan dalam sebuah tautan | Bahkan tautan yang rusak dapat dibaca sebagai tautan itu sendiri |
realpath |
Normalisasi nama file dan perhitungan path relatif | Dokumentasi GNU merekomendasikan realpath untuk normalisasi jalur. |
ls -l |
Periksa tautan dan target dalam daftar dengan cara yang mudah dibaca oleh manusia | Ditampilkan bersama informasi daftar lainnya, sehingga tidak cocok untuk diuraikan |
stat |
Periksa metadata detail dari tautan atau target | Anda dapat memeriksa inode, izin, waktu, dan jenis file |
Jika hanya string target dari tautan yang diperlukan dalam otomatisasi, readlink tepat. Jika tujuannya adalah normalisasi jalur umum dan konversi jalur relatif, realpath lebih jelas.
Menggunakan readlink dalam skrip shell
Periksa apakah target tautan adalah jalur relatif
Simpan contoh lengkap berikut sebagai jenis-tautan.sh, lalu jalankan sh jenis-tautan.sh current di direktori latihan. Skrip POSIX ini memakai GNU readlink: argumen yang salah menghasilkan status 2, tautan yang tidak terbaca status 1, dan klasifikasi berhasil status 0.
#!/bin/sh
if [ "$#" -ne 1 ]; then
printf '%s\n' 'Penggunaan: sh jenis-tautan.sh LINK' >&2
exit 2
fi
link=$1
target=$(readlink -- "$link") || {
printf '%s\n' 'Tautan simbolik tidak dapat dibaca.' >&2
exit 1
}
case "$target" in
/*) printf '%s\n' 'Target tautan berupa jalur absolut.' ;;
*) printf '%s\n' 'Target tautan berupa jalur relatif.' ;;
esac
Untuk current pada latihan, hasilnya Target tautan berupa jalur relatif. Kutip "$link" agar spasi tetap utuh dan gunakan -- untuk nama yang diawali tanda hubung. Skrip hanya mengklasifikasikan bentuk target, bukan memastikan keberadaannya. Keterbatasan baris baru di akhir akibat substitusi perintah juga berlaku di sini.
Untuk memperoleh lokasi sebenarnya dari target relatif, gunakan direktori tempat tautan berada sebagai dasar, atau gunakan realpath -e -- "$link" jika seluruh target harus ada. Menambahkan string target ke direktori kerja saat ini dapat menghasilkan lokasi yang salah.
Periksa status keluar
Periksa apakah perintah berhasil daripada hanya memeriksa apakah output kosong. Meskipun target tautan tidak bisa berupa string kosong, ini menyatakan niat penanganan kesalahan lebih jelas.
Untuk mencetak target alih-alih klasifikasinya, ganti seluruh bagian setelah link=$1 sampai akhir case pada skrip di atas dengan potongan berikut. Pemeriksaan jumlah argumen tetap dipakai. Contoh current menghasilkan releases/2026-09; exit 1 memastikan kegagalan tidak tertutupi keberhasilan printf.
if target=$(readlink -- "$link"); then
printf '%s\n' "$target"
else
printf 'Gagal membaca tautan: %s\n' "$link" >&2
exit 1
fi
Ringkasan opsi utama
| Opsi | Deskripsi |
|---|---|
-f, --canonicalize |
Normalisasi jalur yang komponen-komponennya ada kecuali item terakhir. |
-e, --canonicalize-existing |
Semua komponen jalur harus ada agar berhasil. |
-m, --canonicalize-missing |
Perlakukan komponen yang tidak ada sebagai direktori. |
-n, --no-newline |
Hapus pembatas keluaran setelah satu hasil. |
-z, --zero |
Akhiri setiap hasil dengan karakter NUL. |
-q, -s, --quiet |
Menekan sebagian besar diagnostik; default GNU bila POSIXLY_CORRECT tidak disetel. |
-v, --verbose |
Menampilkan diagnostik; default GNU bila POSIXLY_CORRECT disetel. |
Masalah umum
Gagal tanpa keluaran.
Dalam mode default, jalur yang ditentukan mungkin bukan tautan simbolik atau tautan itu sendiri mungkin tidak dapat diakses. Periksa status keluar dan, jika perlu, tampilkan pesan kesalahan dengan -v.
Target tautan relatif tampaknya salah.
Path relatif output harus diartikan berdasarkan direktori yang berisi tautan. Itu tidak didasarkan pada direktori saat ini dari mana perintah dijalankan.
readlink -f tidak berfungsi di sistem lain.
Opsi normalisasi, termasuk -f, memiliki perbedaan implementasi. Dalam skrip yang memerlukan portabilitas, periksa apakah sistem operasi target mendukungnya, dan jika tujuan Anda adalah normalisasi path, bandingkan juga implementasi dan opsi realpath yang tersedia.
FAQ
Apakah readlink membaca isi file yang ditunjuk oleh tautan simbolik?
Tidak. Dalam mode defaultnya, ia mengeluarkan string jalur target yang disimpan dalam file tautan. Ia tidak membaca isi file target.
Bisakah tautan simbolik yang rusak juga diperiksa dengan readlink?
Jika tautan itu sendiri ada dan dapat dibaca, Anda dapat memeriksa string target yang disimpan dengan readlink default. Normalisasi -e hanya berhasil jika target sebenarnya ada.
Jalur relatif yang dikeluarkan. Bagaimana saya bisa memeriksa jalur absolut?
Di lingkungan GNU, gunakan readlink -f link jika prefiks target ada dan komponen terakhir boleh belum ada. Gunakan -e untuk mewajibkan semuanya ada. Untuk normalisasi umum, realpath lebih jelas dari segi tujuan dan pilihan keluarannya.
Mengapa menggunakan readlink daripada ls -l?
ls -l cocok untuk daftar yang dapat dibaca manusia, sementara readlink hanya menghasilkan string target, sehingga nyaman untuk skrip. Dalam otomatisasi, pastikan juga menangani status keluar dan pemisahan nama file.
Dokumentasi resmi
Untuk membedakan metadata tautan dan target, lihat stat untuk inode, izin, dan jenis file. Referensi perintah Linux menurut tugas (bahasa Inggris) memberi konteks perintah lain.




