CDPATH=".:/some/path" を使用するときにサブディレクトリのフルパスが印刷されるのを防ぐ方法は?

CDPATH=".:/some/path" を使用するときにサブディレクトリのフルパスが印刷されるのを防ぐ方法は?

CDPATHbashを使用して私が頻繁に訪れるディレクトリにディレクトリをシンボリックリンクしたいと思います。ただし、次の操作を行います。

CDPATH="~/symlinks"

両方がある場合、ジョブcd SUBDIRは停止します。そのディレクトリは現在の作業ディレクトリよりも優先されます。./SUBDIR~/symlinks/SUBDIRCDPATH

私は以下を使ってこの問題を解決しようとしました。

CDPATH=".:~/symlinks"

これは優先順位の問題を解決しますが、cdサブディレクトリに移動すると常にフルパスが印刷されます。

$ pwd
/foo/bar
$ cd baz
/foo/bar/baz

これは少し迷惑なことです。私もできることを知っています以下を実行してすべてのcd出力を抑制します。alias cd='> /dev/null cd'しかし、他の項目のパスを印刷したいCDPATH(または実行時cd -)。私ができるより良いことはありませんか?

答え1

2つの手がかり:

  • CDPATH存在しないか空の文字列の場合はcd SUBDIR正常に機能し、追加のオーバーフローは印刷されません。

  • Bashのマニュアルページは次のように述べています。

この変数は、CDPATH 次を含むディレクトリの検索パスを定義します dirCDPATH 検索に含まれる各ディレクトリ名dir。の代替ディレクトリ名はCDPATHコロン()で区切られています:。空のディレクトリ名はCDPATH現在のディレクトリと同じです。つまり、「。」

マニュアルページは過度に単純化されているようです。明らかに、空のディレクトリ名(つまり空の文字列)は次のとおりです。いいえ.CDPATH=.これは、追加の出力を生成しますが、CDPATH=追加の出力を生成しないのとまったく同じです。ただし、空のディレクトリは許可されており、空のディレクトリCDPATHは追加の出力を生成しないため、次のことができます。

# The first entry is intentionally an empty string.
CDPATH=":~/symlinks"

テスト(bash 4.4.12を使用)で期待どおりに機能することが確認されました。代わりに tocd SUBDIRに変更して実行します。./SUBDIR~/symlinks/SUBDIRいいえ追加の排出物を印刷します。

関連情報