私のシステムはmacOS 13.2.1で、シェルはoh-my-zshです(bashでも同じ動作)。cd
コマンドで奇妙な動作が見つかりました。現在のディレクトリを無効なディレクトリに変更します。正しいパスにディレクトリがないため、これはソフトリンクによって発生しません。
!w /Library/TeX/texbin ........................................................................................................... 14:56:24
> cd ../../texmf-dist
!w /usr/local/texlive/2021/texmf-dist ............................................................................................ 14:56:40
> cd -
/Library/TeX/texbin
!w /Library/TeX/texbin ........................................................................................................... 14:56:42
> cd ../../
!w /Library ...................................................................................................................... 14:56:51
> cd texmf-dist
cd: no such file or directory: texmf-dist
答え1
あいまいさを引き起こす/Library/TeX
シンボリックリンクに言及しています。/usr/local/texlive/2021/universal-darwin/
/Library/TeX/texbin
(実際に)入って/usr/local/texlive/2021/universal-darwin/texbin
実行すると、cd ../..
シェルはリンクが存在することを確認します/Library/texmf-dist
。つまり、リンクへのアクセスに使用したパスを記憶し、各パス要素を削除して、実行された..
ステップリンクを効果的に元に戻します。結局入って存在/Library
し/Library/texmf-dist
ないのでcd
結局は働きません。
同様に、cd ../../texmf-dist
行こうとします/Library/texmf-dist
が、存在しません。ただし、ここではシンボリックリンクを覚えておらず、パスが実際の場所に適していることを確認します。/usr/local/texlive/2021/texmf-dist
シェルがシンボリックリンクを介してパスを忘れる必要があるため、パスがどのように完全に変更されるかを確認してください。
戻って/Library/TeX/texbin
実行すると、シンボリックリンクをもう一度忘れて「物理」パスを使用し、再びうまく機能しますcd -P ../..
。/usr/local/texlive/2021
cd texmf-dist
構造は次のとおりです。違いは、..
上に移動したときに選択したパスから来ますuniversal-darwin
(他のディレクトリはシンボリックリンクではないと仮定します)。
/Library -> Tex - - - -(symlink)- - +
v
/usr -> local -> texlive -> 2021 -> universal-darwin -> texbin
|
+---> texfmt-dist
シェルがユーザーが使用するシンボリックリンクを記憶する方法は、ユーザビリティ機能です。これは、多くの場合、より良い名前でシンボリックリンクを作成し、1時間検索できる場合は、何かが実際にどこにあるかを覚える必要がないことを意味します。他~/thingy
よりも/net/fileserver1/disk02/dir/thingy
覚えやすいです。
ただし、これはディレクトリツリーがそうでないことを意味します。木もはや「上」があいまいになります。
したがって、シンボリックリンクターゲットが「超過」すると、競合が発生する可能性があります。特に、シェルから起動されたプログラムは、シェルがシンボリックリンクの内容を覚えていることを知らず、常に「物理的」親ディレクトリを使用します。たとえば、あなたの場合、/Library/TeX
シンボリックリンクでls ..
実行するとcd ..; ls
。