ln -s với một đường dẫn liên quan đến pwd


26

Tôi đang cố gắng tạo ra một loạt các liên kết tượng trưng, ​​nhưng tôi không thể hiểu tại sao điều này lại hiệu quả

ln -s /Users/niels/something/foo ~/bin/foo_link

trong khi điều này

cd /Users/niels/something
ln -s foo ~/bin/foo_link

không phải là.

Tôi tin rằng nó có foo_linkliên quan đến việc liên kết với foo /Users/niels/binthay vì/Users/niels/something

Vì vậy, câu hỏi là, làm thế nào để tôi tạo ra một liên kết tượng trưng chỉ đến một đường dẫn tuyệt đối, mà không thực sự gõ nó?

Để tham khảo, tôi đang sử dụng Mac OS X 10.9 và Zsh.

Câu trả lời:


33

Cách dễ nhất để liên kết đến thư mục hiện tại là một đường dẫn tuyệt đối, mà không cần nhập toàn bộ chuỗi đường dẫn sẽ là

ln -s "$(pwd)/foo" ~/bin/foo_link

Đối số target(đầu tiên) cho ln -slệnh hoạt động liên quan đến vị trí của liên kết tượng trưng, ​​không phải thư mục hiện tại của bạn. Nó giúp biết rằng, về cơ bản, symlink đã tạo (đối số thứ hai) chỉ đơn giản giữ văn bản bạn cung cấp cho đối số đầu tiên.

Do đó, nếu bạn làm như sau:

cd some_directory
ln -s foo foo_link

và sau đó di chuyển liên kết đó xung quanh

mv foo_link ../some_other_directory
ls -l ../some_other_directory

bạn sẽ thấy rằng foo_link cố gắng trỏ đến footrong thư mục mà nó đang nằm. Điều này cũng hoạt động với các liên kết tượng trưng chỉ đến các đường dẫn tương đối. Nếu bạn làm như sau:

ln -s ../foo yet_another_link

và sau đó di chuyển yet_another_linkđến một thư mục khác và kiểm tra xem nó trỏ đến đâu, bạn sẽ thấy rằng nó luôn luôn trỏ đến ../foo. Đây là hành vi dự định, vì nhiều lần các liên kết tượng trưng có thể là một phần của cấu trúc thư mục có thể nằm trong các đường dẫn tuyệt đối khác nhau.

Trong trường hợp của bạn, khi bạn tạo liên kết bằng cách gõ

ln -s foo ~/bin/foo_link

foo_linkchỉ cần giữ một liên kết đến foo, liên quan đến vị trí của nó. Đặt $(pwd)trước tên của đối số đích chỉ cần thêm đường dẫn tuyệt đối của thư mục làm việc hiện tại, để liên kết được tạo với một mục tiêu tuyệt đối.


"... giúp tưởng tượng rằng liên kết tượng trưng được tạo ra chỉ đơn giản là giữ văn bản ...." Đây có phải là sự thật theo nghĩa đen không?
tự đại diện

1
Nó là. Có lẽ tôi có thể thay đổi tưởng tượng thành "biết" hoặc "hiểu".
Achilleas

Có lẽ tôi đã nhận được nhầm lẫn (một lần nữa). Có vẻ như bạn nói "mục tiêu" bạn có nghĩa là "nguồn". Đối số source_file(đầu tiên) là nơi các điểm liên kết, đó là nguyên văn những gì bạn nhập vào lệnh. Đối số target_file(thứ hai) trở thành tên của liên kết trừ khi những gì bạn nhập là một thư mục, trong trường hợp đó, tên liên kết giống với tên cơ sở của source_filenhưng được đặt trong thư mục target_file.
Charlie Gorichanaz

Y̶o̶u̶'̶r̶e̶ đúng, ̶ ̶t̶h̶e̶r̶e̶'̶s̶ một sai lầm trong ̶a̶n̶s̶w̶e̶r̶.̶ điên nó như thế nào, đã không hề bị bắt ̶s̶o̶o̶n̶e̶r̶.̶ ̶F̶i̶x̶i̶n̶g̶.̶ Không, câu trả lời là đúng. Theo lnmanpage, targetlà đối số đầu tiên (trong đó liên kết trỏ đến ) trong khi đối số thứ hai được gọi đơn giản là link( sourcekhông được đề cập).
Achilleas

3
Trong linux (gnu ln), trang man gọi đối số thứ nhất targetvà đối số thứ hai link( man7.org/linux/man-pages/man1/ln.1.html ). Nhưng trong BSD (bao gồm cả OS X), cái đầu tiên được gọi sourcevà cái thứ hai target( freebsd.org/cgi/man.cgi?ln ). Hơi bối rối.
cristoper

5

Sử dụng cờ -r( --relative) sẽ làm cho công việc này:

ln -sr foo ~/bin/foo_link

4
Coi chừng đó -rlà GNUism, tức là không phải POSIX nên sẽ không hoạt động trong trường hợp OP vì lnlệnh OS X tiêu chuẩn dựa trên BSD.
jlliagre

2

Để lưu một số gõ, bạn có thể làm

ln -s "$PWD"/foo ~/bin/foo_link

@Freddy, nó phụ thuộc vào vỏ. Trong cá hoặc zsh, nó sẽ ổn thôi. Trong các shell giống như Bourne bao gồm bash và với giá trị mặc định là $ IFS, SPC thực sự sẽ là một vấn đề, nhưng cũng là TAB, NL và tất cả các ký tự toàn cầu (ít nhất là *, ?[...]).
Stéphane Chazelas

@ StéphaneChazelas Vâng, bạn đúng và câu hỏi được gắn thẻ bash, vì vậy, nói chung là một ý tưởng tốt để trích dẫn nó. Xấu của tôi, lẽ ra tôi phải cụ thể hơn
Freddy

0

Làm thế nào về:

 $ cd /Users/niels/something
 $ ln -s ./foo ~/bin/foo_link

1
Không, không làm trò bịp.
Niels B.
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.