パスチェックはpwd(シンボルリンクディレクトリ)によって異なります。

パスチェックはpwd(シンボルリンクディレクトリ)によって異なります。

これは/sys/bus木の下で頻繁に発生します(bash-5.1)。

次のように、foo異なるディレクトリへの複数のシンボリックリンクを一覧表示するディレクトリがあるとします。ls -ails pathto_foo

lrwxrwxrwx 1 root root    0 21 foo1 -> whatever relative path to symlinked foo1
lrwxrwxrwx 1 root root    0 21 foo2 -> whatever relative path to symlinked foo2

これらの各シンボリックリンクディレクトリには、次の一般的なファイルが含まれていますbar
現在の作業ディレクトリをまたはpathto_foo/foo1に変更すると、問題なく、、...を実行pathto_foo/foo2できます。filestatcatbar

しかし、私のパスワードはpathto-foo/foo1(またはpathto_foo/foo2)に設定されており、sat-ing / c-ating / file-ing ../foo2/bar../foo1/barそれぞれ)は体系的に次のものを返します。

../foox/bar : No such file or directory

いいね!私はこの非常に望ましくない行動をある程度理解して受け入れることができますが、次の不一致は理解しても受け入れません。

これら2つのディレクトリのいずれかにある場合は、pathto_foo/foo1stat/cat/file ../foo1/barはい! pwd の相対パスを意味します。) 私は成功します。

それでは、パスチェックがpwdに依存するのはなぜですか? (パスワードの相対パスが同様に作成された他の相対パスと異なるのはなぜですか?)
これを防ぎ、パスワードに関係なく同じ回答(成功または失敗)を取得する方法は?

ベストアンサー1

ディレクトリには自分自身を指す複数のシンボリックリンクがありますが、シンボリックリンクに関係なく、実際の親ディレクトリは1つだけです。

したがって、/sys/bus/pathto_foo2つのシンボリックリンクが含まれています。

lrwxrwxrwx 1 root root    0 21 foo1 -> /sys/some/where/foo1
lrwxrwxrwx 1 root root    0 21 foo2 -> /sys/else/where/foo2

cdあなたがいるときpathto_foo

  • あなたのcat foo1/bar地図cat /sys/some/where/foo1/bar
  • あなたのcat foo2/bar地図cat /sys/else/where/foo2/bar

aを実行すると、実際の作業ディレクトリはcd foo1実際ではありませんが、シェル(/sys/bus/pathto_foo/foo1/sys/some/where/foo1そして殻だけ)あなたが何と呼んだのか覚えています/sys/bus/pathto_foo/foo1

これで、cat ../foo1/barシンボリック..リンク/sys/some/where/とそれが指す実際のディレクトリの両方に便利な名前が付けられるため、フルパスfoo1/sys/some/where/foo1/bar期待どおりになります。

しようとすると、にcat ../foo2/barマップされますが、サブディレクトリ/sys/some/where/foo2/barはありません。foo2/sys/some/where

実際に起こるのは、ディレクトリツリーのまったく異なる分岐にあることですfoo2/sys/else/where/foo2

ここに来るために使用したシンボリックリンクは/sys/bus/pathto_foo次の場所にあります。実際ではない ../sys/some/where/foo1

aを実行するときのcd ..最新のPOSIX互換シェルのデフォルト値はbash論理的親ディレクトリに移動します。ユーザーが現在のディレクトリに到達するために使用するパスの右端の要素を切り取り、そのパスに変更します。

他のほとんどのプログラムは、「親ディレクトリ」の概念を単に「..ファイルシステムによって提供されるディレクトリエントリ」として理解しています。物理親。

このコマンドには、cd実際に切り替えるパスの論理的または物理的解釈を明示的に要求する2つのオプションがbashあります。どちらのオプションも指定しないと、組み込みのデフォルト値は実際のように動作しますので、上記の手順に従ってください。このオプションを使用すると、コマンドは他のすべてのプログラムのように動作し、使用されるたびに実際の親ディレクトリに変わります。-L-P-L-Pcd..

シェルのこの(バグ付き)機能が気に入らない場合は、それを無効にするシェル固有の方法があるかもしれません。bashシェルの場合、または同様のシェル起動スクリプトにまたはをset -P追加すると、bashは明示的に使用されない限り、すべてのcdコマンドに対応するオプションがあるかのように機能します。set -o physical~/.bashrc-P-L

おすすめ記事