Bagaimana cara mengetahui apakah saya sebenarnya berada di lokasi symlink dari baris perintah?

33

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 pwdakan bilang aku di/home/cpm135/public_html/class

Apakah ada cara untuk mengetahui bahwa saya "benar-benar" /var/lib/class? Terima kasih

Oliver Williams
sumber
1
Beberapa shell sebenarnya tidak memungkinkan Anda untuk berada di dalam symlink. Misalnya, fishshell secara otomatis menyelesaikan symlink ketika Anda cdmasuk ke dalamnya.
trysis

Jawaban:

56

Bergantung pada bagaimana pwdperintah Anda dikonfigurasi, mungkin default untuk menampilkan direktori kerja logis (keluaran oleh pwd -L) yang akan menunjukkan lokasi symlink, atau direktori kerja fisik (keluaran oleh pwd -P) yang mengabaikan symlink dan menunjukkan direktori "nyata".

Untuk informasi lengkap bisa Anda lakukan

file "$(pwd -L)"

Di dalam symlink, ini akan kembali

/path/of/symlink: symbolic link to /path/of/real/directory
Zanna
sumber
1
ya, -Pbendera itu yang saya butuhkan. Terima kasih
Oliver Williams
6
Untuk juga menjawab pertanyaan dalam judul, cukup gunakan test "$(pwd -L)" = "$(pwd -P)" && echo No symlinks(atau ganti && echo No symlinksdengan || echo Symlinks).
CVn
1
Ini menjawab pertanyaan dengan sempurna tanpa perlu bergaung. Jika pertanyaannya adalah 'Bagaimana cara menampilkan pesan jika saya berada di direktori yang disinkronkan? "Maka diperlukan gema.
Arronical
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 menggunakan realpath ., yang menurut saya setara denganpwd -P
Peter Cordes
17

Perhatikan bahwa pwdsebenarnya 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:

NAME
       pwd - print name of current/working directory

SYNOPSIS
       pwd [OPTION]...

DESCRIPTION
       Print the full filename of the current working directory.

       -L, --logical
              use PWD from environment, even if it contains symlinks

       -P, --physical
              avoid all symlinks

       --help display this help and exit

       --version
              output version information and exit

       If no option is specified, -P is assumed.

       NOTE:  your  shell  may  have  its  own  version of pwd, which usually supersedes the version described here.  Please refer to your shell's documentation for
       details about the options it supports.

Secara umum, Anda dapat menyelesaikan jalur kanonik lengkap dari semua file / direktori menggunakan readlink -f. readlink -f .bekerja mirip dengan pwd -P.

Gowtham
sumber
2
Meskipun saya telah belajar dengan cara yang sulit yang readlink -ftidak tersedia di semua Unices (misalnya tidak tersedia di OS-X)
abligh
3

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 atas ls -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 pwdshell 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 melakukan cdperintah, shell Anda akan mengingatnya sebagai bagian dari jalur untuk mencapai tempat Anda sekarang, dan pwdmencetak apa yang telah dihitung berdasarkan semua cdperintah yang telah Anda lakukan - yang mungkin atau mungkin bukan aktual Anda direktori kerja.

Hal-hal bisa menjadi sangat aneh ketika Anda melakukan ln -s . foodan tetap cdmasuk ke foo - /bin/pwdakan mengatakan Anda masih di direktori yang sama, tetapi shell builtin pwdakan mengatakan Anda berada di /foo/foo/foo/foo/foo/foo- meskipun tidak ada direktori seperti itu benar-benar ada. (Yang mengatakan - Anda mungkin bisa cd ke dalamnya.)

Sumber lain kebingungan ada jika direktori diubah namanya. /bin/pwdakan segera mengambil perubahan, tetapi built-in pwdtidak akan sampai Anda melakukan sesuatu yang memberi tahu bahwa nama direktori lama tidak masalah.

dougmc
sumber
1
Anda tidak menjawab pertanyaan, Anda mengabaikannya.
Dmitry Grigoryev
4
Meskipun ini tidak menjawab pertanyaan secara langsung , saya pikir ini adalah posting yang berguna untuk memahami perbedaan antara shell yang pwddibangun dan /bin/pwddan menjelaskan bagaimana versi yang berdiri sendiri memberikan informasi yang lebih berguna (yang dapat menjawab pertanyaan asli).
Anthony G - keadilan untuk Monica
1
Perbedaan-perbedaan ini semuanya bermuara pada opsi -Pdan yang -Ldisebutkan 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/pwddefault ke fisik, tetapi keduanya menerima opsi baris perintah dan menyetujui hasil ketika mereka diberikan.
IMSoP
1
Pertanyaannya didasarkan pada premis yang salah - 'adakah cara untuk mengetahui bahwa saya "benar-benar" di / var / lib / class?' Yang mengatakan ... dengan menjelaskan apa artinya itu, itu membantunya memahami apa yang sebenarnya dia cari. Opsi pwd -P dan -L telah disebutkan ...
dougmc
1
Argumen Anda terbalik. 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 melakukan chdir("..")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 $PWDvariabel shell ). Anda membuat poin yang berguna, jadi saya akan menghapus ini ketika diperbaiki
Peter Cordes
1

Pada dasarnya Anda bertanya apakah ada untuk menunjukkan jalur aktual dari direktori kerja saat ini. Nah, ada dengan python dan os.getcwd()fungsinya

Apa 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.

bash-4.3$ file "$(pwd)"
/home/xieerqi/VirtualBox VMs: symbolic link to /mnt/HDD/VirtualBox VMs/
bash-4.3$ python -c 'import os; print os.getcwd()'
/mnt/HDD/VirtualBox VMs

Seperti yang Anda lihat, python os.getcwd()menentukan jalur sebenarnya dari direktori, bukan jalur symlink.

Sergiy Kolodyazhnyy
sumber