本記事では、LinuxシステムにおけるBashシェルの基本概念と機能について解説します。仮想マシン環境(例:VMware上のCentOS 7)とリモート接続ツール(例:MobaXterm)を使用した環境を前提とします。本記事の参考資料として、鳥氏の「Linux私房菜:基础版」と黒馬プログラマーのLinuxコースノートを参考にしています。各トピックの説明後には、GitHubの「The Missing Semester of Your CS Education」コースから提供される演習問題を取り扱います。
Bashシェルの基本機能
シェルの概要
Bashシェルを理解するためには、まずシェルとは何かを明確にする必要があります。
オペレーティングシステムが機能を実現するためには、以下の要素が必要です:
- ハードウェア(hardware):表示カード、サウンドカードなど、物理的に触れる実体であり、実際にはチップセットです。
- カーネル(kernel):チップセットをサポートする核心部分であり、実際にはチップに対応したドライバプログラムです。
- アプリケーション(application):入力/制御命令であり、ユーザーは直接アプリケーションを使用して各種機能を実現します。
上記は、**内側から外側へ**の機能要件です。Linuxシステムにおいて、シェルはこのアプリケーションに相当します。最も外層に位置し、卵の殻のように見えるため、「シェルプログラム」と呼ばれるわけです。
より深いレベルでは、シェルはコマンド言語インタプリタ(command-language interpreter)であり、それ自体が**インタプリタ型のプログラミング言語**です。シェルはコンピュータ上での操作やコマンドを、コンピュータが認識できるバイナリコマンドに変換し、カーネルに渡して関連操作を実行させます。同時に、コンピュータがコマンドの実行を終えた後、シェルがそれを自然言語に翻訳して私たちに提示します。
Bashシェルの概要
root権限で/etcディレクトリに移動し、shellsファイルを確認すると、Linuxに標準で搭載されているシェルファイルは4つあります:
- /bin/sh(現在は/bin/bashに置き換えられています)
- /bin/bash(Linuxのデフォルトシェル)
- /bin/tcsh(Cシェルを統合し、より多くの機能を提供)
- /bin/csh(現在は/bin/tcshに置き換えられています)
その中で、BashはBourneシェルと完全に後方互換性があり、Bourneシェルに多くの機能を追加・強化しています。また、BashはCシェルとKornシェルの長所も多く取り入れ、柔軟で強力なプログラミングインターフェースとユーザーフレンドリーなインターフェースを両立しています。
Bashシェルの基本機能
コマンド編集機能(history)
これはコマンドの記憶機能です。ただし、現在のセッションと前回のセッションでコマンド履歴は異なる場所に保存されます。現在のセッションで実行されたコマンドは一時的にメモリ(RAM)に保存され、ログアウトすると、現在のセッションのコマンドは**上書き**形式で~/.bash_historyに記録されます。
コマンドとファイル補完機能
この機能は一般的に知られています。以下の点に注意が必要です:
- [Tab]をコマンドの最初の文字の後に付けると、コマンド補完が実行されます
- [Tab]をコマンドの2文字目以降に付けると、「ファイル名補完」が実行されます
コマンドエイリアス設定機能(alias)
シェルは言語の一種であるため、コマンドにエイリアス(別名)を設定できます。以下に例を示します:
# Bash
alias ll='ls -al'
この設定により、llコマンドでls -alを実行できます。ただし、このエイリアス設定は**現在のセッションのみ有効**です。
永続的に有効にするには、ホームディレクトリの.bashrcファイルにエイリアス定義を追加します:
echo 'alias ll="ls -al"' >> ~/.bashrc
source ~/.bashrc
スクリプト(shell scripts)
システム管理で頻繁に使用される連続したコマンドをファイルに書き込み、対話式にホストの監視作業を行ったり、シェルが提供する環境変数や関連コマンドを使用して設計したりできます。
ワイルドカード(Wildcard)
完全な文字列に加えて、bashは多くのワイルドカードをサポートしており、ユーザーはこれらを使用してファイルを検索したりコマンドを実行したりできます。例えば、/usr/binディレクトリでAで始まるファイルを知りたい場合:
ls -l /usr/bin/A*
コマンドの実行と高速編集
コマンドが長すぎる場合、改行して入力する必要があります。この場合は、\\[Enter]を使用して[Enter]キーを「エスケープ」し、[Enter]キーが「実行開始」の機能を持たず、次の行でコマンドの入力を続けられるようにします。
エスケープが成功すると、次の行の先頭に>記号が表示され、コマンドの入力を続けられます。
スクリプトの作成と実行
スクリプトファイルを作成する際、最初の行にはシェルを指定する「シバン(shebang)」を記述します:
#!/bin/bash
この行は、bashをスクリプトの実行に使用するインタープリタとして指定します。ファイルの実行権限を付与するには:
chmod +x script_name
その後、以下のように実行します:
./script_name
スクリプト実行後の情報転送
パイプ(|)とリダイレクション(>)を使用して、スクリプトの出力をファイルに転送できます。例えば:
./script | grep "情報" > output.txt
ただし、リダイレクションはシェルによって処理されるため、root権限が必要なファイルに書き込む場合は、teeコマンドを使用する必要があります:
./script | sudo tee /root/output.txt
ビルトインハードウェア情報の取得
Linuxシステムでは、バッテリ情報は/sysディレクトリ内にあります。バッテリ情報を探すには:
find /sys -name "battery*" -o -name "power_supply*" | head -10
バッテリの残量情報を取得するには、acpiコマンドが便利ですが、インストールが必要な場合もあります:
sudo yum install acpi
acpi
または、/sys/class/power_supplyディレクトリ内に直接アクセスします:
cat /sys/class/power_supply/BAT0/capacity