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

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

Bashコマンド

cd - 

以前使用したディレクトリを印刷し、そこに移動します。

一方、Bashコマンド

cd ~-

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

違いはそれだけですか? 各コマンドの使用例は何ですか?

答え1

ここでは 2 つのことが関係しています。まず、 が-以前のディレクトリに展開されます。これはcdのセクションで説明されていますman bash(強調は筆者による):

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

したがって、単純なコマンドcd -は、前のディレクトリに戻り、ディレクトリの名前を出力します。その他のコマンドは、「チルダ展開」セクションに記載されています。

チルダ プレフィックスが の場合 ~+、シェル変数 PWD の値がチルダ プレフィックスに置き換えられます。 チルダ プレフィックスが の場合~-、シェル変数 OLDPWD の値 (設定されている場合) が置き換えられます。 チルダ プレフィックスのチルダに続く文字が数値 N で構成され、オプションで または +が前に付いた場合-、チルダ プレフィックスは、チルダ プレフィックスを引数として呼び出された 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 -が出力されるだけです-。 は~-チルダ展開機能の一部であり、変数と同様に動作します。そのため、 とecho ~-を使って意味のあるものを取得できます。 も使用できますcd ~-が、他のコマンドでも同様に使用できます。たとえばcp ~-/* .、 は以下と同等になります。cp "$OLDPWD"/* .

答え2

~-チルダ展開の対象 (man bash を参照) であるため、cd前のディレクトリ名が直接参照されます。-シェルによって展開されず、cd直接参照され、ドキュメントに記載されているとおりに動作します。

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

答え3

TL;DR:cd -は に組み込まれておりcd~-は の後の拡張であり~[name]、 に固有のものではありませんcd

POSIX.1-2008 シェルとユーティリティcd -特別なケースとして定義される特定ののためにcd指示:

-オペランドとしてa を使用する場合、これは次のコマンドと同等になります。

cd "$OLDPWD" && pwd

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

拡張子はコマンドが実行される前に に~-展開され、 だけでなく任意のコマンドの引数として渡すことができます。これは、$OLDPWDcdそして

前述のPOSIX.1-2008 Shell & Utilities標準には、ティルダ展開の詳細な説明~-文言は非常に具体的で、標準の範囲内で を未定義の動作として許可します。 が空の文字列の場合~[name]は を参照し、 が有効なユーザー名の場合はのホーム ディレクトリを参照します。$HOME[name]namename

関連情報