
構造:
/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