技術資料

Bashで複数のコマンドをまとめて実行する:丸括弧とサブシェルの使い方

作成日:2026.11.05

Bashで複数のコマンドを丸括弧でまとめて実行する方法を紹介します。変数や作業ディレクトリへの影響、波括弧との違いを確認し、curlの順次実行と出力保存、失敗時の制御を具体例で解説します。

Bashのコマンド例で、複数の行が丸括弧()で囲まれていることがあります。curlを続けて実行するときなどに見かけますが、単に複数行に分けて書くのとは少し意味が違います。

今回は、丸括弧でコマンドをまとめる基本と、変数や作業ディレクトリへの影響を確認してから、curlでAPIを順番に呼び出す例を試してみます。

対象はBashです。Docker内のDebian 12(linux/amd64)、Bash 5.2.15、curl 7.88.1で、以下のコードをスクリプトとして実行確認しました。

複数行に書くだけなら、括弧はなくてもよい

コマンドを順番に実行するだけなら、次のように改行して並べればOKです。

printf 'one\n'
printf 'two\n'
one
two

一方、長いコマンドの引数を複数行に分けたいときは、行末にバックスラッシュ\を置いて行を継続できます。これは一つのコマンドを読みやすく折り返す記法で、複数のコマンドをグループ化する記法とは別です。バックスラッシュの直後に改行が必要なので、その後ろに空白を入れないようにしましょう。

丸括弧で囲むとサブシェルで実行される

()でコマンドを囲むと、ひとまとまりとしてサブシェルで実行されます。ここでは、現在のシェルの状態を引き継いだ別の実行環境、と考えると分かりやすいかと思います。

例えば、括弧の内側で変数を書き換えてみます。

value=outer
(
    value=inner
    printf 'inside=%s\n' "$value"
)
printf 'outside=%s\n' "$value"
inside=inner
outside=outer

内側ではinnerになっていますが、括弧を抜けた後は元のouterのままです。一時的な変数を使いたいときに、この性質が便利です。

cdによる移動も外側には残らない

作業ディレクトリも同様です。次の例では、内側だけ/tmpへ移動します。

start_dir=$PWD
(
    cd /tmp && pwd
)
if [ "$PWD" = "$start_dir" ]; then
    printf 'outside directory unchanged\n'
fi
/tmp
outside directory unchanged

特定のディレクトリでコマンドを実行してから、元の場所で作業を続けたい場合にも使えます。&&は、左側のコマンドが成功した場合だけ右側を実行する記法です。この例では、移動に成功した場合だけpwdで現在位置を表示します。

現在のシェルでまとめたい場合は波括弧を使う

{}で囲む方法もあります。こちらはサブシェルを作らず、現在のシェルで実行します。

value=outer
{
    value=inner
    printf 'inside=%s\n' "$value"
}
printf 'outside=%s\n' "$value"
inside=inner
outside=inner

今度は外側もinnerになりました。cdで移動した場合も、その変更が残ります。1行で書く場合は{ value=inner; }のように、波括弧とコマンドの間を空白で区切り、最後のコマンドの後ろにセミコロンを置きます。上の複数行の例では、セミコロンの代わりに改行で区切っています。

curlをまとめて実行してみる

ここからは、2つの商品情報をGETで順番に取得する例にします。https://api.example.comは説明用で、実行可能なサンプルAPIではありません。URLとパスは、自分で確認してよいテスト用APIへ置き換えてください。

また、結果をproducts.txtへ保存するので、空の作業用ディレクトリで試してください。同名ファイルがあると上書きされます。

base_url=outside
(
    base_url=https://api.example.com
    curl --silent --show-error --fail --max-time 5 \
        "$base_url/products/1" &&
    curl --silent --show-error --fail --max-time 5 \
        "$base_url/products/2"
) > products.txt
group_status=$?
cat products.txt
printf 'outside=%s\ngroup_status=%s\n' "$base_url" "$group_status"

各APIが改行付きのJSONを返すダミーAPIで確認すると、次の結果になりました。

{"id":1}
{"id":2}
outside=outside
group_status=0

括弧の内側だけに接続先URLを設定し、最初のcurlが成功した場合に2つ目を実行しています。\で折り返しているのは各curlの引数で、&&の後ろはそのまま改行できます。この書き方は並列実行ではなく、順番に実行するものです。

) > products.txtとすると、グループ全体の標準出力を一つのファイルへ保存できます。エラーメッセージなどの標準エラーは、この指定ではファイルに入りません。レスポンスの区切りや改行を自動で追加する機能もないため、改行のない本文なら連続して保存されます。

$?は直前のコマンドの終了コードです。ここではグループの直後にgroup_statusへ保存しています。先にcatなどを実行すると、そのコマンドの終了コードへ変わってしまうので、確認する順番に注意しましょう。

curlの--silent --show-errorは進捗表示を抑えつつエラーを表示する指定、--failはHTTPエラーを失敗として扱う指定、--max-time 5は1回の転送を最大5秒に制限する指定です。リクエストやレスポンスの基本は、PowerShellでcurlを使ってREST APIを確認する記事も参考にしてください。ただし、シェルごとの記法の違いはあります。

括弧で囲むだけでは、途中の失敗で止まらない

丸括弧は、失敗時に後続の処理を止めるためのものではありません。例えば、set -eを有効にしていないBashで、次を実行してみます。接続先は、HTTP 404を返すテスト用APIに置き換えてください。

(
    curl --silent --show-error --fail --max-time 5 \
        https://api.example.com/missing
    printf 'continued\n'
)
printf 'status=%s\n' "$?"

curlは404で失敗しますが、次のprintfは実行されます。標準エラーにはcurlのエラーが出て、標準出力は次のようになりました。

continued
status=0

グループの終了コードは、最後に実行したコマンドの終了コードです。この場合は最後のprintfが成功するため、グループも0になります。

成功した場合だけ次へ進めたいなら、curlの例と同じように&&でつなぎます。

(
    curl --silent --show-error --fail --max-time 5 \
        https://api.example.com/missing &&
    printf 'continued\n'
)
printf 'status=%s\n' "$?"
status=22

今回はcontinuedが表示されず、HTTPエラーによるcurlの終了コード22がグループの終了コードになりました。--failを付けないcurlは、通常、404のレスポンスを受信できただけでは失敗終了にならない点にも注意が必要です。

なお、サブシェルの内側で変数や作業ディレクトリを変更しても外側へ残りませんが、ファイルへの書き込みやAPIでの更新まで取り消されるわけではありません。この例でもproducts.txtは実際に作成されます。途中で失敗した場合は、それまでに取得した本文だけがファイルへ残ることもあります。

今回のcurlの例は、接続先だけをDocker内のダミーAPIへ差し替えて確認しました。実API、HTTPS、認証、対話シェルへの貼り付け操作は検証していません。

一時的な変数やディレクトリ移動を内側に閉じ込めたいなら()、現在のシェルの状態を変えたいなら{}、という使い分けになります。そこへ&&やリダイレクトを組み合わせると、ちょっとした確認コマンドもまとめて扱いやすくなるかと思います。

参考資料

この記事を書いた人

※上が私です。

奈良市を拠点に、27年以上の経験を持つフリーランスWebエンジニア、阿部辰也です。

これまで、ECサイトのバックエンド開発や業務効率化システム、公共施設の予約システムなど、多彩なプロジェクトを手がけ、企業様や制作会社様のパートナーとして信頼を築いてまいりました。

【制作会社・企業様向けサポート】
  • 専任エンジニアのいない企業様に対するシステム面の不安を解消
  • 柔軟な契約形態や短納期での対応により、急なニーズにも迅速にサポート
  • システムの企画段階から運用まで、ワンストップでのサービスを提供

Webシステムの開発やサイト改善でお困りの際は、どうぞお気軽にご相談ください。小さな疑問から大規模プロジェクトまで、最適なご提案を心を込めてさせていただきます。

ぜひ、プロフィールやWeb制作会社様向け業務案内、一般企業様向け業務案内もご覧くださいね。

PowerShellでcurlを使う:REST APIのGET・JSON POSTとエラーの確認

2026.11.03

WindowsのPowerShellからcurlでREST APIを試す方法を紹介します。GETのクエリ指定、JSONファイルのPOST、Bearer認証ヘッダーの付け方に加え、レスポンスの保存やHTTPステータス・終了コードによるエラーの切り分けを解説します。

cURL PowerShell

PHP cURLの証明書エラー:VERIFYPEERを無効にする危険性とCAバンドルの設定方法

2026.11.02

PHPのcURLで「unable to get local issuer certificate」が出たとき、CURLOPT_SSL_VERIFYPEERをfalseにする対処が危険な理由を解説します。証明書の信頼性検証とホスト名照合の違いを整理し、WindowsでのCAバンドルの取得、curl.cainfoの設定、反映確認までを紹介します。

cURL OpenSSL PHP

阿部辰也へのお仕事の依頼・お問い合わせ

軽いご相談もお気軽にどうぞ!

個人情報の取り扱いについて *必須 プライバシーポリシーをご確認いただき、同意いただける場合は「同意する」にチェックをしてください。

keyboard_double_arrow_up
TOP