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


56

Bashコマンド

cd - 

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

一方、Bashコマンド

cd ~-

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

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


3
このトリッキーなものは使用しないことをお勧めします。これはあなたの脳cd ~-です。
DepressedDaniel

10
@DepressedDaniel、トリッキーなものを使用しない(計画する)場合でも、舞台裏で何が起こっているのかを理解することは依然として有用です。
anotherdave 16

回答:


81

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

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

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

tilde-prefixがa ~+の場合、シェル変数PWDの値がtilde-prefixを置き換えます。tilde-prefixがa ~-の場合、シェル変数OLDPWDの値が設定されている場合、その値が置換されます。tilde-prefixのチルダに続く文字が数字Nで構成され、オプションでa +またはaが前に付けられている 場合-、チルダプレフィックスは、ディレクトリスタックの対応する要素に置き換えられます。引数としてのチルダ接頭辞。チルダ接頭辞のチルダに続く文字が、先頭+またはのない数字で構成されている-場合+は、想定されます。

これは例を使用して理解しやすいかもしれません:

$ 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"/* .


1
set -x実行する前に展開されたコマンドを印刷すると、違いを説明するのに役立つ場合があります(または、自分で1ステップずつ実行していない場合は、読みにくくなるだけです)。
ピーターコーデス

1
今日私は学んだ@terdon。
sitilge

要するに... cd ~-/..機能しますが、cd -/..機能しません!
レイフォス

13

~-チルダ展開の対象(man bashを参照)であるため、表示されるのcdは以前のディレクトリ名です。-シェルによって展開されず、cd直接表示され、文書化されたとおりに動作します。

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


4

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

POSIX.1-2008 Shell&Utilitiesは、コマンドに固有のcd -特殊なケースとして定義しています:cd

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

cd "$OLDPWD" && pwd

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

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.