モデレーター:これはIS重複ではありません!!!!重複するマークを削除してください。
リンクされた回答は、実際には、受け入れられた回答のように私の質問に回答しません。グーグルは、この特定の質問に対する実際の回答ではない他の回答のみを指し示します。
ディレクトリへのシンボリックリンクをたどるとき、bash
シェルは、シンボリックリンクが実際のディレクトリであると錯覚させようとします。しかし、これが失敗するケースはたくさんあります。たとえば、次のように考えます。
_/usr/local/src/project-a-1.0/
/usr/local/src/project-b-2.2/
_
次に、ホームディレクトリにシンボリックリンクがあります。
_ln -s /usr/local/src/project-a-1.0 ~/project
_
ここで、_project-a
_を操作するためのショートカットを作成します。
_cd ~/project
_
これまでのところ、とても良いですが、bashは、実際の作業ディレクトリではなく、実際には_~/project
_にいるふりをします。 pwd
ビルトインを使用しているときもふりをしますが、もちろん_/bin/pwd
_実行可能ファイルを使用しているときはそうではありません。
さて、_project-b
_のファイルをチェックアウトしたい場合は、_vim ../project-b<TAB>
_を試してコマンド補完を機能させたいと思うかもしれません。ただし、bash
は、_..
_がユーザーのホームを含むディレクトリであると見なすため、これを完了することを拒否します。
ただし、_vim ../project-b-2.2/somefile.txt
_と入力すると、期待どおりに機能します。
シンボリックリンクはディレクトリではなく、bashのこの機能ミスが原因で、あらゆる種類の不便やエラーが発生します。これをオフにするオプションを検索しようとしましたが、グーグルとスーパーユーザーのヒットはすべて「リンクパスを手動で解決する方法」に関するものです。これは私がここで望んでいることではありません。 bashがファイルシステム上でファイルシステムをエミュレートしようとするのをやめたいのですが、うまくいきません。確かに、幻想の前に正しさを置くいくつかのオプションがありますか?
「同様の質問」ポップアップは、Googleがすでに私に送った他の2つの質問を指しています。どちらの場合も、 "-P"オプションをpwd
またはcd
に渡すか、readlink
を使用してシンボリックリンクターゲットを特定することをお勧めします。それは私が興味を持っていることではありません。組み込みのpwd
とシェルプロンプト_$PWD
_をgetcwd()
システムコールの物理的な出力と一致させる必要があります。それらの質問はそれについて全く話しません。
これには シェル全体のオプション があります:
-P
設定されている場合、現在のディレクトリを変更する
cd
などのコマンドを実行するときに、シンボリックリンクを解決しないでください。代わりに、物理ディレクトリが使用されます。デフォルトでは、Bashは、現在のディレクトリを変更するコマンドを実行するときに、ディレクトリの論理チェーンに従います。たとえば、/ usr/sysが/ usr/local/sysへのシンボリックリンクである場合、次のようになります。
$ cd /usr/sys; echo $PWD /usr/sys $ cd ..; pwd /usr
set -P
がオンの場合:$ cd /usr/sys; echo $PWD /usr/local/sys $ cd ..; pwd /usr/local
したがって、これにより、必要な動作が得られるはずです。
set -P
これはあなたが聞きたいことではないかもしれませんが、ファイルへの標準的なパスの考え方には欠陥があると私は主張します。
最初に、既存のファイルへのハードリンクを作成すると、文字通り同じファイルへの2つの異なるパス:になります。
$ cd "$(mktemp --directory)"
$ touch foo
$ ln foo bar
$ ls --inode
1223418 bar 1223418 foo
これら2つの間に「オリジナル」はなく、名前を除いて同じメタデータを保持します。
$ touch --date='2001-02-03 04:05:06.789' bar
$ ls -lA
total 0
[…] Feb 3 2001 bar
[…] Feb 3 2001 foo
次に、コンテキストに応じて、ファイルを参照する方法はたくさんあります。
これらはすべて、さまざまな状況で役立ちます。
第三に、Bashは何も「ふり」していません;幻想はありません、あなたは本当にそのディレクトリにいます。それがシンボリックリンクであるという事実は、あなたがそれを使って行うほとんどすべての行動に対して透過的でなければなりません。
第四に、シンボリックリンクはBashとは何の関係もありません;これらはファイルシステムの機能であり、シェル、端末、さらにはOSとは関係ありません。そして、すべての主要なファイルシステムはそれらを持っているので、それらを無視しようとすることはおそらくあなたを助けるのではなく妨げになるでしょう。
最後に、明示的に指示されることなくシンボリックリンクを特別に処理するツールは、fixed、である必要があります。これは、bug。