シェルスクリプトの set -e は罠いっぱい

set -e が推奨されることがあるが、罠があるので気をつけようぜ。
28
ふみやす@シェルまおう(自称でない) FGO:838,149,789 @satoh_fumiyasu

set -e は意図しにくい場合に終了してしまう場合があるのであまり使わないかも。‘command || exit 0` するようにしているので問題ない。set -u は使う。#shell

2012-01-16 02:24:36
ふみやす@シェルまおう(自称でない) FGO:838,149,789 @satoh_fumiyasu

Perl では最初に use strict; use warnings すべきなように、シェルでは set -u すべき。「例外処理って何? おいしいの?」って人は set -e もしておけ。

2012-06-25 18:25:20
ふみやす@シェルまおう(自称でない) FGO:838,149,789 @satoh_fumiyasu

シェルスクリプトをまともに書けない奴は、それでも書かなければならないときは、とりあえず変数展開するとき必ずダブルクォートで括れよ。$foo じゃなくて "$foo” な。あと最初に set -u; set -e でもしておきな。シェルスクリプトが駄目なんじゃなくて、書けないだけ。

2012-12-22 00:27:38
ふみやす@シェルまおう(自称でない) FGO:838,149,789 @satoh_fumiyasu

シェルスクリプトで set -e していると let var++ とか死ぬときがあるとか、いまひとつなときがあったりする話したっけ? let var++ || : にしないといけない。let 以外にあったっけ? twitter.com/decimalbloat/s…

2014-12-18 23:27:10
でちまるさん(実際かわいい) @decimalbloat

口には出さないけど一挙手一投足全てにor dieを付けてるスクリプト「set -e」

2014-12-18 23:15:02
ふみやす@シェルまおう(自称でない) FGO:838,149,789 @satoh_fumiyasu

let (算術演算)とか grep の結果を救うのが面倒というか嫌なので set -e はせずに、いちいち command || exit 1 する派。set -e のほうが固いかなー。流派替えしようか。 #シェル芸

2015-01-23 14:37:20
ふみやす@シェルまおう(自称でない) FGO:838,149,789 @satoh_fumiyasu

Makefile 内に foo: set -e; \ シェルスクリプト; \ シェルスクリプト とかシェルスクリプトを複数行で書き始めてしまうアカウントがこちらになります。 twitter.com/__Himajin/stat…

2015-05-02 00:07:22
鯉江 @koie

@satoh_fumiyasu シェルスクリプトでset -eつけててcmd..が失敗したり$(cmd..)が失敗したりした場合にエラーリカバリする常套手段ってどんなんでしょうか?1つおもいついたのは変数にundoコマンドをどんどん足していくかんじのものですがめんどい。

2015-12-03 19:30:28
SODA Noriyuki @n_soda

@satoh_fumiyasu @koie エラーリカバリとか考えるよりも、set -eやめて、コマンド && コマンド && ( エラー結果を無視するコマンド; コマンド ) && コマンドって感じで書いた方が楽な気がします。(僕は set -e は決して使わない派です

2015-12-04 15:50:16
鯉江 @koie

@n_soda @satoh_fumiyasu ぜんぶ&&でつないじゃうのは想定外でした。cd xx&&hogeくらいはよくやるんですが。

2015-12-04 16:14:52
ふみやす@シェルまおう(自称でない) FGO:838,149,789 @satoh_fumiyasu

set -e 状態でも local v=$(false) は死なない(死んで欲しい)けど、 v=$(false) は死にますね。 twitter.com/kawaz/status/7…

2016-05-21 16:44:07
Yoshiaki Kawazu🐸ずん @kawaz

Bash スクリプト書くときはコマンドの実行に失敗したらそこで終了する set -e オプションをよく使うんだが、これ foo=$(prog-fail) こんな風に変数代入で使ってるサブシェルの中身がエラーになったときに失敗させる方法も欲しいよなーて思うことがよくある。無いよね?

2016-05-21 10:46:55
ふみやす@シェルまおう(自称でない) FGO:838,149,789 @satoh_fumiyasu

ほー。やっぱり set -e はわかりにくいから好かんな。 sh - 関数と -e オプションを併用すると意図通りに動作しないのはなぜ? - スタック・オーバーフロー ja.stackoverflow.com/questions/2786…

2016-07-26 23:57:58
Hiroki Sato @Hiroki_Sato

-eはデバッグの補助に使うのは便利ですが、直感的でない動作がたくさんある(関数の中で動かないとか)ので、それを前提としたスクリプトを書くのはやめましょう。

2017-01-28 11:17:08
ふみやす@シェルまおう(自称でない) FGO:838,149,789 @satoh_fumiyasu

確かにほかにも直感的でない動作あったと思うのだが、思い出せないんだよな…。俺も滅多に使わない。>sh の set -e #シェル芸 twitter.com/Hiroki_Sato/st…

2017-01-28 11:36:48
Hiroki Sato @Hiroki_Sato

@satoh_fumiyasu $()の中でfalse返した時とかハマりやすいんじゃないかしら。foo=1foo1; a=$(expr "$foo" : "\([a-z]*\)"); echo "$a" とか。$(expr 1 - 1)もダメ。

2017-02-07 05:18:46
ふみやす@シェルまおう(自称でない) FGO:838,149,789 @satoh_fumiyasu

@Hiroki_Sato なるほど、expr(1) はハマった記憶あります。終了コードでエラーだけでなく状態を示すコマンドは見落しがちで危ないですね。>set -e

2017-02-07 13:49:14
ふみやす@シェルまおう(自称でない) FGO:838,149,789 @satoh_fumiyasu

@Hiroki_Sato 改行なし入力の read を考慮したことあったかな? 個人的にはあまり問題になったことはないかもしれません。set -e でなくても while read v 〜 でも駄目だし、罠がいっぱいな印象。

2017-02-07 13:59:03
. @senopen

今日はシェルスクリプトを書くことがあったのだけど、set -eつけててよかった。rmとかmv, ln、cp。影響が大きい。落としてくれてありがとう。 変な状態で処理すすむくらいなら落としてくれたほうがよっぽど安全。つけないことが考えられない。

2017-03-08 19:25:09
ふみやす@シェルまおう(自称でない) FGO:838,149,789 @satoh_fumiyasu

サブシェルでも駄目なのか、これ…。set -e は駄目だな。 #シェル芸 $ sh -c '(set -e; echo 1; false; echo 2) || echo failed' 1 2 ja.stackoverflow.com/questions/2786…

2017-03-19 15:11:45
利奈みんとbot🎉累計4万部突破!!🎉 @sysadgirl_mint

シェルスクリプトの中に「set -e」って書いておくと、何かエラー💣が起こったら必ずそこでスクリプトの実行が止まる🚫ようになるんですよ!😉絶対に失敗が許されないスクリプトを書く時に便利かも❓

2017-04-17 19:30:53
ふみやす@シェルまおう(自称でない) FGO:838,149,789 @satoh_fumiyasu

俺自身は set -e は使わないが、素人なら使ってもいい (使ったほうがマシ。どうせ他にも残念な点があるだろうから)って立場なんだが、誰かそんな感じの記事書いてくれないかなー。 #シェル芸 twitter.com/qiitapoi/statu…

2017-04-23 13:26:33
Qiita 人気の投稿 @qiitapoi

シェルスクリプトを書くときはset -euしておく dlvr.it/NxXzqZ

2017-04-21 09:28:06
hito @_hito_

@satoh_fumiyasu これ、set -eしたままで、必要なところで||:した方がいいよーな気がしなくも……。

2017-04-23 13:57:15
ふみやす@シェルまおう(自称でない) FGO:838,149,789 @satoh_fumiyasu

.@_hito_ set -e が効かない条件をすべて把握しているならそれでいいかもしれませんけど…。自分はすぐ忘れてしまうので使わないです。 #シェル芸

2017-04-23 14:06:15
hito @_hito_

@satoh_fumiyasu まあ真面目にエラーハンドリングしろやーってのはその通りですね……。

2017-04-23 14:06:56