Bashコマンド
cd -
以前に使用したディレクトリとその変更を出力します。
一方、Bashコマンド
cd ~-
何もエコーせずに、以前に使用したディレクトリに直接変更します。
それが唯一の違いですか?各コマンドのユースケースは何ですか?
Bashコマンド
cd -
以前に使用したディレクトリとその変更を出力します。
一方、Bashコマンド
cd ~-
何もエコーせずに、以前に使用したディレクトリに直接変更します。
それが唯一の違いですか?各コマンドのユースケースは何ですか?
回答:
ここには2つのことがあります。まず、-
単独で以前のディレクトリに展開されます。これはcd
、man 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"/* .
set -x
実行する前に展開されたコマンドを印刷すると、違いを説明するのに役立つ場合があります(または、自分で1ステップずつ実行していない場合は、読みにくくなるだけです)。
cd ~-/..
機能しますが、cd -/..
機能しません!
TL; DR:cd -
はに組み込まれcd
、の~-
拡張であり~[name]
、に固有ではありませんcd
。
POSIX.1-2008 Shell&Utilitiesは、コマンドに固有のcd -
特殊なケースとして定義しています:cd
a
-
がオペランドとして使用される場合、これはコマンドと同等になります。
cd "$OLDPWD" && pwd
前の作業ディレクトリに変更し、その名前を書き込みます。
~-
拡張子はに展開されます$OLDPWD
任意のコマンドの前だけでなく、実行され、任意のコマンドの引数として渡すことができますcd
。これは、kshおよびbashの後の拡張機能です。
前述のPOSIX.1-2008 Shell&Utilities標準には、Tilde Expansionの詳細な説明もあります。言葉遣いはを可能にするために非常に具体的である~-
標準の範囲内として、未定義の動作~[name]
を参照する$HOME
場合は[name]
、空の文字列、またはユーザーのホームディレクトリであるname
場合にはname
有効なユーザー名です。
cd ~-
です。