オープンソースこねこね

Webプログラミングなどについてあれこれ。

Macで新しくターミナルウィンドウを立ち上げて、コマンドを実行する

アプリケーションの開発中、プロジェクトのディレクトリでターミナルを立ち上げて、テストやビルドプロセスを、コマンドラインから実行することが、よくあります。そのなかにはwabpack --watchなど、実行後プロセスが常駐して、開発をサポートするタイプのコマンドがあります。テスト用のDBや、開発用Webサーバの実行などもこの種類です。

このような常駐型のツールをターミナルから立ち上げると、ターミナルがブロックされます。この状態で他のコマンドの入力を行いたい場合、別にもう一つターミナルウィンドウ(またはタブ)を立ち上げる必要があります。いちいち手作業で新しいウィンドウを起動するのが煩わしいので、自動で常駐型プロセスの方を新しいウィンドウで実行できるように、起動スクリプトを書きました。

#!/usr/bin/env bash
set -e

# Open new terminal.
SOURCE="${BASH_SOURCE[0]}"
DIR=$(pwd)
if [[ "$(uname)" = "Darwin" ]] && [[ -z "$ON_NEW_TERMINAL" ]] && [[ -z "$NO_NEW_TERMINAL" ]] ; then
    osascript -e "tell app \"Terminal\" to do script \"cd $DIR && export ON_NEW_TERMINAL=1 && $SOURCE\""
    exit 0
fi

# Get the directory path and move it.
while [ -h "$SOURCE" ] ; do SOURCE="$(readlink "$SOURCE")"; done
DIR="$( cd -P "$( dirname "$SOURCE" )/" && pwd )"
cd "$DIR"

# Run your command...
echo 'hello world!'

短いので見ればわかると思いますが、要はAppleScriptでTerminalアプリを起動しているだけです。Run your command...のコメント部分以下に、新しいウィンドウで実行したいコマンドを書いて、ラッパーとして使います。たとえば、以下はPHPを実行するapacheをDockerを使って立ち上げたい場合のコードです。

echo "Starting httpd server by using docker."
echo "Please open http://localhost:8080"
(sleep 1; open http://localhost:8080) &

docker run -i -t --rm -v $DIR:/var/www/html -p 8080:80 php:7.1-apache bash -c 'apache2-foreground'

これを記述して、このスクリプトを実行すると

f:id:kohkimakimoto:20180220194021g:plain

のように、新しいターミナルウィンドウが開いて、そこでapacheが起動します(この例ではついでにopenコマンドでブラウザも開いています)。

新しいウィンドウを開きたくない場合はNO_NEW_TERMINAL=1のように環境変数を設定して、スクリプトを実行すればよいです。