Bashでシンボリックリンクを使ってCDを再度持ち上げる方法は?

Bashでシンボリックリンクを使ってCDを再度持ち上げる方法は?

構造:

/base/
   +- somedir/
   +- symlink/  -> /some_other_dir

このコマンド(私のMakefileを除く)は失敗します。

cd /base/symlink
ls ../somedir

Bashは../somedirが存在しないと文句を言います。同様に、some_other_dirの../somedirを参照するmakefileが失敗します。しかし、cd ..は期待どおりに動作します。私のシェルが論理的に動作するようにできますか?

ベストアンサー1

..現在のディレクトリのディレクトリエントリです。親ディレクトリへのハードリンクです。 /base/symlink/..は実際には同じファイルです(それ自体が他の場所へのシンボリックリンクでない限り)/some_other_dir/..はい。/some_other_dir

ほとんどのシェルではディレクトリエントリとして処理されないという点で特別なcd処理が行われますが、発生した場合(システムのパス名解決の代わりに)最初のレベルのディレクトリを削除すると解釈されます。......cd

たとえば、cd a/b/..シェルはchdir("a")実行するのではなく実行しますchdir("a/b/..")。後者を取得するには、次の手順を実行する必要がありますcd -P a/b/..

cdこれは、次にのみ適用されることを認識することが重要です。一部シェル)、(IMO、無効な属性)、lsそうでない、viまたは他のもの(例:その他cdなしでこれらのパスを渡すこれらのシェルのスクリプト-P

その殻の中にcdそれはどこにありますか?論理的説明..pwd組み込み関数、$PWD変数は次のとおりです。論理的物理(物理)ディレクトリではなく、現在のディレクトリ、つまりシンボリックリンクディレクトリコンポーネントを持つことができるディレクトリ。同様に、pwd -P以下を使用して取得できます。物理タスクリスト。

今やりたいなら

cd /A/b
anything-but-cd ../c

実際に意味するものは次のとおりです。

anything-but-cd /A/c

/A/bシンボリックリンクかどうかに関係なく、次のことができます。

anything-but-cd "$(dirname -- "$PWD")/c"

または

anything-but-cd "${PWD%/*}/c"

または以下を使用してzsh

anything-but-cd $PWD:h/c

/*最後の3秒を削除するには$PWD

anything-but-cd "${PWD%/*/*/*}/c" # POSIX
anything-but-cd $PWD:h:h:h/c      # zsh

おすすめ記事