🇯🇵 日本語 | 🇺🇸 English | 🇪🇸 Español | 🇵🇹 Português | 🇹🇭 ไทย | 🇨🇳 中文

FishとBashの違いを比較しながら学ぶ基本操作の流れ

Web制作の現場で欠かせない「黒い画面」、つまりターミナル(シェル)でのコマンド操作。多くの人が「Bash」というデフォルトのシェルを何気なく使っているのではないでしょうか。しかし、世の中にはもっと高機能で、私たちの作業を劇的に効率化してくれるシェルが存在します。その代表格が、今回ご紹介する「Fish(Friendly Interactive Shell)」です。

この記事では、最もポピュラーな「Bash」と比較しながら、Fishの基本的な使い方から魅力的な機能までを徹底解説します。Webクリエイターの皆さんが、明日からのコーディングライフをより快適にするための第一歩として、ぜひこの記事をお役立てください。すべてのコードはコピペするだけで完全に動作するように作られています。「動いた!」という小さな成功体験を積み重ねながら、Fishの世界を探検していきましょう!

FishとBash、何が違うの? シェルの基本を知ろう

まずは、それぞれのシェルの特徴を簡単に掴んでおきましょう。

例えるなら、Bashが「マニュアル通りの操作が必要な、信頼できるベテランの機械」だとすれば、Fishは「こちらの意図を先読みしてサポートしてくれる、賢いAIアシスタント」のような存在です。では、早速その実力を見ていきましょう。

【実践】ここが違う!FishとBashの基本操作を徹底比較

ここからは、具体的な操作を比較しながらFishの便利な機能を体験していきます。Fishが未インストールの方は、お使いの環境に合わせてインストールしておきましょう。

macOS (Homebrew) の場合:

brew install fish

Ubuntu/Debian の場合:

sudo apt-get update
sudo apt-get install fish

インストール後、ターミナルで `fish` と入力すればFishシェルが起動します。

1. 見た目と情報量が違う!プロンプトの比較

シェルを起動して最初に目にするのが、コマンドを入力する左側部分の「プロンプト」です。ここから既にBashとFishには大きな違いがあります。

Bashの一般的なプロンプト:
ユーザー名やホスト名、現在のディレクトリなどが表示されますが、比較的シンプルです。

user@hostname:~/project$ 

Fishのデフォルトプロンプト:
Fishは、ユーザー名と現在のディレクトリパスが分かりやすく表示されます。特に、Gitリポジトリ内にいる場合は、ブランチ名まで自動で表示してくれるのが非常に便利です。Webクリエイターにとって、Git操作は日常茶飯事。どのブランチで作業しているかが一目でわかるのは、ミスを防ぐ上で大きな助けになります。

user@hostname ~/project (main)> 

2. Fish最大の武器!オートサジェスチョン(自動補完)

Fishを「神シェル」たらしめている最大の機能が、このオートサジェスチョンです。これは、過去に入力したコマンドの履歴を元に、次に入力するであろうコマンドを薄い灰色で予測表示してくれる機能です。

例えば、過去に `git commit -m "Initial commit"` というコマンドを打ったことがあるとします。次に `git c` と入力しただけで…

Fishのオートサジェスチョン:
このように、入力途中のコマンドに続けて、履歴から推測されたコマンド全体が薄く表示されます。このサジェスチョンでよければ、 (右矢印キー) または Ctrl + F を押すだけで、コマンド全体が確定します。もう長いコマンドを何度も打ち込む必要はありません。

user@hostname ~/project (main)> git commit -m "Initial commit"

Bashでも補完機能はありますが、通常は Tab キーを押して候補を表示させる必要があり、Fishほどシームレスで直感的ではありません。この体験だけでも、Fishに乗り換える価値は十分にあります。

3. タイプミスが激減!シンタックスハイライト

Fishは、入力中のコマンドが「有効かどうか」をリアルタイムで色分けして教えてくれます。これをシンタックスハイライトと呼びます。

有効なコマンドの場合 (例: `echo`):
システムに存在する有効なコマンドは、デフォルトで水色で表示されます。

echo "Hello World"

存在しないコマンドの場合 (例: `ech` とタイポ):
もしコマンドを打ち間違えたり、存在しないコマンドを入力したりすると、瞬時に赤色で表示されます。これにより、コマンドを実行する前に「あっ、間違えた!」と気づくことができ、無駄なエラーを未然に防げます。

ech "Hello World"

この機能のおかげで、コマンドの打ち間違いによる「command not found」というお馴染みのエラーメッセージを見る機会がぐっと減るでしょう。

応用編:スクリプトの書き方はどう違う?

シェルの役割は、対話的な操作だけではありません。一連の処理を自動化するための「シェルスクリプト」を書く際にも、FishとBashには思想の違いが表れます。Fishのスクリプトは、よりモダンで読みやすい構文を目指して設計されています。

1. 変数の定義

Bashの場合:
`変数名=値` という形式で記述します。等号の周りにスペースを入れてはいけない、という独特のルールがあります。

MY_PROJECT="My Awesome Site"
echo $MY_PROJECT

Fishの場合:
`set` というコマンドを使って変数を定義します。これにより、何をしているかが明確になり、引数として値を渡すため、スペースの有無に悩まされることもありません。

set MY_PROJECT "My Awesome Site"
echo $MY_PROJECT

2. if文 (条件分岐)

Web制作の現場では、「もし `package.json` ファイルが存在したら `npm install` を実行する」といった条件分岐がよく使われます。

Bashの場合:
`[` (testコマンド) や `[[` を使った、少し古風な記法が一般的です。`; then` や `fi` といったキーワードも必要です。

if [ -f "package.json" ]; then
  echo "package.json を発見!"
fi

Fishの場合:
他のプログラミング言語のように、より直感的に記述できます。`if` の後に直接条件式を書き、`end` でブロックを閉じます。`then` や `;` は不要で、コードがすっきりとします。

if test -f "package.json"
  echo "package.json を発見!"
end

3. forループ (繰り返し処理)

複数のファイルに対して同じ処理を行う場合など、繰り返し処理もよく使います。

Bashの場合:
`for`, `in`, `do`, `done` といったキーワードの組み合わせでループを構成します。

for i in {1..3}; do
  echo "Bash loop count: $i"
done

Fishの場合:
こちらも `if` 文と同様に、`do` が不要で `end` でブロックを閉じるシンプルな構文です。`()` で囲まれた部分は「コマンド置換」と呼ばれ、コマンドの実行結果をリストとして扱います。

for i in (seq 1 3)
  echo "Fish loop count: $i"
end

Fishへ移行する際の注意点

Fishの魅力をお伝えしてきましたが、移行する上でいくつか知っておくべき「気をつけるべき点」があります。これらを理解しておけば、戸惑うことなくスムーズにFishライフを始められます。

1. Bashとの構文の非互換性

これまで見てきたように、Fishはスクリプトの可読性を重視しているため、Bashと完全な互換性はありません。特に、インターネット上で見つけたBash用のコマンドをコピペする際に注意が必要です。

コマンドの連結 (`&&`, `||`)

Bashでは、`&&` を使って「前のコマンドが成功したら次のコマンドを実行する」という処理をよく書きます。

# ディレクトリを作成し、成功したらそのディレクトリに移動する
mkdir my_dir && cd my_dir

Fishでは、これをより明確な `and` というキーワードで表現します。(近年のFishでは `&&` も使えますが、公式には `and` や `;` の使用が推奨されています)

# Fish流の書き方
mkdir my_dir; and cd my_dir

同様に、Bashの `||` (前のコマンドが失敗したら次を実行) は、Fishでは `or` に対応します。「Bashのコマンドが動かない!」と思ったら、この違いを思い出してください。

2. 環境変数の設定方法

ツールのパスを通す際などに設定する「環境変数」。この設定方法も異なります。

Bashの場合 (`~/.bash_profile` などに記述):
`export` コマンドを使って環境変数を設定します。

export NODE_ENV="development"

Fishの場合 (`~/.config/fish/config.fish` に記述):
`set` コマンドに `-x` または `--export` というフラグを付けて設定します。これにより、その変数が現在のシェルだけでなく、子プロセスにも引き継がれるようになります。

set -x NODE_ENV "development"

特に `PATH` 変数に新しいパスを追加する場合、Fishでは少し特殊な書き方をします。`$PATH` はリスト(配列)として扱われるため、以下のようにシンプルに追加できます。

# ~/.node_modules/bin をPATHの先頭に追加する
set -x PATH ~/.node_modules/bin $PATH

Bashのようにコロン `:` で繋げて文字列として結合する必要がなく、より安全で直感的にパスを管理できます。

まとめ:さあ、Fishを使ってみよう!

今回は、標準的なシェルであるBashと比較しながら、次世代のシェル「Fish」の基本的な使い方とその魅力を解説しました。

Fishのメリットまとめ:

もちろん、Bashには「どこでも使える」「膨大な情報量」という大きなメリットがあります。しかし、日々の開発作業を共にする「相棒」として、よりフレンドリーで強力なFishを選んでみるのはいかがでしょうか。特に、これからコマンドラインに慣れていきたいWebクリエイター初心者の方にとって、Fishは最高の学習パートナーになってくれるはずです。

この記事で紹介した機能は、Fishの魅力のほんの一部に過ぎません。次のステップとして、プラグインマネージャーを使ったカスタマイズに挑戦してみましょう。見た目をカッコよくしたり、さらに便利な機能を追加したりして、あなただけの最強のターミナル環境を構築できます。

次の記事へ: Fishのカスタマイズとテーマ導入(Fisher, Oh My Fish)入門ガイド