1.06.2基礎
/bin/shで実行するスクリプトにcleanup関数を定義する。
Bash固有のfunction予約語には依存しない。
適切な定義はどれか。
× 不正解
name() { commands; }はPOSIX shで利用できる関数定義形式である。function予約語はBash拡張である。
詳細解説
誤り
function cleanup() { rm -f -- "$tmp"; }functionと()を併用する形はBashでは使えるが、POSIX shの構文ではない。
Bashはfunctionと()の併用を受け入れるが、POSIX shが要求する構文ではない。/bin/shの実装を限定しない要件には適さない。
正しい
cleanup() { rm -f -- "$tmp"; }name()と波括弧を使うPOSIX形式の関数定義である。
cleanup()の直後に複合コマンド本体を置く形はPOSIX関数定義である。Bash以外の標準的なshでも利用できる。
誤り
cleanup = () { rm -f -- "$tmp"; }関数名と()の間へ代入演算子は置かない。
変数代入の=を関数定義へ挿入しており、shの文法に一致しない。()は値として代入されない。
誤り
cleanup: { rm -f -- "$tmp"; }コロンで関数を定義するsh構文ではない。
コロンはBashでは何もしない特殊組込みとして存在するが、NAME:で関数名を宣言する構文ではない。
実際に確かめる
一時的な検証環境で実行できる例です。
sh -c 'cleanup() { printf "cleaned\n"; }; cleanup'期待される結果
cleaned理解のポイント
- name()はPOSIX形式
- functionはBash拡張
- 本体は現在シェルで実行
確認時の注意
- 確認環境: POSIX sh / 状態変更なし
- 関数本体でlocalを使う場合も、POSIXではなくシェル実装依存となる。
基礎のおさらい
POSIX関数
NAME() compound-command形式は標準的なshで使える。
Bash拡張
function NAME形式はBashで利用できるが、#!/bin/shの移植性を求めるスクリプトでは避ける。
問題IDKL-102-914
確認環境POSIX sh / 状態変更なし
最終技術確認2026-08-13
誤り・権利侵害を報告