bashでディレクトリを掘ったあと中に移動する

  • インゴットくん
    インゴットくん システムちーむ
  • このエントリーをはてなブックマークに追加
bashでディレクトリを掘ったあと中に移動する

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を常用していると割と空白を含むディレクトリ名を作ることが多く、重宝しますよ。

このエントリーをはてなブックマークに追加

インゴットくんが最近書いた記事

WRITERS POSTS もっと見る

他にもこんな記事が読まれています!

  • WEB
  • マーケティング
  • サーバー・ネットワーク
  • ライフスタイル
  • お知らせ