「bash」タグアーカイブ

bash trap使うサンプル

trap中

#!/bin/bash -e

echo begin
trap 'echo trap exit' EXIT

echo processing
#sleep 3 # ターミナルでcontrol+C
#exit 1 # スクリプトをexit
#kill $$ # 自分のpidをkill
#false # -e オプション使用中に1の返り値

trap - EXIT
echo end

出力:

begin
processing
trap exit

trap解除後

#!/bin/bash -e

echo begin
trap 'echo trap exit' EXIT

echo processing

trap - EXIT

#sleep 3 # ターミナルでcontrol+C
#exit 1 # スクリプトをexit
#kill $$ # 自分のpidをkill
#false # -e オプション使用中に1の返り値

echo end

出力:

begin
processing

bash -e オプション

エラーコード(0以外のステータス)が発生した時にスクリプトを中断してくれる -e オプション。
中断しないケースを調べた。

中断しないケース

  • whileとuntilの直後のコマンドの場合
  • ifに使われている条件コマンドの場合
  • || や && リストに実行されるコマンドの場合、ただし最後のコマンドは除く
  • パイプラインの中のコマンドの場合、ただし最後のコマンドは除く
  • コマンドの結果を ! で反転している場合
  • サブシェルでエラーが発生したけど、その環境では-eを設定していない場合

エラーにたいするtrapが設定されている場合は、終わる前に実行される。

一部中断したくない場合の手段

||でコマンドを終わらせる

失敗した場合の処理又はtrueを追加する。
失敗コマンドのエラーコードは消えてしまう。

#!/bin/bash -e

false || true
echo $?
false || echo failed
echo $?
echo end

出力:

0
failed
0
end

&& trueでコマンドを終わらせる

何もしない && true で終わらせる。
失敗コマンドのエラーコードは取れる。

#!/bin/bash -e

false && true
echo $?
echo end

出力:

1
end

一時的に-eオプションを解除する

#!/bin/bash -e

set +e
false
set -e
echo end

出力:

end

参照

Bash Reference Manual (The Set Builtin) より引用:

Exit immediately if a pipeline (see Pipelines), which may consist of a single simple command (see Simple Commands), a list (see Lists), or a compound command (see Compound Commands) returns a non-zero status. The shell does not exit if the command that fails is part of the command list immediately following a while or until keyword, part of the test in an if statement, part of any command executed in a && or || list except the command following the final && or ||, any command in a pipeline but the last, or if the command’s return status is being inverted with !. If a compound command other than a subshell returns a non-zero status because a command failed while -e was being ignored, the shell does not exit. A trap on ERR, if set, is executed before the shell exits.

This option applies to the shell environment and each subshell environment separately (see Command Execution Environment), and may cause subshells to exit before executing all the commands in the subshell.

If a compound command or shell function executes in a context where -e is being ignored, none of the commands executed within the compound command or function body will be affected by the -e setting, even if -e is set and a command returns a failure status. If a compound command or shell function sets -e while executing in a context where -e is ignored, that setting will not have any effect until the compound command or the command containing the function call completes.

Mac ターミナルのカスタマイズ

bash

設定ファイル:.bash_profile

alias ls='ls -G'
alias l='ls -la'

emacs

設定ファイル:.emacs

(custom-set-variables
  ;; custom-set-variables was added by Custom -- don't edit or cut/paste it!
  ;; Your init file should contain only one such instance.
 '(case-fold-search t)
 '(global-font-lock-mode t nil (font-lock))
 '(show-paren-mode t nil (paren))
 '(transient-mark-mode t))
(custom-set-faces
  ;; custom-set-faces was added by Custom -- don't edit or cut/paste it!
  ;; Your init file should contain only one such instance.
 )

(setq make-backup-files nil)
(column-number-mode t)
(line-number-mode t)