Làm thế nào để có được đường dẫn được giải quyết đầy đủ của một liên kết tượng trưng trong Terminal?


47

Tôi có một mớ hỗn độn cài đặt python trên máy tính xách tay của tôi. Tôi đã nhìn vào các tệp thực thi /usr/local/binvà tất cả chúng đều là các liên kết tượng trưng đến../../../Library......

Có một số hành vi kỳ lạ xung quanh điều này. Nếu tôi ls -lhaGthấy tôi --->và đường dẫn tương đối ở bên phải của các liên kết tượng trưng:

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

Tuy nhiên, tôi dường như không thể có bất kỳ công cụ dòng lệnh nào để giải quyết đường dẫn đó và hiển thị đường dẫn thực tế đến python3. Tôi đã tìm thấy một số mẩu tin ở đây và ở đó liên quan đến việc sử dụng pwd -Pfindtiện ích để làm điều này. Vấn đề là những cái này dường như không hoạt động trên OS X theo cách mà mọi người mô tả chúng hoạt động trên linux (nghĩa là xuất ra đường dẫn đầy đủ đến liên kết tượng trưng). Họ chỉ in đường dẫn liên kết tượng trưng cho tôi:

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

Bất cứ ý tưởng về những gì đang xảy ra ở đây?

Câu trả lời:


36

Tôi nghĩ rằng pwd -Preadlinksẽ là bạn của bạn cho nhiệm vụ này.

" Làm cách nào tôi có thể có được hành vi của readlink của GNU -f trên máy Mac? " Là một tài nguyên tiện dụng.

pwd -P chỉ hoạt động nếu bạn ở trong thư mục symlink:

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

readlink hoạt động bằng cách chỉ định mục tiêu (do đó nó có thể được sử dụng đối với các tệp):

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

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

Đầu ra của readlinkdường như là tương đối với cha mẹ của mục tiêu được chỉ định.

Vd: Cha mẹ của /var/, vì vậy private/varlà chính xác, liên quan đến /. Theo ví dụ trên của tôi bin -> Applications, cả hai đều nằm trong Thư mục nhà của tôi, bất kể tôi chạy nó ở đâu, đầu ra đều giống nhau.


3
readlink không lặp lại thông qua trường hợp symlink trỏ đến các symlink khác. Tôi sẽ không gọi đó là "giải quyết hoàn toàn"
James Roth

Điều này dường như không hoạt động với câu hỏi của OP về liên kết tượng trưng đến những thứ được chỉ định với những thứ như ../...
dùng124384

18

Điều này giải quyết đệ quy và trả về một đường dẫn tuyệt đối:

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

Hoặc phiên bản không tương tác:

python -c "import os; print(os.path.realpath('/usr/local/bin/python3'))"

1
Khi nội dung thất bại, bạn dùng đến kịch bản ... Tốt đẹp. Chắc chắn hoạt động: $ python -c "import os; print os.path.realpath('bin')">> /Users/jason/Applications. Tôi symlink ~ / bin đến ~ / Ứng dụng để có một .bash_profile / $ PATH hợp nhất trên các hệ thống Mac và * nix.
Jason Salaz

1
Điều này thật tuyệt và nó hoạt động tốt! Tôi sẽ đánh dấu nó là câu trả lời ngoại trừ tôi cũng muốn biết liệu có cách nào để thực hiện việc này trong trình bao như bạn có thể trên các hệ thống * nix khác không.
Robert S Ciaccio

1
Làm thế nào để bạn làm điều đó trên các hệ thống * nix khác? Ngoài ra, Python được cài đặt gần như phổ biến trên các hệ thống Linux hiện nay.
Jason Salaz

@vxjasonxv những thứ tôi tìm thấy vào thời điểm tôi gặp rắc rối với điều này gợi ý rằng các lệnh pwdfindlệnh tôi đã nói trong câu hỏi giải quyết toàn bộ đường dẫn trên các hệ thống khác ngoài OS X. Mặc dù vậy, tôi chưa thử nghiệm chúng.
Robert S Ciaccio


1

GNU coreutils-8.15 được thêm vào năm 2012 một công cụ dòng lệnh mới realpaththực hiện những gì bạn muốn: nó giải quyết các chuỗi liên kết tượng trưng và đưa ra kết quả là một đường dẫn tuyệt đối (mặc định) hoặc tương đối.

Apple chưa bao gồm realpathtrong macOS (đáng buồn là họ dường như tránh xa tất cả các công cụ GPLv3), nhưng bạn có thể dễ dàng cài đặt nó, ví dụ như sử dụng Homebrew : brew install coreutils.


-2

Bạn có thể sử dụng readlink -f. Nó đệ quy thông qua tất cả các liên kết. Giả sử liên kết là một đường dẫn xa hơn một liên kết. Bạn muốn có con đường tuyệt đối cuối cùng.


Huh? Bạn đang nói chính xác là gì?
Cướp

Cú pháp đúng cho những gì @DINESH SEHRA đang nói là sử dụng read link -f python3chẳng hạn, và nó sẽ đệm toàn bộ liên kết tượng trưng cho bạn.
Danijel-James W

3
Rõ ràng không được đăng bởi người dùng OS X như -fchưa từng tồn tại trên phiên bản OS X của đường dẫn đọc.
sorin
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.