LinuxやGit Bashなどのbashの対話型シェルで、ディレクトリを掘った後、その中に移動したいとき、
mkdir hoge
cd $_
または
mkdir hoge ; cd $_
とかしますよね。
bashでは、$_は直前のコマンドの引数が入る
実行例:
[localhost ~]$ mkdir hoge ; cd $_
[localhost hoge]$
$_は、利用される文脈で意味が変わるのですけれども、対話型シェルでは、おおむね「直前に実行されたコマンドの最後の引数」となるため、上記でいえば、$_=hogeとなります。
$_には空白が入ることがあるので困る
ここまではいいのですが、ディレクトリ名にスペース(0x20)を含む場合は、どうなるでしょうか。
[localhost ~]$ mkdir 'hoge and fuga' ; cd $_
-bash: cd: hoge: そのようなファイルやディレクトリはありません
[localhost ~]$
という感じで、cdコマンドでディレクトリの中に入るときに失敗します。
cd "$_"とクォーテーションでくくろう
というわけで、ディレクトリ名にスペース(0x20)が入る場合は、以下のようにしましょう。
[localhost ~]$ mkdir 'hoge and fuga' ; cd "$_"
[localhost hoge and fuga]$
なぜ"$_"にしないとダメだったの?
わかってしまえば何のことはない、シェルではスペースがデリミタとして機能するため、クォーテーションでくくらないと、変数展開後hoge、and、fugaの3つの引数が指定されたことになり、hogeディレクトリがないとエラーとなります。
hogeディレクトリがあったならあったで、hogeディレクトリに入ってしまいますが、それは期待した動作ではないですよね。
というわけで、cdコマンドで変数でディレクトリ移動先を指定するなら、ダブルクォーテーションで囲ったほうが良いよ、というお話でした。
そんな気持ちが悪いディレクトリ名なんて使わないよ、と思うかもしれませんが、日常生活でbashを常用していると割と空白を含むディレクトリ名を作ることが多く、重宝しますよ。