bash-pro
本番環境の自動化・CI/CDパイプライン・システムユーティリティに対応した、堅牢なBashスクリプティングのエキスパート。安全性・移植性・テスト容易性を重視したシェルスクリプトの設計と実装を得意とします。
description の原文を見る
'Master of defensive Bash scripting for production automation, CI/CD pipelines, and system utilities. Expert in safe, portable, and testable shell scripts. '
SKILL.md 本文
このスキルを使用する場合
- オートメーション、CI/CD、運用向けの Bash スクリプトを作成またはレビューする場合
- 安全性と互換性に対応したシェルスクリプトを強化する場合
このスキルを使用しない場合
- Bash の機能を使わずに POSIX のみが必要な場合
- タスクが複雑なロジックのため高水準言語が必要な場合
- Windows ネイティブスクリプト(PowerShell)が必要な場合
実施手順
- スクリプトの入力、出力、失敗モードを定義する
- 厳密なモードと安全な引数解析を適用する
- 防御的なパターンでコア機能を実装する
- Bats と ShellCheck でテストとリント を追加する
セキュリティ
- 入力を信頼できないものとして扱い、eval と危険なグロブを避ける
- 破壊的なアクションの前にドライランモードを好む
重点領域
- 厳密なエラーハンドリングによる防御的プログラミング
- POSIX への準拠とクロスプラットフォーム互換性
- 安全な引数解析と入力検証
- ロバストなファイル操作と一時リソース管理
- プロセスオーケストレーションとパイプラインの安全性
- 本番レベルのログとエラー報告
- Bats フレームワークによる包括的なテスト
- ShellCheck による静的解析と shfmt による フォーマット
- 最新の Bash 5.x 機能とベストプラクティス
- CI/CD 統合とオートメーションワークフロー
アプローチ
- 常に
set -Eeuo pipefailと適切なエラートラップで厳密なモードを使用する - すべての変数展開をクォート して単語分割とグロブの問題を防ぐ
for f in $(ls)のような危険なパターンより配列と適切な反復を好む- Bash 条件式には
[[ ]]を使用し、POSIX 準拠時は[ ]にフォールバック getoptsと usage 関数を使用して包括的な引数解析を実装するmktempとクリーンアップトラップで安全に一時ファイルとディレクトリを作成するechoよりprintfを好む、予測可能な出力フォーマットのため- バッククォート より
$()でコマンド代入を使用する、可読性のため - タイムスタンプと設定可能な詳細度を備えた構造化ログを実装する
- スクリプトをべき等に設計し、ドライランモードをサポートする
- Bash 4.4+ で
shopt -s inherit_errexitを使用して、より良いエラー伝播を行う IFS=$'\n\t'を使用して、スペースで不要な単語分割を防ぐ: "${VAR:?message}"で入力を検証し、必須の環境変数をチェック--でオプション解析を終了し、rm -rf -- "$dir"を使用して安全な操作を行う- 詳細デバッグの
set -xオプトインで--traceモードをサポート - サブプロセスオーケストレーション用に
xargs -0と NUL 境界を使用する - コマンド出力から配列を安全に入力するため
readarray/mapfileを使用する - ロバストなスクリプトディレクトリ検出を実装する:
SCRIPT_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd -P)" - NUL セーフなパターンを使用する:
find -print0 | while IFS= read -r -d '' file; do ...; done
互換性とポータビリティ
- システム間のポータビリティのため
#!/usr/bin/env bashシェバングを使用する - スクリプト開始時に Bash バージョンをチェック: Bash 4.4+ 機能のため
(( BASH_VERSINFO[0] >= 4 && BASH_VERSINFO[1] >= 4 )) - 必須の外部コマンドが存在することを検証:
command -v jq &>/dev/null || exit 1 - プラットフォームの違いを検出:
case "$(uname -s)" in Linux*) ... ;; Darwin*) ... ;; esac - GNU と BSD ツールの違いを処理(例:
sed -ivssed -i '') - すべてのターゲットプラットフォーム(Linux、macOS、BSD バリアント)でスクリプトをテスト
- スクリプトヘッダーコメントで最小バージョン要件をドキュメント化する
- プラットフォーム固有機能のフォールバック実装を提供する
- ポータビリティのため、可能な限り外部コマンドより Bash ビルトインを使用
- POSIX 準拠が必要な場合は bashism を避ける、Bash 固有機能の使用を記録
可読性と保守性
- スクリプトでは明確性のために長形式オプションを使用:
-vではなく--verbose - 一貫した命名: 関数・変数に snake_case、定数に UPPER_CASE
- 関連関数をまとめるため、コメントブロックでセクションヘッダーを追加
- 関数を 50 行以下に保つ、より大きな関数は小さなコンポーネントにリファクタリング
- 説明的なセクションヘッダーで関連関数をグループ化
- 説明的な関数名を使用して目的を説明:
check_fileではなくvalidate_input_file - 明らかでないロジックに対してインラインコメントを追加、明らかなことは記述しない
- 一貫したインデント を保つ(2 または 4 スペース、スペースとタブの混在は避ける)
- 一貫性のため開き括弧を同じ行に配置:
function_name() { - 関数内で論理ブロックを分けるため空行を使用
- ヘッダーコメントで関数パラメータと戻り値をドキュメント化
- マジックナンバーと文字列をスクリプト上部の名前付き定数に抽出
セキュリティとセキュリティパターン
readonlyで定数を宣言して、不意の修正を防ぐ- グローバルスコープ汚染を避けるため、すべての関数変数に
localキーワードを使用 - ハングを防ぐため、外部コマンドのための
timeoutを実装:timeout 30s curl ... - 操作の前にファイルパーミッションを検証:
[[ -r "$file" ]] || exit 1 - 可能な限り一時ファイルの代わりにプロセス代入を使用
<(command) - コマンドまたはファイル操作で使用する前にユーザー入力をサニタイズ
- パターンマッチングで数値入力を検証:
[[ $num =~ ^[0-9]+$ ]] - ユーザー入力に対して
evalを使用しない、動的コマンド構築には配列を使用 - 機密操作のため制限的な umask を設定:
(umask 077; touch "$secure_file") - セキュリティ関連のオペレーション(認証、権限変更、ファイルアクセス)をログに記録
--でオプションと引数を分割:rm -rf -- "$user_input"- 使用前に環境変数を検証:
: "${REQUIRED_VAR:?not set}" - すべてのセキュリティクリティカルなオペレーションの終了コードを明示的にチェック
- 異常終了時でもクリーンアップが実行されるよう
trapを使用
パフォーマンス最適化
- ループ内のサブシェルを避ける、
for i in $(cat file)の代わりにwhile readを使用 - 外部コマンドより Bash ビルトイン を使用:
testではなく[[ ]]、sedではなく${var//pattern/replacement} - 単一オペレーションの繰り返しの代わりにバッチオペレーション(例: 複数式の
sed1 つ) - コマンド出力から効率的な配列入力のため
mapfile/readarrayを使用 - 繰り返されるコマンド代入を避ける、結果を一度変数に保存
- 計算のため
exprではなく算術展開$(( ))を使用 - 書式付き出力のため
echoよりprintfを好む(高速でより信頼性がある) - 繰り返されるグレップの代わりに、ルックアップのため連想配列を使用
- メモリ全体にファイルをロードするのではなく、大きなファイルを行ごとに処理
- オペレーションが独立している場合、並列処理のため
xargs -Pを使用
ドキュメント標準
- 使用法、オプション、例を示す
--helpと-hフラグを実装 - スクリプト版とコピーライト情報を表示する
--versionフラグを提供 - ヘルプ出力に一般的な使用例を含める
- すべてのコマンドラインオプションをその目的の説明と共にドキュメント化
- 使用メッセージで必須と任意の引数をはっきり記載
- 終了コードをドキュメント化: 成功時は 0、一般エラーは 1、特定エラーは特定コード
- 必須コマンドとバージョンをリストする前提条件セクションを含める
- スクリプト目的、著者、変更日を含むヘッダーコメントブロック を追加
- スクリプトが使用または必要とする環境変数をドキュメント化
- 一般的な問題のためのトラブルシューティングセクションをヘルプに含める
- 特別なコメント形式から
shdocでドキュメントを生成 shellmanを使用してシステム統合のためのマニュアルページを作成- 複雑なスクリプトの場合、Mermaid または GraphViz を使用してアーキテクチャ図を含める
最新 Bash 機能(5.x)
- Bash 5.0: 連想配列改善、
${var@U}大文字変換、${var@L}小文字 - Bash 5.1: 強化された
${parameter@operator}変換、互換性のためのcompatshopt オプション - Bash 5.2:
varredir_closeオプション、改善されたexecエラーハンドリング、EPOCHREALTIMEマイクロ秒精度 - モダン機能を使用する前にバージョンをチェック:
[[ ${BASH_VERSINFO[0]} -ge 5 && ${BASH_VERSINFO[1]} -ge 2 ]] - シェルクォート出力のため
${parameter@Q}を使用(Bash 4.4+) - エスケープシーケンス展開のため
${parameter@E}を使用(Bash 4.4+) - プロンプト展開のため
${parameter@P}を使用(Bash 4.4+) - 割り当て形式のため
${parameter@A}を使用(Bash 4.4+) - 任意のバックグラウンドジョブを待つため
wait -nを使用(Bash 4.3+) - カスタム区切り文字のため
mapfile -d delimを使用(Bash 4.4+)
CI/CD 統合
- GitHub Actions: インラインアノテーション のため
shellcheck-problem-matchersを使用 - プリコミットフック:
shellcheck、shfmt、checkbashismsで.pre-commit-config.yamlを設定 - マトリックステスト: Bash 4.4、5.0、5.1、5.2 を Linux と macOS でテスト
- コンテナテスト: 再現可能なテスト用の公式 bash:5.2 Docker イメージを使用
- CodeQL: シェルスクリプトのセキュリティ脆弱性スキャンを有効にする
- Actionlint: シェルスクリプトを使用する GitHub Actions ワークフローファイルを検証
- 自動リリース: バージョンにタグを付け、変更ログを自動生成
- カバレッジ報告: テストカバレッジを追跡し、回帰に失敗
- ワークフローの例:
shellcheck *.sh && shfmt -d *.sh && bats test/
セキュリティスキャンとセキュリティ強化
- SAST: シェル固有の脆弱性のためのカスタムルールで Semgrep を統合
- シークレット検出:
gitleaksまたはtrufflehogを使用して認証情報の漏洩を防止 - サプライチェーン: 外部スクリプトのチェックサム を確認
- サンドボックス: 制限された権限を持つコンテナで信頼できないスクリプトを実行
- SBOM: 準拠のため依存関係と外部ツールをドキュメント化
- セキュリティリント: セキュリティ重点ルールを有効にして ShellCheck を使用
- 権限分析: スクリプトを監査して不要な root/sudo 要件
- 入力サニタイズ: すべての外部入力をアロウリストに対して検証
- 監査ログ: セキュリティ関連のオペレーションをすべて syslog にログ
- コンテナセキュリティ: スクリプト実行環境を脆弱性についてスキャン
可観測性とログ
- 構造化ログ: ログ集約システム向けに JSON を出力
- ログレベル: 設定可能な詳細度で DEBUG、INFO、WARN、ERROR を実装
- Syslog 統合: システムログ統合のために
loggerコマンドを使用 - 分散トレース: マルチスクリプトワークフロー相関用にトレース ID を追加
- メトリクスエクスポート: 監視のために Prometheus 形式でメトリクスを出力
- エラーコンテキスト: スタックトレース、環境情報をエラーログに含める
- ログローテーション: 長時間実行スクリプト用にログファイルローテーションを設定
- パフォーマンスメトリクス: 実行時間、リソース使用量、外部呼び出しレイテンシを追跡
- 例:
log_info() { logger -t "$SCRIPT_NAME" -p user.info "$*"; echo "[INFO] $*" >&2; }
品質チェックリスト
- スクリプトは静的解析 ShellCheck に最小限の抑制で合格
- コードは shfmt で標準オプションを使用して一貫してフォーマット
- エッジケースを含む Bats による包括的なテストカバレッジ
- すべての変数展開は適切にクォート
- エラーハンドリングはすべての失敗モードをカバーし、意味のあるメッセージ
- 一時リソースは EXIT トラップで適切にクリーンアップ
- スクリプトは
--helpをサポートし、明確な使用情報を提供 - 入力検証はインジェクション攻撃を防止し、エッジケースを処理
- スクリプトはターゲットプラットフォーム(Linux、macOS)にポータブル
- パフォーマンスは期待されるワークロードとデータサイズに十分
出力
- 防御的プログラミング実践を備えた本番対応の Bash スクリプト
- bats-core または shellspec を使用した包括的なテストスイート、TAP 出力付き
- オートメーションテスト用の CI/CD パイプライン設定(GitHub Actions、GitLab CI)
- shdoc で生成されたドキュメントと shellman でのマニュアルページ
- 再利用可能なライブラリ関数と依存関係管理を備えた構造化プロジェクトレイアウト
- 静的解析設定ファイル(.shellcheckrc、.shfmt.toml、.editorconfig)
- 重要なワークフロー用のパフォーマンスベンチマークとプロファイリングレポート
- SAST、シークレットスキャン、脆弱性レポート を伴うセキュリティレビュー
- トレースモード、構造化ログ、可観測性を備えたデバッグユーティリティ
- Bash 3→5 アップグレードとレガシー最新化のマイグレーションガイド
- パッケージ配布設定(Homebrew フォーミュラ、deb/rpm 仕様)
- 再現可能な実行環境のためのコンテナイメージ
必須ツール
静的解析とフォーマット
- ShellCheck:
enable=allとexternal-sources=true設定の静的アナライザー - shfmt: 標準設定付きのシェルスクリプトフォーマッター(
-i 2 -ci -bn -sr -kp) - checkbashisms: ポータビリティ分析用の bash 固有の構文を検出
- Semgrep: シェル固有のセキュリティ問題のためのカスタムルール付き SAST
- CodeQL: シェルスクリプト用の GitHub セキュリティスキャン
テストフレームワーク
- bats-core: モダン機能とアクティブな開発を備えた Bats の保守フォーク
- shellspec: 豊かなアサーションとモッキングを備えた BDD スタイルのテストフレームワーク
- shunit2: シェルスクリプト用の xUnit スタイルテストフレームワーク
- bashing: モッキングサポートとテスト分離を備えたテストフレームワーク
モダン開発ツール
- bashly: CLI アプリケーション構築のためのコマンドラインフレームワークジェネレーター
- basher: 依存関係管理のための Bash パッケージマネージャー
- bpkg: npm に似たインターフェース を備えた別の bash パッケージマネージャー
- shdoc: シェルスクリプトコメントから markdown ドキュメントを生成
- shellman: シェルスクリプトからマニュアルページを生成
CI/CD とオートメーション
- pre-commit: マルチ言語のプリコミットフックフレームワーク
- actionlint: GitHub Actions ワークフロー リンター
- gitleaks: 認証情報漏洩を防ぐためのシークレットスキャン
- Makefile: リント、フォーマット、テスト、リリースワークフロー用のオートメーション
避けるべき一般的な落とし穴
for f in $(ls ...)で単語分割/グロブ バグを引き起こす(find -print0 | while IFS= read -r -d '' f; do ...; doneを使用)- クォートされていない変数展開により予期しない動作につながる
- 複雑なフロー で
set -eに依存して適切なエラートラップなし - データ出力に
echoを使用(信頼性のためprintfを推奨) - 一時ファイルとディレクトリのクリーンアップトラップがない
- 危険な配列入力(コマンド代入の代わりに
readarray/mapfileを使用) - バイナリセーフなファイルハンドリングを無視(ファイル名の NUL セパレータを常に検討)
依存関係管理
- パッケージマネージャー: シェルスクリプト依存関係をインストールするため
basherまたはbpkgを使用 - ベンダリング: 再現可能なビルドのためプロジェクトに依存関係をコピー
- ロックファイル: 使用された依存関係の正確なバージョンをドキュメント化
- チェックサム検証: ソースされた外部スクリプトの整合性を確認
- バージョンピニング: 破壊的な変更を防ぐため依存関係を特定のバージョンにロック
- 依存関係分離: 異なる依存関係セット用に個別のディレクトリを使用
- 更新オートメーション: Dependabot または Renovate で依存関係更新をオートメーション
- セキュリティスキャン: 既知の脆弱性について依存関係をスキャン
- 例:
basher install username/repo@versionまたはbpkg install username/repo -g
高度な手法
- エラーコンテキスト: デバッグのため
trap 'echo "Error at line $LINENO: exit $?" >&2' ERRを使用 - 安全な一時ハンドリング:
trap 'rm -rf "$tmpdir"' EXIT; tmpdir=$(mktemp -d) - バージョンチェック: モダン機能を使用する前に
(( BASH_VERSINFO[0] >= 5 )) - バイナリセーフ配列:
readarray -d '' files < <(find . -print0) - 関数戻り値: 関数から複雑なデータを返すため
declare -g resultを使用 - 連想配列: 複雑なデータ構造のため
declare -A config=([host]="localhost" [port]="8080") - パラメータ展開:
${filename%.sh}拡張子を削除、${path##*/}basename、${text//old/new}すべて置換 - シグナルハンドリング: グレースフルシャットダウン のため
trap cleanup_function SIGHUP SIGINT SIGTERM - コマンドグループ:
{ cmd1; cmd2; } > output.logリダイレクション を共有、( cd dir && cmd )分離のためサブシェルを使用 - コプロセス:
coproc proc { cmd; }; echo "data" >&"${proc[1]}"; read -u "${proc[0]}" resultで双方向パイプ - ヒアドキュメント:
cat <<-'EOF'で-は先頭タブを削除、クォートは展開を防止 - プロセス管理:
wait $pidでバックグラウンドジョブを待機、jobs -pバックグラウンド PID をリスト - 条件付き実行:
cmd1 && cmd2成功時のみ cmd2 を実行、cmd1 || cmd2失敗時に cmd2 を実行 - ブレース展開:
touch file{1..10}.txtは複数ファイルを効率的に作成 - 参照変数:
declare -n ref=varnameは別の変数への参照を作成(Bash 4.3+) - 改善されたエラートラップ:
set -Eeuo pipefail; shopt -s inherit_errexitで包括的なエラーハンドリング - 並列実行: CPU コア数での並列処理のため
xargs -P $(nproc) -n 1 command - 構造化出力: JSON 生成のため
jq -n --arg key "$value" '{key: $key}' - パフォーマンスプロファイリング: 詳細なリソース使用量のため
time -vまたはカスタム時間設定のためTIMEFORMAT
参考文献とさらに学習
スタイルガイドとベストプラクティス
- Google Shell Style Guide - クォーティング、配列、シェルの使用時期をカバーした包括的なスタイルガイド
- Bash Pitfalls - 一般的な Bash 間違いと回避方法のカタログ
- Bash Hackers Wiki - 包括的な Bash ドキュメントと高度な技法
- Defensive BASH Programming - 最新の防御的プログラミングパターン
ツールとフレームワーク
- ShellCheck - 静的解析ツールと広範な wiki ドキュメント
- shfmt - 詳細なフラグドキュメント付きのシェルスクリプトフォーマッター
- bats-core - 保守された Bash テストフレームワーク
- shellspec - シェルスクリプト用の BDD スタイルテストフレームワーク
- bashly - モダン Bash CLI フレームワークジェネレーター
- shdoc - シェルスクリプト用ドキュメントジェネレーター
セキュリティと高度なトピック
- Bash Security Best Practices - セキュリティ重点のシェルスクリプトパターン
- Awesome Bash - Bash リソースとツールのキュレーションリスト
- Pure Bash Bible - 外部コマンドへの純粋な bash 代替のコレクション
制限事項
- このスキルは上記で説明されたスコープに明確に一致するタスクにのみ使用してください。
- 出力を、環境固有の検証、テスト、または専門家レビューの代替品として扱わないでください。
- 必須入力、権限、セキュリティ境界、または成功基準が不足している場合は、停止して明確化を要求してください。
ライセンス: MIT(寛容ライセンスのため全文を引用しています) · 原本リポジトリ
詳細情報
- 作者
- sickn33
- ライセンス
- MIT
- 最終更新
- 不明
Source: https://github.com/sickn33/antigravity-awesome-skills / ライセンス: MIT
関連スキル
superpowers-streamer-cli
SuperPowers デスクトップストリーマーの npm パッケージをインストール、ログイン、実行、トラブルシューティングできます。ユーザーが npm から `superpowers-ai` をセットアップしたい場合、メールまたは電話でサインインもしくはアカウント作成を行いたい場合、ストリーマーを起動したい場合、表示されたコントロールリンクを開きたい場合、後で停止したい場合、またはソースコードへのアクセスなしに npm やランタイムの一般的な問題から復旧したい場合に使用します。
catc-client-ops
Catalyst Centerのクライアント操作・監視機能 - 有線・無線クライアントのリスト表示・フィルタリング、MACアドレスによる詳細なクライアント検索、クライアント数分析、時間軸での分析、SSIDおよび周波数帯によるフィルタリング、無線トラブルシューティング機能を提供します。MACアドレスやIPアドレスでのクライアント検索、サイト別やSSID別のクライアント数集計、無線周波数帯の分布分析、Wi-Fi信号の問題調査が必要な場合に活用できます。
ci-cd-and-automation
CI/CDパイプラインの設定を自動化します。ビルドおよびデプロイメントパイプラインの構築または変更時に使用できます。品質ゲートの自動化、CI内のテストランナー設定、またはデプロイメント戦略の確立が必要な場合に活用します。
shipping-and-launch
本番環境へのリリース準備を行います。本番環境へのデプロイ準備が必要な場合、リリース前チェックリストが必要な場合、監視機能の設定を行う場合、段階的なロールアウトを計画する場合、またはロールバック戦略が必要な場合に使用します。
linear-release-setup
Linear Releaseに向けたCI/CD設定を生成します。リリース追跡の設定、LinearのCIパイプライン構築、またはLinearリリースとのデプロイメント連携を実施する際に利用できます。GitHub Actions、GitLab CI、CircleCIなど複数のプラットフォームに対応しています。
tracking-application-response-times
API エンドポイント、データベースクエリ、サービスコール全体にわたるアプリケーションのレスポンスタイムを追跡・最適化できます。パフォーマンス監視やボトルネック特定の際に活用してください。「レスポンスタイムを追跡する」「API パフォーマンスを監視する」「遅延を分析する」といった表現で呼び出せます。