web-dev-qa-db-ja.com

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

Bashコマンド

cd - 

以前に使用されたディレクトリとその変更を出力します。

一方、Bashコマンド

cd ~-

何もエコーすることなく、以前に使用したディレクトリに直接変更します。

それが唯一の違いですか?各コマンドの使用例は何ですか?

62
dr_

ここでは、2つのことが行われています。まず、-だけが以前のディレクトリに展開されます。これはman bashcdセクションで説明されています(私の強調):

-の引数は、ディレクトリの変更が試行される前に$ 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"/* .と同等です。

86
terdon

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

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

14
choroba

TL; DR:_cd -_はcdに組み込まれています。_~-_は_~[name]_の拡張で、cdに固有ではありません。

POSIX.1-2008 Shell&Utilities は、_cd -_を特定のの特殊なケースとして定義します- cdコマンド

_-_がオペランドとして使用される場合、これはコマンドと同等です:

_cd "$OLDPWD" && pwd_

これにより、前の作業ディレクトリに変更され、その名前が書き込まれます。

_~-_拡張機能は、コマンドが実行される前に_$OLDPWD_に展開され、cdだけでなく、任意のコマンドの引数として渡すことができます。 ksh および bash の後の拡張機能です。

前述のPOSIX.1-2008 Shell&Utilities標準にも Tilde Expansionの詳細な説明 があります。表現は、_~-_が標準の範囲内で未定義の動作として許可されるように非常に具体的です。ここで、_~[name]_は_$HOME_が空の文字列の場合は_[name]_を参照し、ホームはnameが有効なユーザー名の場合、ユーザーnameのディレクトリ。

5
Henk Langeveld