アゲブログ

プログラマーです。

シェルスクリプトでよく見る「#!/bin/sh」について

shebang(シバンまたはシェバン)と呼ばれるものらしく、スクリプトを読み込むインタープリタを指定する事ができて、実行時にshbashを指定する必要がなくなるとのこと。

試してみる

任意のディレクトリにsayhelloというファイルを作成して下記のように記述する。

#!/bin/sh
echo Hello!!

実行権限を付与すると./sayhelloのような形で実行することができる。

$ chmod u+x sayhello
$ ./sayhello
Hello!!

さらに、パスを通すことでコマンドのように実行することもできる。

$ export PATH=$PATH:`pwd`
$ sayhello
Hello!!

また、インタープリタにはshやbashだけでなくrubyを指定することもできるとのこと。sayhelloファイルを以下のように修正して同じように実行してみる。

#!/usr/bin/ruby
puts 'Hello!!'
$ sayHello
Hello!!

rubyインタープリタを指定した状態でecho Hello!!などとするともちろん怒られてしまう。

$ sayhello
/Users/ageage/bin/sayhello:2: syntax error, unexpected end-of-input

独自のコマンドを作成してみる

git logコマンドの短縮形であるglogコマンドを作ってみる。

glogというファイルを作成して下記のように記述する。

#!/bin/bash
git log "$@"

パスを通してから、ローカルリポジトリで使用してみると...

$ glog
commit 59ec0c23c557a7251f1dff64869413422af85faa (HEAD -> master)
Author: ageage <ageage0830@gmail.com>
Date:   Tue Apr 17 19:34:24 2018 +0900

    fix README.md

commit f2340ef8c825f0e685a5065e7502b6490836e47f
Author: ageage <ageage0830@gmail.com>
Date:   Tue Apr 17 19:33:34 2018 +0900

    initial commit.

できた!下記のようにオプションを付与することもできる!

$ glog --oneline
59ec0c2 (HEAD -> master) fix README.md
f2340ef initial commit.

感想

色々と試してみて、自身の中でのshebangの認識が「おまじない」から、ちゃんと意味のある記述に変わったのでとても良かったです。rubyインタープリタを指定する際はenvなどを使用したり、もっと別の書き方もあるようですが、その辺りについては今後作業を行いながら吸収していければと思います。独自のコマンドの作成については、他のコマンドとの衝突には気をつける必要がありそう。むやみに作ってしまうと嵌ってしまう原因にもなりかねないので程々にしておこうかと思います。

※2018年5月10日 追記

このようなケースではaliasを使ったほうが良いですね。。。

参考