「cd -」と「cd ~~」の違い

「cd -」と「cd ~~」の違い

バッシュコマンド

cd - 

以前に使用したディレクトリを印刷して変更します。

一方、Bashコマンドは

cd ~-

何も表示せずに以前に使用したディレクトリに直接変更します。

これが唯一の違いですか?各コマンドのユースケースは何ですか?

答え1

これには2つのことがあります。まず-、以前のディレクトリに個別に展開します。これは(強調鉱山)セクションcdで説明されています。man bash

-パラメーターは、ディレクトリーを変更しようとする前に $OLDPWD に変換されます。CDPATHの空でないディレクトリ名が使用されているか、最初の引数でディレクトリの変更が-成功すると、新しい作業ディレクトリの絶対パス名が標準出力に書き込まれます。 ディレクトリの変更が成功した場合、戻り値はtrue、それ以外の場合はfalseです。

したがって、簡単な操作でcd -古いディレクトリに戻ってディレクトリ名を出力できます。別のコマンドは、「チルダ拡張」セクションで説明されています。

チルダプレフィックスが a の場合、 ~+シェル変数 PWD の値がチルダプレフィックスに置き換わります。チルダの前に付いている場合、~-シェル変数OLDPWDの値が設定されている場合は置き換えられます。チルダプレフィックスでチルダの後に続く文字が数値Nで構成され、オプションで +aまたはaプレフィックスが追加されると、-チルダプレフィックスはdirs組み込み関数によって表示されるディレクトリスタックの対応する要素に置き換えられます。パラメータとしてプレフィックスと呼ばれます。チルダプレフィックスでチルダの後に続く文字が先行しない数字で構成されている場合、+と見なされます。-+

次の例を見ると、理解しやすくなります。

$ pwd
/home/terdon
$ cd ~/foo
$ pwd
/home/terdon/foo
$ cd /etc
$ pwd
/etc
$ echo ~        ## prints $HOME
/home/terdon
$ echo ~+       ## prints $PWD
/etc
$ echo ~-       ## prints $OLDPWD
/home/terdon/foo

したがって、一般的に言えば、-「古いディレクトリ」を意味します。cd -それがまさにそれがあなたをあなたが来た場所に連れて行く理由です。

主な違いは組み込みcd -固有ですcd。試してみると、echo -1つだけ印刷されます-。これは~-チルダ拡張機能の一部であり、変数のように機能します。だからecho ~-意味のあるものを得ることができます。ここでも使用できますが、cd ~-他のコマンドでも使用できます。たとえば、cp ~-/* .これは次のようになります。cp "$OLDPWD"/* .

答え2

~-チルダ拡張(man bashを参照)の影響を受けてcd表示されるのは、直前のディレクトリ名です。-シェルによって拡張されずに直接cd表示され、文書化されたとおりに機能します。

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

答え3

重要な要約:cd -に組み込まれているのはcd後続~-の拡張であり、限定~[name]されませんcd

POSIX.1-2008 シェルとユーティリティcd -特別なケースとして定義されます。特定~のためcd注文する:

-aがオペランドとして使用される場合、これは次のコマンドと同じです。

cd "$OLDPWD" && pwd

以前の作業ディレクトリに変更し、その名前を書き込みます。

拡張は、コマンドが実行される前に~-拡張されます。$OLDPWDcdそして

上記のPOSIX.1-2008 Shell & Utilities規格にもチルダ拡張の詳細な説明。この表現は、空の文字列を参照するか、有効なユーザー名の場合は、ユーザーのホームディレクトリを参照する~-標準の範囲内で未定義の動作を許可するために非常に具体的です。~[name]$HOME[name]namename

関連情報