Bashシェルスクリプトでディレクトリを作成してから移動する処理を簡潔に記述する方法

Bash

はじめに

小ネタです。

いろんな言語やツールのチュートリアルを読み進めていると、
必ずと言っていいほど書かれているコマンドのセットがあります。

それが mkdircd

例えば「チュートリアル用の作業ディレクトリを使って」といった処理の場合に以下のように 2 つのコマンドがセットで記述されます。

# ホームディレクトリ配下の "sample-app" ディレクトリを作成
$ mkdir /home/genzouw/sample-app

# ホームディレクトリ配下の "sample-app" ディレクトリに移動
$ cd /home/genzouw/sample-app

毎度のことながらこのような処理をスクリプトに起こした場合、気になってしまうこと。
それは DRY ( 繰り返しを避ける ) ではないという点。

/home/genzouw/sample-app というディレクトリ名が 2 回登場しています。

これを回避するために 変数 を利用する事もできます。

# ホームディレクトリ配下の "sample-app" ディレクトリを変数にセット
$ SAMPLE_DIR=/home/genzouw/sample-app

# ディレクトリ作成
$ mkdir "$SAMPLE_DIR"

# ディレクトリ移動
$ cd "$SAMPLE_DIR"

より簡潔な記述方法を紹介します。

検証環境

$ uname -moi
x86_64 x86_64 GNU/Linux

$ head -n 2 /etc/os-release
NAME="CentOS Linux"
VERSION="7 (Core)"

$ bash -version | head -n 1
GNU bash, version 4.2.46(2)-release (x86_64-redhat-linux-gnu)

「ディレクトリ作成 → 移動」を行う DRY なワンライナー

結論から言います。

以下のワンライナーで実現できます。

$ mkdir -p /home/genzouw/sample-app && cd $_

ポイントは 2 点です。

  • mkdir -p コマンドを利用する
  • $_ 変数を利用する

一つ一つ解説していきます。

1. mkdir -p コマンドを利用する

過去のエントリ( “mkdir"コマンドでディレクトリを作成する際には存在チェックはしなくても良い | ゲンゾウ用ポストイット )で取り上げていますが、 mkdir コマンドは -p オプションを使用すると以下のような挙動になります。

  • ディレクトリ作成の際に親ディレクトリがなかった場合、自動的に作成してくれる
  • ディレクトリが既に存在していた場合でもエラーとならない

2. $_ 変数を利用する

$_ という特殊な変数があります。

$_ は直前に実行されたコマンドの最後の引数が格納されます。

試してみます。

$ echo a b c
a b c

$ echo $_
c

今回のワンライナーでは、 mkdir -p /home/genzouw/sample-app コマンドを実行したため、 $_ 変数を参照すると /home/genzouw/sample-app という値がが苦悩されています。

cd $_cd /home/genzouw/sample-app と同じ結果が得られます。

ひとこと

セットアップスクリプトを作成する際に活用できるのではないでしょうか?

Bash