mcpField
B
bash-53-features

bash-53-features

github.com/josiahsiegel開発59155 回インストール19 週間前に更新
リポジトリ

bash-53-features について

bash-53-featuresは、Bash 5.3の機能、例、互換性情報、移行方法をまとめたスキルです。新しい構文や組み込みコマンドを利用しつつ、旧バージョンのBashにも配慮するシェルスクリプト作成者向けです。

主な機能

  1. 01Bash 5.3の構文と組み込みコマンド
  2. 02サブシェルを避ける置換構文
  3. 03対話型readとsourceのオプション
  4. 04グロブの並べ替えとシグナル処理
  5. 05バージョン確認と移行例

活用シーン

  1. 01シェルスクリプトで新しい置換構文を使う
  2. 02対話入力に補完を追加する
  3. 03更新日時でグロブ結果を並べ替える
  4. 04機能利用前にBashのバージョンを確認する

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/josiahsiegel/claude-plugin-marketplace --skill bash-53-features

インストール後、Claude Code で/bash-53-featuresを入力して読み込まれたか確認します。

詳細

🚨 重要なガイドライン

Windows のファイルパス要件

必須:Windows ではファイルパスに必ずバックスラッシュを使用してください

Windows で Edit ツールまたは Write ツールを使用する場合、ファイルパスにはスラッシュ(/)ではなく、必ずバックスラッシュ(\)を使用してください。

例:

  • ❌ 誤り:D:/repos/project/file.tsx
  • ✅ 正しい:D:\repos\project\file.tsx

これは次の項目に適用されます。

  • Edit ツールの file_path パラメーター
  • Write ツールの file_path パラメーター
  • Windows システム上でのすべてのファイル操作
ドキュメント作成ガイドライン

ユーザーから明示的に依頼されない限り、新しいドキュメントファイルを作成しないでください。

  • 優先事項:新しいドキュメントを作成するのではなく、既存の README.md ファイルを更新してください
  • リポジトリの整理:ユーザーから別途依頼がない限り、リポジトリのルートは README.md だけにして、整理された状態を保ってください
  • スタイル:ドキュメントは簡潔で明快、かつプロフェッショナルな文体にしてください。AI が生成したような文体は避けてください
  • ユーザーの希望:ユーザーからドキュメント作成を具体的に依頼された場合に限り、追加の .md ファイルを作成してください

Bash 5.3 の機能(2025年)

概要

Bash 5.3(2025年7月リリース)では、パフォーマンス、可読性、機能性を向上させる重要な新機能が導入されています。

主な新機能

1. シェル内コマンド置換

新機能:${ command; } 構文 - サブシェルをフォークせずに実行します(現在のシェルコンテキストで実行されます)。

# OLD way (Bash < 5.3) - Creates subshell
output=$(expensive_command)

# NEW way (Bash 5.3+) - Runs in current shell, faster
output=${ expensive_command; }

メリット:

  • サブシェルのオーバーヘッドがありません(高速です)
  • 変数のスコープが保持されます
  • ループのパフォーマンスが向上します

例:

#!/usr/bin/env bash

# Traditional approach
count=0
for file in *.txt; do
    lines=$(wc -l < "$file")  # Subshell created
    ((count += lines))
done

# Bash 5.3 approach (faster)
count=0
for file in *.txt; do
    lines=${ wc -l < "$file"; }  # No subshell
    ((count += lines))
done
2. REPLY 変数を使用したコマンド置換

新機能:${| command; } 構文 - 結果を REPLY 変数に格納します。

# Runs command, result goes to $REPLY automatically
${| complex_calculation; }
echo "Result: $REPLY"

# Multiple operations
${|
    local_var="processing"
    echo "$local_var: $((42 * 2))"
}
echo "Got: $REPLY"

用途:

  • 変数名の競合を回避する
  • 一時的な値をすっきりした構文で扱う
  • 結果の格納先変数を標準化する
3. read 組み込みコマンドの機能強化

新機能:-E オプション - プログラム可能な補完機能を備えた readline を使用します。

# Interactive input with tab completion
read -E -p "Enter filename: " filename
# User can now tab-complete file paths!

# With custom completion
read -E -p "Select environment: " env
# Enables full readline features (history, editing)

メリット:

  • 対話型スクリプトのユーザー体験が向上します
  • パス補完が組み込まれています
  • コマンド履歴をサポートします
4. source 組み込みコマンドの機能強化

新機能:-p PATH オプション - source 用のカスタム検索パスを指定します。

# OLD way
source /opt/myapp/lib/helpers.sh

# NEW way - Search custom path
source -p /opt/myapp/lib:/usr/local/lib helpers.sh

# Respects CUSTOM_PATH instead of current directory
CUSTOM_PATH=/app/modules:/shared/lib
source -p "$CUSTOM_PATH" database.sh

メリット:

  • ライブラリをモジュール単位で整理できます
  • パスのハードコーディングを回避できます
  • 環境に応じた source が可能です
5. compgen 組み込みコマンドの機能強化

新機能:変数への出力オプション - 補完候補を変数に格納します。

# OLD way - Output to stdout
completions=$(compgen -f)

# NEW way - Directly to variable
compgen -v completions_var -f
# Results now in $completions_var

メリット:

  • 補完の処理がすっきりします
  • 余分なサブシェルが不要です
  • パフォーマンスが向上します
6. GLOBSORT 変数

新機能:glob のソート動作を制御します。

# Default: alphabetical sort
echo *.txt

# Sort by modification time (newest first)
GLOBSORT="-mtime"
echo *.txt

# Sort by size
GLOBSORT="size"
echo *.txt

# Reverse alphabetical
GLOBSORT="reverse"
echo *.txt

オプション:

  • name - アルファベット順(デフォルト)
  • reverse - アルファベットの逆順
  • size - ファイルサイズ順
  • mtime - 更新日時順
  • -mtime - 更新日時の逆順
7. BASH_TRAPSIG 変数

新機能:トラップ内で使用できるシグナル番号の変数です。

#!/usr/bin/env bash
set -euo pipefail

# BASH_TRAPSIG contains the signal number being handled
handle_signal() {
    echo "Caught signal: $BASH_TRAPSIG" >&2
    case "$BASH_TRAPSIG" in
        15) echo "SIGTERM (15) received, shutting down gracefully" ;;
        2)  echo "SIGINT (2) received, cleaning up" ;;
        *)  echo "Signal $BASH_TRAPSIG received" ;;
    esac
}

trap handle_signal SIGTERM SIGINT SIGHUP

メリット:

  • 再利用可能なシグナルハンドラーを作成できます
  • シグナルに応じた動的な動作を実現できます
  • ロギングとデバッグが向上します
8. 浮動小数点演算

新機能:ロード可能な組み込みコマンド fltexpr

# Enable floating-point support
enable -f /usr/lib/bash/fltexpr fltexpr

# Perform calculations
fltexpr result = 42.5 * 1.5
echo "$result"  # 63.75

# Complex expressions
fltexpr pi_area = 3.14159 * 5 * 5
echo "Area: $pi_area"

用途:

  • 科学計算
  • 財務計算
  • 外部ツール(bc、awk)の使用を回避する

パフォーマンスの向上

サブシェルの回避
# ❌ OLD (Bash < 5.3) - Multiple subshells
for i in {1..1000}; do
    result=$(echo "$i * 2" | bc)
    process "$result"
done

# ✅ NEW (Bash 5.3+) - No subshells
for i in {1..1000}; do
    result=${ echo $((i * 2)); }
    process "$result"
done

パフォーマンス向上率: ベンチマークで約40%高速化

効率的なファイル処理
#!/usr/bin/env bash

# Process large file efficiently
process_log() {
    local line_count=0
    local error_count=0

    while IFS= read -r line; do
        ((line_count++))

        # Bash 5.3: No subshell for grep
        if ${ grep -q "ERROR" <<< "$line"; }; then
            ((error_count++))
        fi
    done < "$1"

    echo "Processed $line_count lines, found $error_count errors"
}

process_log /var/log/app.log

移行ガイド

Bash のバージョンを確認する
#!/usr/bin/env bash

# Require Bash 5.3+
if ((BASH_VERSINFO[0] < 5 || (BASH_VERSINFO[0] == 5 && BASH_VERSINFO[1] < 3))); then
    echo "Error: Bash 5.3+ required (found $BASH_VERSION)" >&2
    exit 1
fi
機能の検出
# Test for 5.3 features
has_bash_53_features() {
    # Try using ${ } syntax
    if eval 'test=${ echo "yes"; }' 2>/dev/null; then
        return 0
    else
        return 1
    fi
}

if has_bash_53_features; then
    echo "Bash 5.3 features available"
else
    echo "Using legacy mode"
fi
段階的な導入
#!/usr/bin/env bash
set -euo pipefail

# Support both old and new bash
if ((BASH_VERSINFO[0] > 5 || (BASH_VERSINFO[0] == 5 && BASH_VERSINFO[1] >= 3))); then
    # Bash 5.3+ path
    result=${ compute_value; }
else
    # Legacy path
    result=$(compute_value)
fi

ベストプラクティス(2025年)

  1. パフォーマンスが重要なループでは ${ } を使用する

    for item in "${large_array[@]}"; do
        processed=${ transform "$item"; }
    done
    
  2. 一時的な値をすっきり扱うには ${| } を使用する

    ${| calculate_hash "$file"; }
    if [[ "$REPLY" == "$expected_hash" ]]; then
        echo "Valid"
    fi
    
  3. 対話型スクリプトでは readline を有効にする

    read -E -p "Config file: " config
    
  4. モジュール化されたライブラリには source -p を使用する

    source -p "$LIB_PATH" database.sh logging.sh
    
  5. 必要なバージョンをドキュメントに記載する

    # Requires: Bash 5.3+ for performance features
    

互換性に関する注意事項

Bash 5.3 の入手方法(2025年)

注: Bash 5.3(2025年7月リリース)は最新の安定版です。2025年10月時点で Bash 5.4 はありません。

  • Linux:Ubuntu 24.04 以降、Fedora 40 以降、Arch(現行版)
  • macOS:Homebrew(brew install bash)
  • Windows:Ubuntu 24.04 以降を使用した WSL2
  • コンテナー:公式イメージ bash:5.3
C23 への準拠

Bash 5.3 は C23 言語規格に準拠するよう更新されました。注: K&R スタイルの C コンパイラーはサポート対象外になりました。

フォールバックパターン
#!/usr/bin/env bash
set -euo pipefail

# Detect bash version
readonly BASH_53_PLUS=$((BASH_VERSINFO[0] > 5 || (BASH_VERSINFO[0] == 5 && BASH_VERSINFO[1] >= 3)))

process_items() {
    local item
    for item in "$@"; do
        if ((BASH_53_PLUS)); then
            result=${ transform "$item"; }  # Fast path
        else
            result=$(transform "$item")      # Compatible path
        fi
        echo "$result"
    done
}

実際の使用例

高速ログパーサー
#!/usr/bin/env bash
set -euo pipefail

# Parse log file (Bash 5.3 optimized)
parse_log() {
    local file="$1"
    local stats_errors=0
    local stats_warnings=0
    local stats_lines=0

    while IFS= read -r line; do
        ((stats_lines++))

        # Fast pattern matching (no subshell)
        ${| grep -q "ERROR" <<< "$line"; } && ((stats_errors++))
        ${| grep -q "WARN" <<< "$line"; }  && ((stats_warnings++))
    done < "$file"

    echo "Lines: $stats_lines, Errors: $stats_errors, Warnings: $stats_warnings"
}

parse_log /var/log/application.log
対話型設定
#!/usr/bin/env bash
set -euo pipefail

# Interactive setup with readline
setup_config() {
    echo "Configuration Setup"
    echo "==================="

    # Tab completion for paths
    read -E -p "Data directory: " data_dir
    read -E -p "Config file: " config_file

    # Validate and store
    ${|
        [[ -d "$data_dir" ]] && echo "valid" || echo "invalid"
    }

    if [[ "$REPLY" == "valid" ]]; then
        echo "DATA_DIR=$data_dir" > config.env
        echo "CONFIG_FILE=$config_file" >> config.env
        echo "✓ Configuration saved"
    else
        echo "✗ Invalid directory" >&2
        return 1
    fi
}

setup_config

リソース


Bash 5.3 では、パフォーマンスとユーザビリティが大幅に向上しています。古いシステムとの後方互換性を維持しながら、これらの機能を段階的に導入してください。

コメント