Misalkan saya punya folder:
cd /home/cpm135/public_html
dan membuat tautan simbolis
ln -s /var/lib/class .
Kemudian, saya berada di direktori itu:
cd /home/cpm135/public_html/class
The pwd
akan bilang aku di/home/cpm135/public_html/class
Apakah ada cara untuk mengetahui bahwa saya "benar-benar" /var/lib/class
? Terima kasih
shell
symlink
cd-command
working-directory
Oliver Williams
sumber
sumber
fish
shell secara otomatis menyelesaikan symlink ketika Andacd
masuk ke dalamnya.Jawaban:
Bergantung pada bagaimana
pwd
perintah Anda dikonfigurasi, mungkin default untuk menampilkan direktori kerja logis (keluaran olehpwd -L
) yang akan menunjukkan lokasi symlink, atau direktori kerja fisik (keluaran olehpwd -P
) yang mengabaikan symlink dan menunjukkan direktori "nyata".Untuk informasi lengkap bisa Anda lakukan
Di dalam symlink, ini akan kembali
sumber
-P
bendera itu yang saya butuhkan. Terima kasihtest "$(pwd -L)" = "$(pwd -P)" && echo No symlinks
(atau ganti&& echo No symlinks
dengan|| echo Symlinks
).file "$(pwd)"
hanya berfungsi jika symlink adalah komponen direktori terakhir. Itu tidak mendeteksi symlink OP ketika di-CD ke/home/cpm135/public_html/class/foo/bar
. Saya tidak mengetahui apa pun yang mencetak info untuk semua symlink di pathname, tetapi Anda juga dapat menggunakanrealpath .
, yang menurut saya setara denganpwd -P
Perhatikan bahwa
pwd
sebenarnya ini adalah built-in shell. Tergantung pada shell Anda dan konfigurasinya, hasilnya dapat berubah. Untuk solusi yang lebih portabel, Anda harus menggunakannya/bin/pwd
. Cuplikan dari halaman manual:Secara umum, Anda dapat menyelesaikan jalur kanonik lengkap dari semua file / direktori menggunakan
readlink -f
.readlink -f .
bekerja mirip denganpwd -P
.sumber
readlink -f
tidak tersedia di semua Unices (misalnya tidak tersedia di OS-X)Anda benar-benar berada
/home/cpm135/public_html/class
- itulah satu-satunya jawaban yang benar untuk pertanyaan "apa direktori kerja saya saat ini".Ketika Anda merujuk ke
/var/lib/class
... itu tidak benar-benar tentang di mana Anda berada, tetapi lebih banyak tentang jalan apa yang Anda gunakan untuk sampai ke sana .Ketika Anda menjalankan
/bin/pwd
, itu mengetahui direktori kerja Anda saat ini dengan melihat. dan .. direktori (yang tercantum di bagian atasls -la
), mencari tahu direktori mana yang cocok dengan. dan kemudian bekerja mundur sampai .. dan. lihat direktori yang sama. Setelah selesai melakukan itu, ia tahu apa direktori kerja Anda saat ini.Ketika Anda menjalankan
pwd
shell built-in, itu tidak mengikuti prosedur ini (meskipun mungkin melakukan beberapa jika diperlukan) - sebagai gantinya, ia mengingat jalur yang Anda ambil untuk sampai ke sini. Jadi setiap kali Anda melakukancd
perintah, shell Anda akan mengingatnya sebagai bagian dari jalur untuk mencapai tempat Anda sekarang, danpwd
mencetak apa yang telah dihitung berdasarkan semuacd
perintah yang telah Anda lakukan - yang mungkin atau mungkin bukan aktual Anda direktori kerja.Hal-hal bisa menjadi sangat aneh ketika Anda melakukan
ln -s . foo
dan tetapcd
masuk ke foo -/bin/pwd
akan mengatakan Anda masih di direktori yang sama, tetapi shell builtinpwd
akan mengatakan Anda berada di/foo/foo/foo/foo/foo/foo
- meskipun tidak ada direktori seperti itu benar-benar ada. (Yang mengatakan - Anda mungkin bisacd
ke dalamnya.)Sumber lain kebingungan ada jika direktori diubah namanya.
/bin/pwd
akan segera mengambil perubahan, tetapi built-inpwd
tidak akan sampai Anda melakukan sesuatu yang memberi tahu bahwa nama direktori lama tidak masalah.sumber
pwd
dibangun dan/bin/pwd
dan menjelaskan bagaimana versi yang berdiri sendiri memberikan informasi yang lebih berguna (yang dapat menjawab pertanyaan asli).-P
dan yang-L
disebutkan oleh jawaban lain. Singkatnya, beberapa implementasi default ke satu, beberapa ke yang lain. Pada sistem Centos yang harus saya tangani, built-in bash adalah default ke logis, dan/bin/pwd
default ke fisik, tetapi keduanya menerima opsi baris perintah dan menyetujui hasil ketika mereka diberikan.ls ..
akan menampilkan konten/var/lib
, bukan/home/cpm135/public_html
.cd ..
spesial: shell melakukan pelacakan khusus "bagaimana Anda sampai di sana" dan tidak benar-benar melakukanchdir("..")
panggilan sistem. Sejauh menyangkut kernel, direktori kerja shell Anda saat ini (/proc/self/cwd
) hanyalah mountpoint: inode pair. Ini seperti deskriptor file terbuka pada direktori, itulah sebabnya mengubah nama direktori tidak merusak shell Anda. (cd .
untuk memperbarui$PWD
variabel shell ). Anda membuat poin yang berguna, jadi saya akan menghapus ini ketika diperbaikiPada dasarnya Anda bertanya apakah ada untuk menunjukkan jalur aktual dari direktori kerja saat ini. Nah, ada dengan python dan
os.getcwd()
fungsinyaApa yang Anda lihat di bawah adalah tes kecil dari dalam direktori "VirtualBox VMs" yang terletak di direktori home saya. Pada kenyataannya, ini adalah symlink ke direktori berbeda yang terletak di hard drive yang berbeda, yang dipasang di
/mnt/HDD
.Seperti yang Anda lihat, python
os.getcwd()
menentukan jalur sebenarnya dari direktori, bukan jalur symlink.sumber