これは/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
できます。file
stat
cat
bar
しかし、私のパスワードは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/foo1
stat/cat/file ../foo1/bar
(はい! pwd の相対パスを意味します。) 私は成功します。
それでは、パスチェックがpwdに依存するのはなぜですか? (パスワードの相対パスが同様に作成された他の相対パスと異なるのはなぜですか?)
これを防ぎ、パスワードに関係なく同じ回答(成功または失敗)を取得する方法は?
ベストアンサー1
ディレクトリには自分自身を指す複数のシンボリックリンクがありますが、シンボリックリンクに関係なく、実際の親ディレクトリは1つだけです。
したがって、/sys/bus/pathto_foo
2つのシンボリックリンクが含まれています。
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
-P
cd
..
シェルのこの(バグ付き)機能が気に入らない場合は、それを無効にするシェル固有の方法があるかもしれません。bash
シェルの場合、または同様のシェル起動スクリプトにまたはをset -P
追加すると、bashは明示的に使用されない限り、すべてのcdコマンドに対応するオプションがあるかのように機能します。set -o physical
~/.bashrc
-P
-L