CDPATHのcdコマンドの「代替ディレクトリ名」とは何ですか?

CDPATHのcdコマンドの「代替ディレクトリ名」とは何ですか?

CDとBashのヘルプページから:

The variable CDPATH defines the search path for the directory containing
DIR.  Alternative directory names in CDPATH are separated by a colon (:).
A null directory name is the same as the current directory.  If DIR begins
with a slash (/), then CDPATH is not used.

:しかし、「代替ディレクトリ」という概念を理解しておらず、コマンドでコロン()を使用する例が見つかりませんcd

答え1

この変数はデフォルトでは設定されていませんが(少なくとも私が慣れているシステムでは)できる指定したターゲットディレクトリを検索するために別のディレクトリを有効にしますcd。たとえば、これを説明する方が簡単です。

$ echo $CDPATH    ## CDPATH is not set

$ cd etc          ## fails: there is no "etc" directory here
bash: cd: etc: No such file or directory
$ CDPATH="/"      ##CDPATH is now set to /
$ cd etc          ## This now moves us to /etc
/etc

つまり、デフォルトの動作は、cd foo「現在のディレクトリのサブディレクトリ、foo」というディレクトリに移動することです。または「ディレクトリ」は、CDPATHで指定された別のディレクトリにあります。CDPATH設定しないと、cd現在のディレクトリでのみ検索されますが、設定されている場合は、設定したディレクトリでも一致するものが見つかります。

コロンはとともに使用されずcd、 に設定するディレクトリを区切るために使用されますCDPATH

CDPATH="/path/to/dir1:/path/to/dir2:/path/to/dirN"

答え2

マニュアルにCDPATH以下のように説明する。

cd コマンドの検索パスです。これは、シェルがcdコマンドで指定されたターゲットディレクトリを見つけるためのコロンで区切られたディレクトリのリストです。例の値は「.:~:/usr」です。

完全性のために、ここには次のようなものがあります。 特別な

$~> mkdir /tmp/2 ./2 ./3
$~> cd 2
$~/2> cd ..
$~> CDPATH=/tmp
$~> cd 2
/tmp/2
$~> cd ~
$~> cd 3
$~/3> 

ご覧のとおり、一度設定すると、CDPATH=/tmpBashは/tmp最初に可能なターゲットディレクトリを探します。で見つからない場合は、/tmp現在のディレクトリで検索しようとします。我々はまた(シェル組み込み関数)

CDPATH の空でないディレクトリ名が使用されるか、または - が最初の引数でディレクトリ変更が成功すると、新しい作業ディレクトリの絶対パス名が標準出力に書き込まれます。

私もこれを共有したいです。

$~> CDPATH=.:/tmp
$~> cd 2
/home/myuser/2
$~/2> cd 2
/tmp/2

この連続では、CDPATH2つのディレクトリが提供される。最初のものは.現在のディレクトリです。まず来るので頑張った後に到着しますcd 2。同様に、最初にリストされたディレクトリに優先順位があります。/home/myuser/2/tmp/2$PATH

答え3

他の答えはCDPATHの基本的な使用法を説明していますが、具体的なユースケースは例だと思います。同じルートディレクトリから始めて、一連のサブディレクトリで何度も何度も何度も何度も何度もやりたいことがあります。

cd ~/wrk
for d in */.git/hooks/; do
  ( cd "$d" && mv pre-commit pre-commit.off )
done

各反復が同じルートで開始されるようにするには、サブシェルが必要です。それともそうでしょうか?ここでサブシェルの複製を避けることはできますか?私たちはできます!

cd ~/wrk &&
CDPATH=$PWD
for d in */.git/hooks; do
  cd "$d" && mv pre-commit pre-commit.off
done

これは、cdが各ステップの進捗状況を通知するという追加の利点があります。

代替ディレクトリ名はどうですか?特にクワジモドの事例がいいと思います。.CDPATHにない場合は、CDPATHが優先されます。ただし、古いディレクトリが優先的に適用されるようにするには、CDPATH .

関連情報