#はじめに
シェルのshebangって難しいですよね。
ぶっちゃけ私も完全に理解しているわけではありませんが、使い方がわかると意外と便利です。
今回はshファイルを実行する場合に、shebangに渡すオプションをsetに渡すようにするだけで便利になる話をご紹介します!
#例
サンプルコードとして下記を用意しました。test.shというファイルを作成してコードを書きます。
cp sample.txt test/
echo "つづくよー"
処理内容は、ファイルをコピーして文字列を出力するだけです。ですがsample.txtもtestディレクトリも用意してないので、当然エラーになります。
下記コマンドで実行できますので、ぜひローカルでも試してみてください!
$ sh test.sh
##shebangにオプションをつけた場合
##!/bin/bash -xe
cp sample.txt test/
echo "つづくよー"
実行結果は下記になりました。
cp: directory test does not exist
つづくよー
って、エラーなのに次の処理が続いちゃっとるー!wwwww
##setにオプションをつけた場合
##!/bin/bash
set -xe
cp sample.txt test/
echo "つづくよー"
実行結果は下記になりました。
+ cp sample.txt test/
cp: directory test does not exist
エラーが出た行でちゃんと止まりました!
ちなみにxオプションで実行するコード自体を出力しています。eオプションによってエラーで処理が止まるようになっています。
##原理
聞けば当然ですが、shebangに渡したオプションはshebang経由で起動しないと有効になりません。
そしてファイル名指定で起動した場合は有効になりません。
#用途
私の周りではJenkinsのJob内で使うshファイルに使っています。
大体の場合、途中で1行でも失敗したらその後の処理もおかしくなりますが、shebangにオプション付けると一番最後の行が成功したら成功ステータスで終わっちゃうんですよね。
setにオプションをつけることによって、スクリプトが1行でも失敗したらJobを失敗ステータスにすることができます。