web-dev-qa-db-ja.com

ln -sはpwdからの相対パス

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

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

この間

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

ではありません。

foo_linkではなく/Users/niels/binのfooへの/Users/niels/somethingリンクに関係していると思います

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

参考までに、Mac OS X 10.9とZshを使用しています。

28
Niels B.

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

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

_ln -s_コマンドのtarget(最初の)引数は、現在のディレクトリではなく、シンボリックリンクの場所に相対的に機能します。基本的に、作成されたシンボリックリンク(2番目の引数)は、最初の引数に指定したtextを保持するだけであることを理解するのに役立ちます。

したがって、次の操作を行った場合:

_cd some_directory
ln -s foo foo_link
_

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

_mv foo_link ../some_other_directory
ls -l ../some_other_directory
_

_foo_link_ triesが存在するディレクトリのfooを指すことがわかります。これは、相対パスを指すシンボリックリンクでも機能します。次の場合:

_ln -s ../foo yet_another_link
_

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

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

_ln -s foo ~/bin/foo_link
_

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

35
Achilleas

-r--relative)フラグを使用すると、これが機能します。

ln -sr foo ~/bin/foo_link
7
Geremia

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

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

どうですか:

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