ln -s dengan path relatif ke pwd

26

Saya mencoba membuat banyak tautan simbolik, tetapi saya tidak tahu mengapa ini berhasil

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

sementara ini

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

tidak.

Saya percaya ini ada hubungannya dengan foo_linkmenautkan ke foo in /Users/niels/binalih-alih/Users/niels/something

Jadi pertanyaannya adalah, bagaimana cara membuat tautan simbolis yang menunjuk ke jalur absolut, tanpa benar-benar mengetiknya?

Untuk referensi, saya menggunakan Mac OS X 10.9 dan Zsh.

Niels B.
sumber

Jawaban:

33

Cara termudah untuk menautkan ke direktori saat ini sebagai jalur absolut, tanpa mengetikkan keseluruhan string jalur

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

The target(pertama) argumen untuk ln -sperintah bekerja relatif ke lokasi link simbolik ini, tidak direktori Anda saat ini. Ini membantu untuk mengetahui bahwa, pada dasarnya, symlink yang dibuat (argumen kedua) hanya menyimpan teks yang Anda berikan untuk argumen pertama.

Karena itu, jika Anda melakukan hal berikut:

cd some_directory
ln -s foo foo_link

dan kemudian memindahkan tautan itu

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

Anda akan melihat bahwa foo_link mencoba menunjuk ke foodalam direktori di mana ia berada. Ini juga berfungsi dengan tautan simbolik yang menunjuk ke jalur relatif. Jika Anda melakukan hal berikut:

ln -s ../foo yet_another_link

dan kemudian pindah yet_another_linkke direktori lain dan periksa ke mana ia menunjuk, Anda akan melihat bahwa itu selalu menunjuk ke ../foo. Ini adalah perilaku yang dimaksudkan, karena banyak kali tautan simbolik mungkin menjadi bagian dari struktur direktori yang dapat berada di berbagai jalur absolut.

Dalam kasus Anda, saat Anda membuat tautan dengan mengetik

ln -s foo ~/bin/foo_link

foo_linkhanya memegang tautan foo, relatif terhadap lokasinya. Menempatkan $(pwd)di depan nama argumen target hanya menambahkan jalur absolut direktori kerja saat ini, sehingga tautan dibuat dengan target absolut.

Achilleas
sumber
"... membantu membayangkan bahwa symlink yang dibuat hanya menampung teks ...." Bukankah ini kebenaran literal?
Wildcard
1
Ini. Mungkin saya bisa mengubah bayangkan menjadi "tahu" atau "mengerti".
Achilleas
Mungkin saya membuat diri saya bingung (lagi). Tampaknya di mana Anda mengatakan "target", maksud Anda "sumber". The source_file(pertama) argumen adalah di mana poin link, yang merupakan verbatim apa yang Anda masukkan pada perintah. The target_file(kedua) argumen menjadi nama link kecuali apa yang Anda masukkan adalah direktori, dalam hal ini nama link adalah sama dengan basename dari source_filetetapi ditempatkan di direktori target_file.
Charlie Gorichanaz
Kau benar, ̶ ̶t̶h̶e̶r̶e̶'̶s̶ kesalahan dalam ̶a̶n̶s̶w̶e̶r̶.̶ gila bagaimana Bariloche, dan tidak terjebak ̶s̶o̶o̶n̶e̶r̶.̶ ̶F̶i̶x̶i̶n̶g̶.̶ Tidak, jawabannya adalah benar. Dengan lnmanual, targetadalah argumen pertama (di mana tautan menunjuk ke ) sedangkan argumen kedua hanya disebut sebagai link( sourcetidak disebutkan).
Achilleas
3
Di linux (gnu ln) halaman manual memanggil argumen pertama targetdan yang kedua link( man7.org/linux/man-pages/man1/ln.1.html ). Tetapi dalam BSD (termasuk OS X) yang pertama dipanggil sourcedan yang kedua target( freebsd.org/cgi/man.cgi?ln ). Cukup membingungkan.
cristoper
5

Menggunakan bendera -r( --relative) akan membuat ini berfungsi:

ln -sr foo ~/bin/foo_link
Geremia
sumber
4
Waspadalah itu -radalah GNUism, yaitu non POSIX sehingga tidak akan berfungsi dalam kasus OP karena lnperintah OS X standar berbasis BSD.
jlliagre
2

Untuk menyimpan beberapa pengetikan, Anda bisa melakukannya

ln -s "$PWD"/foo ~/bin/foo_link
kosinus
sumber
@ Freddy, itu tergantung pada shell. Pada ikan atau zsh, tidak masalah. Dalam cangkang mirip Bourne termasuk bash dan dengan nilai default $ IFS, SPC memang akan menjadi masalah, tetapi juga TAB, NL dan semua karakter globbing (setidaknya *, ?dan [...]).
Stéphane Chazelas
@ StéphaneChazelas Ya, Anda benar dan pertanyaannya ditandai bash, jadi biasanya Anda mengutipnya. Buruk saya, saya harus lebih spesifik.
Freddy
0

Bagaimana tentang:

 $ cd /Users/niels/something
 $ ln -s ./foo ~/bin/foo_link
ptierno
sumber
1
Tidak, tidak melakukan trik.
Niels B.