【ばっしゅ】

Bash とは?

最終更新:
💡 コマンド操作とスクリプト自動化の定番シェル

GNU Projectのシェル(コマンドを解釈して実行するプログラム)。多くのLinux環境で使われ、コマンド操作とシェルスクリプトの実行に使う。

📌 このページのポイント
Bashはコマンドを解釈するシェル ターミナル内で動くBash $ echo "Hello, World!" Hello, World! $ name="penguin" $ echo "$name" penguin 入力したコマンドを解釈して実行する スクリプトを読み込んで自動化にも使う
ターミナルと、その中でコマンドを解釈するBashを分けて考える。画面は操作例。
ひよこ ひよこ
ペンギン先生、Bashってどこがよいの?
ペンギン先生 ペンギン先生
使える場所が多いことだね。多くのLinux環境に入っていて、解説や学習資料もたくさんある。昔ながらのsh用スクリプトも、たいていは書き換えずにBashで動くんだ。ただし軽量なコンテナなど、Bashが入っていない環境もあるから、そこは確認しよう。
ひよこ ひよこ
「#!/bin/bash」ってよく見るけど何?
ペンギン先生 ペンギン先生
シバン(shebang)行と呼ばれる、スクリプトを動かすインタープリタを指定する行だよ。ファイルの1行目に書くと、そのファイルを直接実行したときに「Bashで動かしてね」という指定になる。「#!/usr/bin/env bash」と書けば、PATHの中から最初に見つかったbashを使うんだ。
ひよこ ひよこ
ZshやFishより先に学んだほうがいいの?
ペンギン先生 ペンギン先生
Linuxサーバを触る予定があるなら、Bashから入ると役立つ場面が多いよ。サーバ用のスクリプトや手順書はBash前提のものがよくあるからね。個人の作業用ならZshやFishが便利なこともあるし、基本的なコマンド操作の知識はどれにも生きるよ。
ひよこ ひよこ
Bashスクリプトで気をつけることってある?
ペンギン先生 ペンギン先生
よくある落とし穴は「変数のクォート」だね。$filenameを「"$filename"」とダブルクォートで囲まないと、スペースを含むファイル名で壊れるんだ。先頭に「set -euo pipefail」を書くのもよく使われる工夫だよ。-eは失敗したら止める、-uは未定義の変数をエラーにする、-o pipefailはパイプ途中の失敗も終了ステータスに反映する指定だね。
ひよこ ひよこ
set -eを書いておけば、失敗したら必ず止まるの?
ペンギン先生 ペンギン先生
必ずではないよ。ifの条件部分や、&&・||でつないだ途中のコマンド、!で結果を反転したコマンドなどが失敗しても止まらないんだ。だから大事な処理は、終了ステータスを自分でも確認しよう。ShellCheckという静的解析ツールを使うと、クォート忘れのようなよくあるミスを見つけやすいよ。
もっと詳しく知りたい人へ

「#!/bin/bash」と書いたのに「sh script.sh」で実行したらエラーになるのはなぜ?

sh script.shと打つと、起動したshがファイルを読み込むので、1行目の#!はただのコメントとして扱われるからだよ。シバン行が効くのは、実行権限を付けて./script.shのようにファイル自体を実行したときだね。Bash独自の書き方を使うなら、bash script.shで実行するか、chmod +xしてから./script.shで実行しよう。

Macのターミナルで開くシェルもBashなの?

macOS 10.15(Catalina)以降に作られたユーザーでは、既定のシェルはzshだよ。Bashも/bin/bashとして残っていて、設定でログインシェルを切り替えられる。Bash前提のスクリプトは、シバン行でbashを指定するか、bashコマンドで実行すれば動かせるよ。

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
Bashって出てきたら「Linuxなどで広く使われるシェル、コマンド操作とスクリプト自動化の定番」と思えればだいたいOK!
📖 おまけ:英語の意味
「Bourne-Again SHell」 = 「また生まれたボーンシェル」=Bourneシェルの流れをくむシェル
💬 Unixのshを作ったStephen Bourneの名前と「born again(生まれ変わる)」をかけたダジャレだよ。最初はGNU ProjectのBrian Foxが書いたんだ

参考資料

← 用語集にもどる