シェルスクリプトでよく見る「#!/bin/sh」について
shebang(シバンまたはシェバン)と呼ばれるものらしく、スクリプトを読み込むインタープリタを指定する事ができて、実行時にsh
やbash
を指定する必要がなくなるとのこと。
試してみる
任意のディレクトリに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
を使ったほうが良いですね。。。