web-dev-qa-db-ja.com

シンボリックリンクをたどった後に「cd ..」機能を復元する

次のようなコマンドで端末にシンボリックリンクを作成した場合

ln -s /path/to/some/directory symbolicLink

そして、リンクをたどって

cd symbolicLink

端末は、実際に~/symbolicLink/を表示しているにもかかわらず、cwdが~/path/to/some/directory/であると考えているように見えます(もちろん、リンクは~で作成されていると仮定します)。これは、「cd ..」と入力すると、~に戻ります。これは、端末がcwdの親であると「考える」ためです。

cd ..が代わりに~/path/to/some/、つまりreal~/path/to/some/directory/の親になるように、何を変更する必要がありますか?

13
Val

https://stackoverflow.com/questions/10456784/behavior-of-cd-bash-on-symbolic-links を参照してください。

「cd -P」を使用して、「実際の」親ディレクトリに移動できます。これをデフォルトの動作にする方法については、一番上の回答の最初のコメントを参照してください。

15
Alexander

cd -P動作には微妙な注意事項があります(長さのために回答として投稿されています):

$ dir1=$(mktemp --directory)
$ dir2=$(mktemp --directory)
$ ln -s -- "$dir1" /tmp/start
$ ln -s -- "$dir2" "$dir1"
$ cd "/tmp/start/"*
$ cd -P ..

今何をpwdプリントすべきですか?論理的には、

  1. $dir1cd -P ..が最初にcd ..を実行し、その後cd -- "$(readlink -f)"を実行する場合、または
  2. /tmpcd -P ..が最初にcd -- "$(readlink -f)"を行い、その後cd ..を行う場合。

実際、後者を行います。つまり、pwdは直感的にtwo「親」ディレクトリよりも高いレベルです。

5
l0b0

別の方法は、実行することです:

cd $(/bin/pwd)/..
2
jlliagre

私はあなたの痛みを感じます—この振る舞いのため、bashはインタラクティブな使用のために基本的に壊れていると思います。

tcshは、インタラクティブな使用のためのはるかに使いやすいシェルです。プログラミングのためにbashを残します(多くのスクリプト言語の中にはるかに優れた代替物があるときにシェルスクリプトを書くことを主張する場合)。

任意のユーザーのシェルを変更するには、コマンドラインでchshと入力し、プロンプトに従います(ここでも、/bin/tcshと優れたO'Reillyの本をお勧めします Using cshおよびtcsh 、何も使用しない場合に使用可能)。

2