<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Bash on 白と黒</title><link>https://chillfixx.work/tags/bash/</link><description>Recent content in Bash on 白と黒</description><generator>Hugo</generator><language>ja</language><lastBuildDate>Tue, 29 Sep 2026 13:03:00 +0900</lastBuildDate><atom:link href="https://chillfixx.work/tags/bash/index.xml" rel="self" type="application/rss+xml"/><item><title>bashのset -eが効かない5つの場面と対処法</title><link>https://chillfixx.work/blog/bash-set-e-pitfalls/</link><pubDate>Tue, 29 Sep 2026 13:03:00 +0900</pubDate><guid>https://chillfixx.work/blog/bash-set-e-pitfalls/</guid><description>&lt;h2 id="はじめにset--e-を書いたのに止まらない"&gt;はじめに:set -e を書いたのに止まらない&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;set -euo pipefail&lt;/code&gt; を先頭に書いておけば、途中で失敗したら止まる。そう思って書いたスクリプトが、失敗の後も平気で進んでいたことはありませんか?&lt;/p&gt;
&lt;p&gt;結論から書くと、&lt;code&gt;set -e&lt;/code&gt; には &lt;strong&gt;効かない文脈&lt;/strong&gt; があり、しかもその中で呼んだ関数の中身まで丸ごと無効になります。代表的なのは次の 5 つです。&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;場面&lt;/th&gt;
 &lt;th&gt;何が起きるか&lt;/th&gt;
 &lt;th&gt;直し方&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;f || rc=1&lt;/code&gt; のように呼んだ関数&lt;/td&gt;
 &lt;td&gt;関数の中のどの失敗でも止まらない&lt;/td&gt;
 &lt;td&gt;関数の中で &lt;code&gt;|| return 1&lt;/code&gt; を書く&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;echo &amp;quot;$(cmd)&amp;quot;&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;cmd&lt;/code&gt; が失敗しても空文字で進む&lt;/td&gt;
 &lt;td&gt;いったん &lt;code&gt;x=$(cmd)&lt;/code&gt; で受ける&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;local x=$(cmd)&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;local&lt;/code&gt; の成功 (0) で失敗が消える&lt;/td&gt;
 &lt;td&gt;宣言と代入を分ける&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;最後が &lt;code&gt;A &amp;amp;&amp;amp; B&lt;/code&gt; の関数&lt;/td&gt;
 &lt;td&gt;A が偽だと関数が 1 を返し、呼び出し元で止まる&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;if&lt;/code&gt; で書くか &lt;code&gt;return 0&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;x=$(jq ...)&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;壊れた JSON でも先頭の値が入る&lt;/td&gt;
 &lt;td&gt;終了ステータスを必ず見る&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;以下の実行結果は、どれも GNU bash 5.3.15 で確かめたものです。&lt;/p&gt;</description></item></channel></rss>