ln -s では特定のディレクトリにいる必要がありますか?

ln -s では特定のディレクトリにいる必要がありますか?

ファイルへの単純なシンボリックリンクを作成したいと思います。

シンボリックリンクを作成したいディレクトリ内からコマンドを実行すると、完璧に動作します。

/path/to/link $ ln -s /path/to/file .

しかし、他のディレクトリにいる場合は、毎回壊れたリンクが作成されます。

/any/other/path $ ln -s /path/to/file /path/to/link

ln -s特定のディレクトリにいる必要がありますか、それとも何か見落としているのでしょうか? Ubuntu 10.04 を実行しています。

アップデート:パスが相対パスか絶対パスかという混乱をお詫びします。相対パスでした。何人かの回答者が述べているように、これが私の問題の原因でした。ありがとうございます!

答え1

ターゲットと同じディレクトリにいない場合は、絶対パスを使用する必要があります。

ln -s foo/bar baz/quux # fails

ln -s ~/foo/bar baz/quux # succeeds

答え2

私はよく使う

ln -s $(pwd)/local_file /path/to/link

ローカル ファイルをリンクする必要がある場合。

答え3

これは私にとって常に直感的ではありません。私は次のようにする習慣があります:

ln -s $(readlink -f /path/to/file) /path/to/link

これは動作するはずですが、実際のディスク上のリンクでは非相対的になるという代償があります。

答え4

実際には、どのディレクトリにいるかは関係ありません。作成するシンボリックリンクが重要です。シンボリックリンクとは、ファイルを指すパスを含むファイルです。文字で始まるパスを含むシンボリックリンクを作成すること/も、その文字で始まらないシンボリックリンクを作成することもできます。..パスコンポーネントを含むシンボリックリンクを作成することも、含まないシンボリックリンクを作成することもできます。プログラムがシンボリックリンクを解決してターゲットファイルを見つけるとき、パスはシンボリックリンクを含むディレクトリに対する相対パスであると解釈されます。したがって、必要なパスがシンボリックリンクに含まれていることを確認するだけで済みます。

これはマシュー・フラッシェンの答えに似た方法ですが、ここでは相対的シンボリックリンク:

/tmp$ mkdir -p spam/eggs/ham
/tmp$ mkdir foo
/tmp$ python -c "import os, sys; print os.path.relpath(sys.argv[1], os.path.abspath(sys.argv[2])), sys.argv[2]" $(readlink -e foo) spam/eggs/ham  | xargs ln -s 
/tmp$ ls -l spam/eggs/ham/foo
lrwxrwxrwx 1 user user 12 2012-02-05 15:12 spam/eggs/ham/foo -> ../../../foo

純粋な Bourne / bash シェルでも実行できることは間違いありませんが、Python でこれを正しく記述 (および読み取り) するのは簡単です。

関連情報