ln -s(pwdに相対的なパスを含む)


26

たくさんのシンボリックリンクを作成しようとしていますが、なぜこれが機能しているのかわかりません

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

これながら

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

ではありません。

私はそれが代わりfoo_linkにfooにリンクすることに関係があると信じています/Users/niels/bin/Users/niels/something

質問は、実際に入力せずに絶対パスを指すシンボリックリンクを作成するにはどうすればよいかということです。

参考のため、Mac OS X 10.9およびZshを使用しています。

回答:


33

パス文字列全体を入力せずに、絶対パスとして現在のディレクトリにリンクする最も簡単な方法は

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

コマンドのtarget(最初の)引数ln -sは、現在のディレクトリではなく、シンボリックリンクの場所に関連して機能します。基本的に、作成されたシンボリックリンク(2番目の引数)は、最初の引数に指定したテキストを単に保持していることを知るのに役立ちます。

したがって、次のことを行う場合:

cd some_directory
ln -s foo foo_link

その後、そのリンクを移動します

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

そこにあるディレクトリを指すようにfoo_link 試みることがわかりますfoo。これは、相対パスを指すシンボリックリンクでも機能します。以下を行う場合:

ln -s ../foo yet_another_link

そして、yet_another_link別のディレクトリに移動して、それが指す場所を確認すると、常にを指していることがわかります../foo。多くの場合、シンボリックリンクはさまざまな絶対パスに存在できるディレクトリ構造の一部である可能性があるため、これは意図された動作です。

あなたの場合、次のように入力してリンクを作成するとき

ln -s foo ~/bin/foo_link

foo_linkfoo位置への相対リンクを保持しています。$(pwd)ターゲット引数の名前の前に置くと、現在の作業ディレクトリの絶対パスが追加されるだけなので、リンクは絶対ターゲットで作成されます。


「... 作成されたシンボリックリンクが単にテキストを保持していることを想像するのに役立ちます。...」 これは文字通りの真実ではありませんか?
ワイルドカード

1
そうです。おそらく、想像を「知る」または「理解する」に変えることができます。
アキレアス

おそらく私は(再び)混乱しているのでしょう。「ターゲット」と言うところは「ソース」という意味です。source_file(最初の)引数は、そのまま使用すると、コマンドで入力した内容である。ここで、リンクのポイントです。target_fileあなたが入力したことは、リンク名はのベース名と同じである場合には、ディレクトリでない限り(第2)の引数は、リンクの名前になりますsource_fileが、ディレクトリに置かtarget_file
チャーリーゴリチャーナズ

Y̶o̶u̶'̶r̶e̶右、̶̶t̶h̶e̶r̶e̶'̶s̶AのミスにTHE̶a̶n̶s̶w̶e̶r̶.̶クレイジーどのようにそれ̶d̶i̶d̶n̶'̶t̶GETキャッチ̶s̶o̶o̶n̶e̶r̶.̶̶F̶i̶x̶i̶n̶g̶.̶いいえ、答えは正しかったです。lnマンページ、target最初の引数(ここで、リンク点で第二引数は、単にと呼ばれるのに対し)linksource言及されていません)。
アキレアス

3
Linux(gnu ln)では、manページは最初の引数targetと2番目の引数linkman7.org/linux/man-pages/man1/ln.1.html)を呼び出します。しかし、BSD(OS Xを含む)では、最初が呼び出さsourceれ、2番目targetfreebsd.org/cgi/man.cgi?ln)が呼び出されます。かなり紛らわしい。
クリストファー

5

-r--relative)フラグを使用すると、この作業が行われます。

ln -sr foo ~/bin/foo_link

4
これ-rはGNUism、つまり非POSIXであることに注意してくださいln。標準のOS X コマンドはBSDベースなので、OPケースでは動作しません。
jlliagre

2

入力を節約するために、次のことができます

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

@Freddy、それはシェルに依存します。魚やzshでは、問題ありません。bashを含むBourneのようなシェルで、デフォルト値が$ IFSの場合、SPCは実際に問題になりますが、TAB、NLおよびすべてのグロビング文字(少なくとも*?および[...])も問題になります。
ステファンシャゼル

@StéphaneChazelasはい、あなたは正しいです。質問にはのタグが付いているbashので、一般的に引用することをお勧めします。私の悪い、私はもっと具体的だったはずです。
フレディ

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.