web-dev-qa-db-ja.com

シンボリックリンクのフルパスを常に解決するようにbashを構成する方法

モデレーター:これは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()システムコールの物理的な出力と一致させる必要があります。それらの質問はそれについて全く話しません。

5
Jon Watte

これには シェル全体のオプション があります:

-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
8
muru

これはあなたが聞きたいことではないかもしれませんが、ファイルへの標準的なパスの考え方には欠陥があると私は主張します。

最初に、既存のファイルへのハードリンクを作成すると、文字通り同じファイルへの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

次に、コンテキストに応じて、ファイルを参照する方法はたくさんあります。

  • ハードリンクまたはシンボリックリンクへの相対パス
  • ハードリンクまたはシンボリックリンクへの絶対パス(上記のように複数)
  • file:/// absolute/path/to/fileまたはその他のプロトコル

これらはすべて、さまざまな状況で役立ちます。

第三に、Bashは何も「ふり」していません;幻想はありません、あなたは本当にそのディレクトリにいます。それがシンボリックリンクであるという事実は、あなたがそれを使って行うほとんどすべての行動に対して透過的でなければなりません。

第四に、シンボリックリンクはBashとは何の関係もありません;これらはファイルシステムの機能であり、シェル、端末、さらにはOSとは関係ありません。そして、すべての主要なファイルシステムはそれらを持っているので、それらを無視しようとすることはおそらくあなたを助けるのではなく妨げになるでしょう。

最後に、明示的に指示されることなくシンボリックリンクを特別に処理するツールは、fixed、である必要があります。これは、bug

0
l0b0