応用編:POSIXシェルとの連携と共存
Bash や POSIX 標準スクリプトとの共存方針、bass プラグインを用いた環境設定の取り込み、およびモダンな開発ツールとの統合手法を解説します。
スクリプトと対話環境の棲み分け方針
fish を導入した際に最も重要な原則は、「対話操作には fish を使い、共有スクリプトには Bash/POSIX を使う」 という役割の分離です。
- 共有スクリプト(
.sh): CI/CD パイプライン、Docker コンテナ、チーム開発で共有するスクリプトには、常に#!/usr/bin/env bashまたは#!/bin/shを指定します。どのサーバーや開発者環境でも確実に動作することを最優先します。 - スクリプトの実行:
fish のターミナルから
./deploy.shやbash script.shを呼び出せば、シバンに従って自動的に Bash が立ち上がって実行されるため、何の問題もありません。
Bash スクリプトの読み込み(bass プラグイン)
SDK やミドルウェアのセットアップでは、「source env.sh を実行して環境変数を設定してください」と指示されるケースが多々あります。
このスクリプトには Bash の構文(export VAR=... 等)が含まれているため、fish の source コマンドで直接読み込むと構文エラーになります。
この問題を解決するのがプラグイン「bass」です。
# bass コマンド経由で Bash スクリプトを実行
bass source /opt/intel/oneapi/setvars.sh
# 引数付きの Bash コマンドを実行して環境を引き継ぐ
bass export AWS_PROFILE=staging
bass は内部で一度 Bash プロセスを起動してスクリプトを評価し、実行前後で変化した環境変数のみを抽出して現在の fish セッションに安全に適用します。
ツール初期化とフック(eval の代替)
多くの現代的な開発ツール(mise, starship, zoxide, direnv 等)は、シェルの起動時に初期化スクリプトを出力して読み込ませる構成をとります。
Bash では eval "$(tool init bash)" と書くパターンですが、fish ではパイプと source コマンドを組み合わせて直感的に記述します。
» 主要ツールの設定例(config.fish 内)
# mise(開発環境・ランタイムマネージャー)の有効化
mise activate fish | source
# Starship プロンプトの初期化
starship init fish | source
# zoxide(高速 cd ツール)の初期化
zoxide init fish | source
direnv によるディレクトリ単位の環境変数切り替え
プロジェクトごとに異なる環境変数を自動でロードする direnv も、fish と完全に統合できます。
# ~/.config/fish/config.fish
direnv hook fish | source
プロジェクトルートに .envrc(Bash 構文)を配置しておけば、ディレクトリに移動(cd)した瞬間に自動的に環境変数が適用され、ディレクトリから抜けると元に戻ります。