Bagaimana cara mendapatkan jalur tautan simbolik yang sepenuhnya terselesaikan di Terminal?

47

Saya memiliki kekacauan instalasi python kusut di laptop saya. Saya sedang melihat executable /usr/local/bindan mereka semua adalah tautan simbolik ke../../../Library......

Ada beberapa perilaku aneh di sekitar ini. Jika saya lakukan, ls -lhaGsaya melihat --->dan jalur relatif ke kanan symlink:

lrwxr-xr-x  1 root  wheel    69B Dec  7 22:29 python3 -> ../../../Library/Frameworks/Python.framework/Versions/3.1/bin/python3

Namun, sepertinya saya tidak bisa mendapatkan alat baris perintah untuk menyelesaikan jalur itu dan menampilkan jalur sebenarnya ke python3. Saya telah menemukan beberapa informasi penting di sana-sini mengenai penggunaan pwd -Pdan findutilitas untuk melakukan ini. Masalahnya adalah bahwa ini sepertinya tidak berfungsi pada OS X seperti yang orang-orang gambarkan mereka bekerja di linux (yaitu mengeluarkan path lengkap ke link simbolik). Mereka hanya mencetak jalur tautan simbolik untuk saya:

FantasticMrFox:bin robert$ pwd -P python3
/usr/local/bin
FantasticMrFox:bin robert$ find `pwd -P` -name python3
/usr/local/bin/python3

Ada ide tentang apa yang terjadi di sini?

Robert S Ciaccio
sumber

Jawaban:

36

Saya pikir itu pwd -Pdan readlinkakan menjadi teman Anda untuk tugas ini.

" Bagaimana saya bisa mendapatkan perilaku readlink -f GNU di Mac? " Adalah sumber yang berguna.

pwd -P hanya berfungsi jika Anda berada di dalam direktori symlink:

14:07:13 jason@mac ~ $ cd bin
14:08:08 jason@mac bin $ pwd -P
/Users/jason/Applications

readlink bekerja dengan menentukan target (sehingga dapat digunakan terhadap file):

14:09:03 jason@mac ~ $ readlink bin
Applications

14:09:34 jason@mac ~ $ readlink /var
private/var

Output dari readlinktampaknya relatif terhadap induk dari target yang ditentukan.

Ex: The induk /varadalah /, sehingga private/varbenar, relatif terhadap /. Per contoh saya di atas bin -> Applications, keduanya ada di Home Directory saya, di mana pun saya menjalankannya, hasilnya sama.

Jason Salaz
sumber
3
readlink tidak berulang melalui case di mana symlink menunjuk ke symlink lain. Saya tidak akan menyebut itu "sepenuhnya diselesaikan"
James Roth
Tampaknya ini tidak berfungsi dengan pertanyaan OP tentang symlink ke hal-hal yang ditentukan dengan hal-hal seperti ../...
user124384
18

Ini menyelesaikan secara rekursif dan mengembalikan jalur absolut:

$ python
>>> import os
>>> os.path.realpath("/usr/local/bin/python3")

Atau versi non-interaktif:

python -c "import os; print(os.path.realpath('/usr/local/bin/python3'))"
James Roth
sumber
1
Saat bawaan gagal, gunakan skrip ... Bagus. Pasti berfungsi: $ python -c "import os; print os.path.realpath('bin')">> /Users/jason/Applications. Saya symlink ~ / bin to ~ / Applications agar memiliki .bash_profile / $ PATH terpadu di seluruh sistem Mac dan * nix.
Jason Salaz
1
ini bagus dan bekerja dengan baik! Saya akan menandainya sebagai jawaban kecuali saya juga ingin tahu apakah ada cara untuk melakukan ini di shell seperti yang Anda dapat pada sistem * nix lainnya.
Robert S Ciaccio
1
Bagaimana Anda melakukannya pada sistem * nix lainnya? Juga, Python diinstal hampir secara universal pada sistem Linux saat ini.
Jason Salaz
@vxjasonxv hal-hal yang saya temukan pada saat saya bermain-main dengan ini menyarankan agar pwddan findperintah yang saya bicarakan dalam pertanyaan menyelesaikan path lengkap pada sistem selain OS X. Namun saya belum mengujinya.
Robert S Ciaccio
1

GNU coreutils-8.15 menambahkan pada tahun 2012 alat baris perintah baru realpathyang melakukan apa yang Anda inginkan: ia menyelesaikan rantai tautan simbolik dan menampilkan hasilnya sebagai jalur absolut (default) atau relatif.

Apple tidak belum termasuk realpathdi MacOS (mereka tampaknya sedih untuk menghindari semua alat GPLv3), tetapi Anda dapat dengan mudah menginstal sendiri, misalnya dengan menggunakan Homebrew: brew install coreutils.

Markus Kuhn
sumber
-2

Anda bisa menggunakan readlink -f. Itu berulang melalui semua tautan. Misalkan tautan menuju jalur yang lebih jauh dari tautan. Anda ingin memiliki jalur absolut terakhir.

DINESH SEHRA
sumber
Hah? Apa yang sebenarnya kamu katakan?
Rob
Sintaks yang benar untuk apa yang @DINESH SEHRA katakan adalah untuk digunakan read link -f python3misalnya, dan itu akan buffer link simbolis penuh untuk Anda.
Danijel-James W
3
Jelas tidak diposting oleh pengguna OS X karena -ftidak pernah ada di OS X versi readlink.
sorin