シェルスクリプトでset -eしているときに処理を中断せずエラーを扱う方法

シェルスクリプトで set -e (errexit) しておくと、スクリプト中に実行したコマンドの終了ステータスが「非0」だった場合、つまりコマンドが失敗したときにそこでスクリプトを中断してくれるようになります。(終了ステータスとは「Exit code」「Return status」などと呼ばれるものです。)

都度エラー判定を書かなくてもよくなるので便利なオプションですが、個別にエラーハンドリングをしたくなった時にも意図せずスクリプトが中断されてしまい困ったことになります。

例えば、以下の例は false コマンドの実行で失敗扱いとなり、そこでスクリプトが中断されるため「finish」が出力されることはありません。

set -e

# false コマンドは必ず終了ステータスに 1 (失敗) を返すコマンド
# エラーが起きたとみなされスクリプトは中断される
false

# このコマンドは実行されない
echo "finish"

-e オプションで困ってしまうケースの例

例えば、grep コマンドで検索結果が見つからなかった場合にエラーメッセージを出力したいケースがあったとしましょう。

grep は検索結果が何か見つかれば 0 (成功)、見つからなければ 1 (失敗) の終了ステータスを返す仕様ですが、以下の例では grep で見つからなかった場合、そこでスクリプトが中断されてしまうので、以降の if 文が実行されることはありません。

set -e
grep "apple" hoge.txt >/dev/null
ret=$?

if [[ $ret != 0 ]]; then
  # ここに入ってくることはない!
  echo "hoge.txt には Apple を含む行が見つかりませんでした。" 1>&2
  exit 1
fi

これについて対処法を4つメモしておきます。

対処法1: コロンコマンドを利用する (:コマンド)

コロンコマンド : は一つの built-in command で、何もせず常に 0 (成功) の終了ステータスを返す虚無的なコマンドです。

以下の例はスクリプトが中断されることはなく「Exit code: 1」が出力されます。

set -e

grep "unmatch pattern" hoge.txt && :
echo "Exit code: $?"

これは -e オプションにおける特殊な振る舞いを利用した方法です。

式の評価の流れ:

  • grep の終了ステータスが 0 (成功) だった場合、&& 演算子により右側も評価され : を実行。一連のコマンドの終了ステータスは 0 (成功)。
  • grep の終了ステータスが 1 (失敗) だった場合、&& 演算子によりそこで評価を終了。なので一連のコマンドの終了ステータスは 1 (失敗)。

更に set -e オプションには &&|| で連結されたコマンドリストの最後にある(一番右側の)コマンドが失敗だった場合のみスクリプトを中断するという特性があるため、そのままスクリプトを続行できます。$? にもちゃんと grep の終了ステータスが入っています。

そのためちょっと直感的ではないですが、以下のコマンドの出力は route1のみ となります。

set -e

false && false
echo "route1"

false
echo "route2"

対処法2: true コマンドを利用する

以下の例は「Exit code: 1」が出力されます。

set -e

grep "unmatch pattern" hoge.txt && true
echo "Exit code: $?"

これも対処法1と同じ理由です。true コマンドも : と同じく何もせず常に 0 (成功) を返すコマンドです。
実質的に対処法1と同じ方法と言えますが、こちらの方が他の人に意図は伝わりやすいかもしれません。

対処法3: 終了ステータスを取得せず if 文でそのまま判定する

set -e

# grep は検索結果が見つからなかった時に 1 (失敗) を返すコマンド
# --quiet は標準出力に何も書き出さないオプション
if ! cat hoge.txt | grep --quiet "Apple"; then
  echo "hoge.txt には Apple を含む行が見つかりませんでした。" 1>&2
  exit 1
fi

これは最も自然な解決方法だと思います。if 文の評価式として実行したコマンドに関しては失敗しても中断されないという特性があるため、スクリプトを続行できます。

対処法4: 一時的に set +e して -e オプションを解除する

以下の例は「Exit code: 1」が出力されます。

set +e
grep "unmatch pattern" hoge.txt
echo "Exit code: $?"
set -e

この方法が楽そうならこれで。最後に set -e で元に戻すのを忘れずに。

感想

対処法3のケースなど普段何気なく実現できていたことも、ちょっとした挙動の特性により実現出来ていたことが理解できました(^^)
個人的にはコロンコマンドを使用した方法がシンプルで好きですが、時と場合で使い分けたいと思います。

参考資料

編集履歴

  • 2018/11/22: 全体的に例や内容をブラッシュアップしました。

Mac初心者の私がMacBook Airを買って行った設定まとめ

こんにちは。最近ひそかにはてなブックマークのホットエントリ入りを夢見て目指しているプログラマの山本です。今日はいいネタを仕入れたので記事にしたいと思いますw

WindowからMac OS Xへ

私は今まで15年間ほどWindowsユーザーでした。今でも自宅のデスクトップはWindows7で、メインのパソコンです。

そんな中でスマートフォンアプリ開発に携わる機会も増えてきまして、iPhoneやAndroidのアプリ開発をハイブリットに行うことができるMacBook Air(mid2012)を買ってしまいました!職場の社員の半数がMacbookユーザーという職場にいるのですが、この度やっと仲間入りできましたw

MacBook Air開封写真

いろいろ設定をカスタマイズしてみて数日使ってみたところ、かなりバランスのいいモバイル端末ということがわかりました。デザイン性・モバイル性・性能の3点が高いレベルでまとまっている端末です。

Macbook Airを買った興奮もおさまってきたところで、備忘録的に私が設定した内容を記しておこうと思います。

この記事での設定内容は、いろいろとMacの初期設定をして使ってみた上でここは設定したほうがいいでしょという内容に絞るようにしています。もともと私がWindowsを使っていたということもありWindowsユーザーにも優しい(?)内容になっています。

WindowsからMacへの乗り換えユーザーも、そうでない方も参考にしてもらえると幸いです。

 

初期設定項目の目次

  1. 早めにセキュリティ設定の見直しを行う
  2. トラックパッドの設定を変更する
  3. 仮想デスクトップSpacesの設定をして作業領域を好きなだけ増やす
  4. Dock操作を使いやすくする
  5. ディスプレイの輝度調整機能を無効に
  6. キーボードの操作感をWindowsに近くする
  7. メニューバーの時間表示部分に日付と曜日も表示する
  8. コンピュータ名を設定する
  9. Finderの設定を行う
 

早めにセキュリティ設定の見直しを行う

設定を行うためにまずは「システム環境設定」を開きます。

Macのシステム環境設定を開く

システム環境設定→パーソナル→セキュリティとプライバシー

システム環境設定の項目の中にある「セキュリティとプライバシー」を開きます。

「スリープとスクリーンセーバーでパスワードを要求」の時間を設定します。ちょっとMacから離れる際に自動的にロックをかけセキュリティを確保するための設定です。

私は5分に設定しましたが、明らかに自分しか使わないという人は解除してしまってもいいと思います。

セキュリティ設定のパソコンを離れた際のパスワード要求設定

システム環境設定→パーソナル→ファイアーウォール

デフォルトでは「切」になっているので「入」にして有効にしておきます。

 

トラックパッドの設定を変更する

Macの代表的な入力インターフェースのトラックパッド(タッチパッド)の設定です。マウスには結構こだわりがあって、ロジクールのワイヤレスレーザーマウスを使っていたりしたのですが、Macbook Airではトラックパッドの操作が非常に快適なためマウス要らずです!

トラックパッドの設定に正解はなく、人によって使い方や好みが分かれる部分です。ここでは私が今設定している内容を一例として紹介します。普段の操作性を大きく左右する設定なので、自分で色々試してみてしっくり来る設定を探して見るのもよいかとおもいます。
システム環境設定→ハードウェア→トラックパッド→ポイントとクリック

「軌跡の速さ」を好みに合わせて調整します。早くするとちょっと指を動かすだけでポインタが大きく動きます。ここではちょっと早めに調整しました。
「タップでクリック」はクリックが圧倒的に楽になるので個人的に必須です。
「副ボタンのクリック」とは、いわゆる右クリックです。「二本指でクリックまたはタップ」に設定しました。
「調べる」と「3本指のドラッグ」については、3本指ジェスチャを別なアプリに割り当てたいためチェックを外しています。

トラックパッドのタッチパッド設定

システム環境設定→ハードウェア→トラックパッド→スクロールとズーム

全部チェックを入れました。直感的な操作ができるようになります。どれも便利です。
「スクロールの方向」については人によって設定が結構違う好みが分かれる部分なので、馴染む方にするといいと思います。

タッチパッドのスクロールとズーム設定

システム環境設定→ハードウェア→トラックパッド→その他ジェスチャ

これも全部チェックを入れました。
「フルスクリーンアプリケーションをスワイプ」は「4本指で左右にスワイプ」に。OSに備わっているSpacesという強力な機能で使います。Spacesについては後ほど説明します。
「Mission Control」は「4本指で上にスワイプ」にしました。Alt+Tabのようなアプリ切り替えをタッチパッドで気持よく行える機能です。
「アプリケーションをExpose」は「4本指で下にスワイプ」に。

上記の3つのジェスチャはアプリの切り替えなどで頻繁に利用する操作ですが、4本指で統一されていたほうが使いやすいと思います。

タッチパッドの設定のその他ジェスチャ

 

仮想デスクトップSpacesの設定をして作業領域を好きなだけ増やす

Spacesという仮想デスクトップの仕組みが標準で搭載されています。デスクトップを2枚・3枚・4枚・・・と好きな数だけ増やせます。狭いノートPCの作業領域を効率的に使うことができるようになります。

アプリケーション→Mission Control(四本指で上方向にスワイプ)

ミッションコントロール、かっこいい名前ですね。四本指で上方向にスワイプすると表示される画面です。

デスクトップを一枚追加する場合は、MissionControlを表示した状態で画面の右上にマウスカーソルを合わせて表示される+アイコンをクリックします。

Missionコントロールでデスクトップを追加する+ボタン

また増やしたデスクトップを減らす場合は、上に並んで表示されている小さなデスクトップにカーソルを合わせると右上に×マークアイコンが表示されるのでクリックします。

あとはドラッグすることでデスクトップを並べ替えたり、アプリをデスクトップをまたいで移動出来ます。

デスクトップ数は試しに3つくらいに設定してみると良いのではないでしょうか。後は好みで増やしたりすればいいと思います。

 

Dock操作を使いやすくする

よく使うアプリはDockに登録しましょう。登録したアプリは、アプリを終了した後もDockにアイコンが表示されるようになるので起動する手間が省けて便利です。
登録の仕方はDockに表示されているアプリのアイコンの右クリックメニューのオプションの中に「Dockに追加」にチェックをつければOKです。

Dockに追加

また、先ほどMissionControl上から仮想デスクトップの設定を行いましたが、アプリごとに仮想デスクトップへの割り当て先設定を行うことができます。割り当て先を「このデスクトップ」などに設定することで割り当てできます。

割り当て機能を使うと、例えばデスクトップ1にはFinderを割り当てておいて、デスクトップ2には作業用アプリやその他諸々割り当てておいて、デスクトップ3は資料やビューアを割り当てておく、というような使い方ができたりします。この例の場合だと真ん中のデスクトップ2がメインとなる作業用デスクトップとなり、左右に作業のための補助用デスクトップを配置しているような形です。

システム環境設定→パーソナル→Dock

Dockの動作に関する設定を行います。
ノートパソコンでは特に貴重な作業領域を少しでも確保するために「Dockを自動的に隠す/表示」にチェックを入れることをおすすめします。EclipseXCodeなどのIDE統合開発環境を使う場合は特に画面の作業領域を少しでも確保しておきたいですね。
他には、アプリアイコンにカーソルを合わせた時に拡大するようにしたりDockの位置を変更できます。お好みでどうぞ。

Dockの環境設定

システム環境設定→Mission Control

「最新の使用状況に基づいて操作スペースを自動的に並べ替える」のチェックを外します。
勝手にデスクトップの順番を並べ替えてくれる機能なのですが、ありがた迷惑な一面もあるため外しておきます。
例えば一番右のデスクトップは資料閲覧用デスクトップとして使っていたはずが、勝手に左側に移動されたりして訳が分からなくなります。

 

ディスプレイの輝度調整機能を無効に

システム環境設定→ハードウェア→ディスプレイ

画面のバックライトがちらつくのが嫌なので「輝度を自動調整」を無効にしました。

 

キーボードの操作感をWindowsに近くする

システム環境設定→ハードウェア→キーボード

初期設定のキーリピート感覚(キーボードを押しっぱなしで連続入力される感覚)がWindowsに比べると遅いので「キーリピートの認識感覚」を早くします。Windowsからの乗り換えではない場合にもおすすめの設定です。
「F1、F2などのすべてのキーを標準のファンクションキーとして利用」にチェックを入れます。従来のファンクションキーとしての動作をするようになります。逆にデフォルト動作の画面輝度調整や音量操作を行いたい場合はfnキーを押しながら操作します。

ハードウェアのキーボード設定

システム環境設定→ハードウェア→キーボード→修飾キー

CapsLockキーは左下という非常に押しやすい位置にありながら、存在価値を問われているなんとももったいないキーです。ここではCapsLockをCommandに割り当てました。これでWindowsのようにコピー&ペーストができるようになります。CapsLockキーの押し間違えによってイライラしてしまうこともなくなります。ただ、あんまりオレオレ設定をしすぎると他の人のMacを操作した時にちょっと戸惑うというデメリットもあるので注意してください。

システム環境設定→ハードウェア→キーボード→キーボードショートカット

「フルキーボードアクセス」を「全てのコントロール」に設定します。WindowsのようにTabキーで全てのコントロールにフォーカスが当たるようになります。

 

メニューバーの時間表示部分に日付と曜日も表示する

システム環境設定→システム>日付と時刻

「日付を表示」にチェックを入れます。
「曜日を表示」にチェックを入れます。
この設定によって時間だけではなく、日付と曜日も表示されるようになります。

メニューバーに日付と曜日と時間を表示する

 

コンピュータ名を設定する

日本語版Macを使っているとデフォルトのコンピュータ名は結構な違和感があります。ターミナルを利用する際も表示されるので設定しなおしたほうがいいです。

参考画像ではMBAになっていますが、分かりやすいコンピュータ名をつけてあげます。

Macのコンピュータ名を設定

 

Finderの設定を行う

Finderメニューバー→Finder→環境設定→一般

「デスクトップに表示する項目」で外部ディスクなどを表示するようにします。USBメモリに簡単にアクセスしたり取り外しができたりします。
「新規Finderウィンドウで次を表示」で新規に開いたときユーザー名のフォルダを指定します。

Finderメニューバー→Finder→環境設定→サイドバー

サイドバーに好きなフォルダや項目を表示できます。よく使う項目はチェックを入れておくといいかと思います。

Finderメニューバー→Finder→環境設定→詳細

すべてのファイル名拡張子を表示にチェックをします。

Finderメニューバー→Finder→表示

パスバーを表示します。Explorerのアドレスバーがないのでかわりに表示するイメージです。上のフォルダに簡単にアクセスできます。

あとがき

私がMacbook Airにした設定は以上になります。設定項目はまだまだたくさんあるのですが、ここは見ておいたほうがいいだろうという部分をまとめたつもりですので、ちゃんと設定を見直せた人はだいぶ使いやすくなってきたのではないのでしょうか。

私も探り探りでやっていますので、間違いなどがありましたらコメントに一言いただけますと助かります。ここはもっとこうしたほうがいい!などというご意見もお待ちしています。

この記事の内容は全てOSの設定のみで出来ることですが、更に便利にMacを活用するために便利なソフトウェアがインターネットにはたくさん公開されています。無料で公開されている超便利なフリーソフトもたくさんあるので活用しない手はないです!

いまもリアルタイムで色々インストールして実践して試しているところなので、次回はソフトで更にMacを便利にする記事を書きたいと思います。お楽しみにー。

参考記事