AlmaLinux 9 総合ガイド 第3章

第3章: 基本的なコマンドライン操作


3.1 コマンドライン操作の重要性

3.1.1 CLIの定義と特徴

CLI(Command-Line Interface)は、テキストベースのコマンド入力を通じてOSやアプリケーションと対話する方式です。AlmaLinux9では、dnfsystemctlsestatusといった管理ツールがすべてCLIとして提供され、GUIでは実現しにくい細かな制御や詳細情報の取得が可能です。CLIは最小限のリソースで動作し、自動化・リモート操作との相性にも優れています。 (Wikipedia, シャーデウム)

3.1.2 軽量性とパフォーマンス

  • リソース消費が少ない
    グラフィカルな描画処理を伴わないため、CPU・メモリ負荷を抑制できます。
  • 高速起動・応答
    コマンド入力後すぐに実行でき、GUIアプリ起動の待ち時間がありません。
# AlmaLinux9サーバー上で最新のセキュリティパッチを一行で適用
sudo dnf update --security

💡ポイント:
低スペックマシンやコンテナ環境では、CLIの軽量性がシステム安定性向上に直結します。 (GeeksforGeeks, Wikipedia)

3.1.3 自動化とスクリプト

  • 一貫した運用
    CLIコマンドはシェルスクリプトにまとめやすく、AnsibleやRHELシステムロールとの連携で大規模展開にも対応できます。
  • エラー軽減
    手動操作を削減し、同じ手順を確実に実行できます。
#!/bin/bash
# daily_update.sh — 毎日0時にパッケージを自動更新
sudo dnf upgrade -y \
  && echo "$(date '+%Y-%m-%d %H:%M'): Update completed" >> ~/upgrade.log

💡ポイント:
シェルスクリプト化によりヒューマンエラーを防ぎ、運用の信頼性を格段に向上できます。 (Wikipedia, Red Hat Documentation)

3.1.4 リモート管理と可搬性

  • SSHによるリモート操作
    ネットワーク越しに同じCLI環境で作業でき、物理的なアクセス不要。
  • クロスプラットフォーム
    異なる環境間(オンプレ/クラウド/コンテナ)でも同一コマンドが実行可能。
# リモートサーバーへのSSHログイン後、ログファイルの末尾を取得
ssh admin@server.example.com 'tail -n 100 /var/log/messages'

💡ポイント:
SSHを使ったCLI操作で、どこからでも安全かつ迅速にサーバー管理が行えます。 (Wikipedia, Wikipedia)

3.1.5 再現性とトレーサビリティ

  • コマンド履歴
    historyコマンドで過去の操作を即座に確認・再実行可能。
  • バージョン管理との連携
    スクリプトや設定ファイルをGitなどで管理し、変更履歴を追跡できます。
# 過去100コマンドを表示
history | tail -n 100

💡ポイント:
操作手順を明文化し、トラブルシュート時の再現性を確保するとチーム開発での共有も円滑になります。 (Wikipedia, シャーデウム)

3.1.6 セキュリティ管理の柔軟性

  • SELinux設定
    sestatussemanageでポリシーを詳細に確認・変更できます。
  • ファイアウォール制御
    firewall-cmdでゾーンやポートを即時反映。
# SELinuxの現在モードを確認
sestatus

# firewalldにポートを追加して再読み込み
sudo firewall-cmd --permanent --add-port=8080/tcp
sudo firewall-cmd --reload

💡ポイント:
CLIから直接セキュリティ設定を操作することで、GUIでは対応しづらい細やかなポリシー調整が可能です。 (linuxcareers.com, Red Hat Documentation)

3.2 シェルとターミナル

AlmaLinux 9の操作は、GUIよりもCLI(コマンドラインインターフェース)で行うことが推奨されます。その中核を成す「シェル」と、シェルと対話する「ターミナル」について詳しく掘り下げます。

3.2.1 シェルとは何か

シェルは、ユーザーのコマンド入力を解釈し、OSカーネルへ橋渡しを行うコマンド言語インタープリタです。AlmaLinux 9ではデフォルトでBashが採用されており、/bin/bashとして動作します。

  • 役割:コマンドの解釈・実行、スクリプト処理、環境変数管理など
  • 代表的なシェル:Bash、Zsh、Fish、Dash など (Red Hat Documentation, GNU)
  • 利点:CシェルやKornシェルの機能も取り込みつつ、高い互換性と拡張性を提供

💡ポイント:
Bashは「Bourne-Again SHell」の略で、スクリプトや対話操作をバランスよくサポートします。

3.2.2 シェルの種類と用途

  1. ログインシェル
    • sshログイン時やコンソールログイン時に起動
    • 読み込まれる初期化ファイル:
      /etc/profile~/.bash_profile~/.bash_login~/.profile
  2. 対話シェル(Interactive Shell)
    • ユーザーが直接コマンドを入力する用途
    • プロンプト表示、履歴機能、補完機能を提供
  3. 非対話シェル(Non-interactive Shell)
    • シェルスクリプト実行時に起動
    • プロンプトや補完はなく、$BASH_ENV~/.bashrcが読み込まれる場合あり

3.2.3 シェル初期化ファイルの仕組み

各種シェルは起動時に設定ファイルを読み込むことで動作をカスタマイズします。

種類読み込まれるファイル主な用途
ログインシェル/etc/profile, ~/.bash_profile など環境変数設定、PATH追加
対話シェル~/.bashrcエイリアス、プロンプト設定、関数定義
ログアウト時~/.bash_logout後処理、ログ、クリーンアップ
# 実行ユーザー: 一般ユーザー
# ~/.bashrc のエイリアス設定を即時反映
source ~/.bashrc

💡ポイント:
~/.bash_profile内で source ~/.bashrc を行うと、ログイン/非ログイン時の設定を一元管理できます。

3.2.4 デフォルトシェルの確認・変更

  • 確認
# 実行ユーザー: 一般ユーザー
# 結果: 現在のログインシェルを表示
echo $SHELL
  • 変更(例:Zshに切り替え)
# 実行ユーザー: 一般ユーザー
# 結果: /etc/shellsに定義されたシェルへ変更
chsh -s /bin/zsh

💡ポイント:
/etc/shells に登録されていないパスは chshで設定できないため、事前に確認してください。

3.2.5 ターミナルとは何か

ターミナルはシェルとの入出力を仲介するインターフェースです。物理的なハードウェア端末(TTY)から、GUI上の端末エミュレータ(PTY)まで形態は多様です。

  • TTY(物理/仮想コンソール)
    • Linuxでは Ctrl+Alt+F3 等でアクセス
    • デバイスファイル例:/dev/tty1, /dev/tty2 (man7.org)
  • PTY(端末エミュレータ)
    • GNOME Terminal、xterm、Konsole、SSHセッション
    • ttyコマンドで接続先を確認可能
# 実行ユーザー: 任意
# 結果: 標準入力が接続されている端末ファイル名を表示
tty

3.2.6 仮想コンソールと端末エミュレータの使い分け

種類特徴利用シーン
仮想コンソール(TTY)Xサーバーが動かない状況でも利用可能システム障害時の直接操作
端末エミュレータ(PTY)GUI環境からウィンドウで操作、コピー/ペーストが容易日常的な運用作業、マルチウィンドウ管理

3.2.7 端末マルチプレクサの活用

tmuxやscreenを使うことで、一つのターミナル内で複数ウィンドウやセッションを管理できます。

  • tmux
    • AlmaLinux9のインストーラーでも tmux が用いられ、複数のログ出力やシェル操作が行われます (Red Hat Documentation)
# 実行ユーザー: 任意
# 結果: 新規セッション「my-session」を作成
tmux new -s my-session
  • screen
    基本的なウィンドウ管理に向く軽量マルチプレクサ

💡ポイント:
マルチプレクサ内での作業はSSH切断後も保持されるため、長時間実行ジョブに最適です。

3.2.8 セキュリティとの関わり

  • アクセス制御:TTYはpamやSELinuxポリシーで制限可能
  • ログ取得scriptコマンドで端末操作を丸ごと記録
# 実行ユーザー: root
# 結果: 端末操作を typescript へ記録開始
script ~/session.log
  • オートログアウトTMOUT環境変数で非操作時に自動終了

3.3 基本コマンドの習得

AlmaLinux9では、パッケージ管理(dnf)やサービス管理(systemctl)など多数のCLIコマンドを駆使します。ここでは、日常的なファイル/ディレクトリ操作、テキスト処理、検索コマンドを詳解し、運用効率とトラブル対応力を向上させましょう。

3.3.1 ディレクトリ操作

何を: 作業ディレクトリの確認・移動、一覧表示
なぜ: ファイル管理の基本。正しい位置でコマンドを実行しないと意図しない操作を招くため。
どうやって: 主にpwdcdlsを使い分けます。

pwd — 現在の作業ディレクトリを表示

  • 実行ユーザー: 一般ユーザー
  • 結果: カレントディレクトリの絶対パスが表示されます。
pwd

💡ポイント:
pwdはシェル内部の組み込み版と、env pwdで呼び出すGNU版があり、後者はシンボリックリンクを解決する(-P)等のオプションを備えています。 (man7.org, GNU)

cd — ディレクトリ移動

  • 実行ユーザー: 一般ユーザー
  • 結果: 指定ディレクトリへ移動。
cd /etc
  • 補足: 引数なしでホームディレクトリへ。cd -で前回のディレクトリに戻ります。

ls — ディレクトリ内容の一覧表示

  • 実行ユーザー: 一般ユーザー
  • 結果: ファイル・ディレクトリの一覧を表示。
ls -lah /var/log
  • 主なオプション
    • -l:詳細表示(パーミッション、所有者、サイズ、更新日時)
    • -a:ドットファイルも含め全表示
    • -h:人間に読みやすいサイズ表記(例:1.2K, 5M)
      💡ポイント:
      ls -lahだけで容量や更新日時、所有者まで一目で把握でき、ログディレクトリやSELinuxコンテキスト(後述)の確認に便利です。 (GNU, man7.org)

3.3.2 ファイル操作

何を: ファイルのコピー・移動・削除、新規作成
なぜ: 設定ファイルのバックアップや、ログアーカイブ、不要データのクリーンアップに必須
どうやって: cpmvrmtouchなどを適切に使用します。

cp — ファイル/ディレクトリのコピー

  • 実行ユーザー: 一般ユーザー
  • 結果: コピー元とコピー先に同一のデータを生成。
cp /etc/hosts ~/hosts.bak
  • 主なオプション
    • -a:アーカイブモード(再帰的かつ属性保持)
    • -i:上書き確認
    • -v:処理ファイルを詳細出力
      💡ポイント:
      設定ファイルのバックアップはcp -aで所有権・パーミッション・SELinuxコンテキストも保持できます。 (man7.org)

mv — ファイル/ディレクトリの移動・名称変更

  • 実行ユーザー: 一般ユーザー
  • 結果: 新しい場所へ移動、または名前を変更。
mv ~/hosts.bak ~/hosts.old
  • 主なオプション
    • -i:上書き確認
    • -f:強制上書き(確認なし)
    • -n:既存ファイルを上書きしない
      💡ポイント:
      同一ファイルシステム内ではリネームのみ実行し高速。別ファイルシステム間ではコピー&削除処理となるため注意が必要です。 (man7.org)

rm — ファイル/ディレクトリの削除

  • 実行ユーザー: 一般ユーザー(ディレクトリ削除はsudo要)
  • 結果: ファイルまたはディレクトリを消去。
rm ~/oldfile.txt
sudo rm -rf /var/www/html/oldsite
  • 主なオプション
    • -r:ディレクトリを再帰的に削除
    • -f:確認不要で強制削除
    • -i:実行前に都度確認
      💡ポイント:
      rm -rf コマンドは非常に危険であり、誤って重要なファイルやディレクトリを削除する可能性があります。使用する際は、対象のパスを十分に確認し、可能であればバックアップを取ることを推奨します。また、-i オプションを使用しても、誤操作を完全に防ぐことはできないため、慎重に操作してください。

touch — 空ファイル作成/タイムスタンプ更新

  • 実行ユーザー: 一般ユーザー
  • 結果: ファイルがない場合は空ファイル作成、ある場合はアクセス・更新時刻を現在時刻に設定。
touch ~/logrotate.marker

💡ポイント:
自動化スクリプトでのフラグファイルなどに使用します。

3.3.3 テキスト処理と検索

何を: ログ抽出、設定ファイルの一括加工、データ集計
なぜ: 大量のログや設定ファイルから必要情報を高速に抽出・変換し、自動化や解析に活用するため
どうやって: grepsedawkなどを組み合わせ、パイプで連携します。

grep — パターン検索

  • 実行ユーザー: 一般ユーザー
  • 結果: 指定パターンを含む行を抽出。
grep -R "ERROR" /var/log
  • 主なオプション
    • -r:ディレクトリ以下を再帰検索
    • -i:大文字小文字を区別しない
    • -n:行番号表示
    • -C NUM:前後NUM行をコンテキスト付き表示
      💡ポイント:
      SELinuxの監査ログ(例:/var/log/audit/audit.log)をgrep AVCで素早く問題箇所を特定できます。 (GNU, man7.org)

sed — ストリームエディタ

  • 実行ユーザー: 一般ユーザー
  • 結果: テキストの検索・置換、行削除などを一括で実行。
# foo を bar に置換し結果を標準出力
sed 's/foo/bar/g' input.txt

# ファイルを直接書き換え(バックアップ拡張子 .bak)
sed -i.bak 's/foo/bar/' config.yaml
  • 主な特徴
    • 一度のパス処理で高速
    • スクリプトファイル化して複数編集を管理
      💡ポイント:
      設定ファイルの一括更新などに便利。In-place編集(-i)時は必ずバックアップを取りましょう。 (GNU)

awk — パターン+アクション処理

  • 実行ユーザー: 一般ユーザー
  • 結果: フィールド(列)単位の抽出・集計、レポート生成など。
# /etc/passwd のユーザー名一覧を取得
awk -F: '{print $1}' /etc/passwd

# ログファイルから日付ごとのエラー数を集計
awk '/ERROR/ {count[$1]++} END {for (d in count) print d, count[d]}' /var/log/app.log
  • 主なオプション
    • -F sep:入力フィールド区切り文字指定
    • -v var=val:BEGIN前の変数設定
      💡ポイント:
      小規模なデータ処理ならPython不要。awk一行でCSVやログから瞬時に集計レポートを作成できます。 (GNU, man7.org)

3.4 権限と所有権

ファイルやディレクトリへのアクセス制御は、Linux運用の基礎かつセキュリティの要です。本節ではビットレベルから特殊権限、デフォルトマスク、さらにはSELinuxコンテキストまで、AlmaLinux 9で押さえておきたい「権限」と「所有権」を詳解します。

3.4.1 パーミッションの仕組み

ファイル/ディレクトリのアクセス制御は「所有者(user)」「グループ(group)」「その他(others)」の3つのレベルで管理され、各レベルに読み取り(r)、書き込み(w)、実行(x)の3ビットが割り当てられます。合計9ビットで表現され、ls -lで確認できます。

# 実行ユーザー: 一般ユーザー
ls -l example.txt
# 出力例:
# -rwxr--r--. 1 alice staff 4096 May  5 12:00 example.txt

💡ポイント:
ビットの配置を理解すると、数値モード(例:chmod 754)を直感的に扱えるようになります。

3.4.2 chmod の使い分け

パーミッション変更は主に chmod コマンドで行い、以下の2通りがあります。

  • シンボリック(Symbolic)モード
# 実行ユーザー: 一般ユーザー
chmod u=rw,g=r,o= example.txt
chmod g+w example.txt      # グループに書込権限を追加
chmod o-x example.txt      # その他から実行権限を削除
  • オクタル(Octal)モード
# 実行ユーザー: 一般ユーザー
chmod 640 example.txt      # 所有者 rw- (6), グループ r- (4), その他 --- (0)
chmod 755 /usr/local/bin   # 所有者 rwx, グループ rx, その他 rx

💡ポイント:
スクリプト化にはオクタル指定が一行で完結しやすく、シンボリック指定は柔軟な追加・削除に適しています。

3.4.3 chown と chgrp

所有者(ユーザー)やグループの変更は chownchgrp で行います。

# 実行ユーザー: root または sudo 権限ユーザー
chown bob:staff /var/www/html/index.html
# ユーザーを bob、グループを staff に同時変更

chown -R deploy:deploy /opt/app
# ディレクトリ配下を再帰的にすべてオーナー deploy、グループ deploy に変更

chgrp sysadmins server.log
# グループのみ変更

💡ポイント:
chownchgrp の機能も包含するため、両コマンドを覚えるより chown user:group を使うほうが効率的です。

3.4.4 特殊ビット(SUID、SGID、stickyビット)

通常の rwx ビット以外に、セットユーザID(SUID)、セットグループID(SGID)、および sticky ビットがあります。

ビット意味
SUID実行ファイルに設定すると、実行時に所有者権限で動作(例:/usr/bin/passwd
SGID– ファイル:実行時にファイルのグループ権限で動作- ディレクトリ:新規作成ファイルがディレクトリのグループ所有になる
stickyディレクトリに設定すると、ファイルの削除・名前変更は所有者のみ可能(例:/tmp
# 実行ユーザー: 一般ユーザー
chmod u+s /usr/bin/passwd       # SUID を追加
chmod g+s /srv/shared           # ディレクトリに SGID を追加
chmod +t /tmp                   # sticky ビットを設定

💡ポイント:
共有ディレクトリでの誤削除防止や、一部コマンドの権限昇格に不可欠なビットです。

3.4.5 umask(デフォルトパーミッションの設定)

新規作成ファイル/ディレクトリのデフォルト権限は、umask(ユーザマスク)により制御されます。

  • デフォルト:0022 → 新規ファイル rw-r--r--、ディレクトリ rwxr-xr-x
    一般的なデフォルト値は 0022 ですが、システムやユーザーの設定によって異なる場合があります。umask の現在の設定を確認するには、umask コマンドを実行してください。
  • umask 0077 → 新規ファイル rw-------、ディレクトリ rwx------
# 実行ユーザー: 一般ユーザー
umask                 # 現在の umask を表示
umask 0022            # デフォルトに設定
echo 'umask 0022' >> ~/.bashrc

💡ポイント:
セキュリティ厳重環境では umask 0077 のように強固に設定し、機密ファイルを他者から隠蔽しましょう。

3.4.6 SELinuxコンテキストの概要

AlmaLinux 9 では SELinux がデフォルトで有効化されており、パーミッションビットに加え「SELinuxコンテキスト(ユーザー、ロール、タイプ、レベル)」でもアクセス制御を行います。

  • コンテキスト表示:
# 実行ユーザー: 任意
ls -lZ /var/www/html/index.html
  • タイプを修正:
sudo chcon -t httpd_sys_content_t /var/www/html/index.html
sudo restorecon -v /var/www/html/index.html
  • 永続変更:
sudo semanage fcontext -a -t httpd_sys_content_t '/var/www/html(/.*)?'
sudo restorecon -R -v /var/www/html

(Red Hat Documentation, Red Hat Documentation)

💡ポイント:
パーミッションビットだけでなく、SELinuxのタイプも正しく設定・維持しないと「Permission denied」が発生します。

3.5 パイプとリダイレクト

AlmaLinux9では、標準入力(stdin)、標準出力(stdout)、標準エラー(stderr)の3つのストリームを駆使し、コマンド間でデータを受け渡したり、ログを取得したりすることができます。これにより一貫性のある自動化や詳細なログ分析、セキュリティ設定(SELinuxやファイアウォール設定)の検証が容易になります。 (Linux Documentation Project)

3.5.1 標準ストリームとリダイレクトの基本

Linuxのプロセスは、デフォルトで以下の3つのファイルディスクリプタを持っています。

  • 0:標準入力(stdin)
  • 1:標準出力(stdout)
  • 2:標準エラー(stderr)

これらを組み替えることで、コマンドの出力先や入力元を自由に制御できます。主なリダイレクト演算子は以下のとおりです。

  • > : stdout を上書き
  • >>: stdout を追記
  • 2>: stderr を上書き
  • 2>&1: stderr を stdout と同じ場所にリダイレクト
  • < : stdin をファイルから読み込み (GNU)

stdout の上書き例

  • 実行ユーザー: root または sudo 権限ユーザー
  • 結果: dnf update のログを /var/log/dnf_update.log に保存
sudo dnf update -y > /var/log/dnf_update.log

stderr の分離例

  • 実行ユーザー: 一般ユーザー
  • 結果: ls のエラーだけを error.log に保存
ls /nonexistent 2> error.log

💡ポイント:
システムトラブル時には stderr を分離することで、問題箇所を素早く把握できます。

3.5.2 パイプの基本

パイプ(|)は、あるコマンドの stdout を次のコマンドの stdin として接続します。複数のコマンドを連結することで、フィルタリングや集計などを一行で実行可能です。 (GNU)

# 実行ユーザー: 一般ユーザー
# 結果: /var/log/messages から ERROR を含む行を抽出し、最新10行を表示
grep "ERROR" /var/log/messages | tail -n 10
  • |& を使うと、stdout と stderr の両方を次コマンドに渡せます。
# 実行ユーザー: 一般ユーザー
# 結果: stdout と stderr の両方を grep に渡して検索
mycommand |& grep "Warning"

💡ポイント:
長いパイプチェーンは可読性低下の原因となるため、スクリプト化して管理すると保守性が向上します。

3.5.3 高度なリダイレクト:Hereドキュメントとヒアストリング

Hereドキュメント(<<

複数行の文字列をコマンドの stdin として渡せます。

# 実行ユーザー: 一般ユーザー
# 結果: mysql クライアントで複数行SQLを実行
mysql -u root -p <<EOF
USE mydb;
SELECT COUNT(*) FROM users;
EOF

ヒアストリング(<<<

短い文字列を stdin に渡す場合に便利です。

# 実行ユーザー: 一般ユーザー
# 結果: 文字列を wc コマンドで行数・単語数・文字数としてカウント
wc -w <<< "AlmaLinux9 is a RHEL clone."

💡ポイント:
自動化スクリプト内で小規模な入力データを渡したい場合、Hereドキュメントよりヒアストリングのほうがシンプルです。 (GNU, Linux Documentation Project)

3.5.4 プロセス置換

プロセス置換(<(...)>(...))を使うと、一時ファイルを介さずにデータを処理できます。

# 実行ユーザー: 一般ユーザー
# 結果: diff コマンドで2つのコマンド出力を比較
diff <(ls /etc) <(ls /usr/local/etc)
  • <(...) は出力をパイプとして提供
  • >(...) は入力をパイプとして提供

💡ポイント:
一時ファイルを作成しないため高速かつクリーン。複数ファイルを比較する際など、スクリプトで活躍します。 (GNU)

3.5.5 実践例:ログ管理とエラー分離

tee コマンドで表示と保存を同時に

  • 実行ユーザー: 一般ユーザー
  • 結果: コマンド出力を画面に表示しつつ output.log に追記
mycommand | tee -a output.log

💡ポイント:
デバッグ時には逐次ログを残しつつ、リアルタイムで画面確認できます。 (GeeksforGeeks)

stdout と stderr をまとめてログに残しつつ画面にも出力

  • 実行ユーザー: 一般ユーザー
  • 結果: stdout と stderr の両方を combined.log に追記し、同時に画面出力
mycommand 2>&1 | tee -a combined.log

💡ポイント:
エラー発生時の前後関係を含めて一つのログにまとめ、トラブルシュート性を高めます。 (Hostinger)

3.6 シェルヒストリーとエイリアス

AlmaLinux 9環境でのシェル操作を効率化するためには、過去のコマンドを活用するシェルヒストリーと、よく使うコマンドを短縮するエイリアスの使いこなしが不可欠です。

3.6.1 シェルヒストリーの活用

Bashでは、対話型シェルで入力したコマンドをメモリ(ヒストリーバッファ)に保持し、ログアウト時にデフォルトで ~/.bash_history に書き込まれます(環境変数 HISTFILE で変更可能) (GNU)。

# 実行ユーザー: 一般ユーザー
# 結果: 現在のヒストリーバッファ内容を番号付きで一覧表示
history
  • history N で直近 N 件のコマンドに絞り込み
  • !数字 で該当行のコマンドを再実行(例: !42
  • !! で直前のコマンドを再実行 (GNU)
# 実行ユーザー: 一般ユーザー
# 結果: 前回実行したコマンドを再実行
!!

環境変数による挙動調整

  • HISTSIZE:メモリ内ヒストリー件数(デフォルト1000)
  • HISTFILESIZE:ヒストリーファイル保存件数(デフォルト2000)
  • HISTTIMEFORMAT:履歴表示時のタイムスタンプ書式設定
# ~/.bashrc に追記例
export HISTSIZE=5000
export HISTFILESIZE=10000
export HISTTIMEFORMAT="%F %T "

💡ポイント:
適切なサイズ設定で過去の作業ログを長期保存し、トラブルシュート時の再現性を高めましょう (チェリーサーバー)。

3.6.2 エイリアスの定義と管理

エイリアスは、コマンドの第一語を別の文字列に置換する機能です。主に ~/.bashrc 上で定義し、シェル起動時に読み込ませます (GNU)。

# 実行ユーザー: 一般ユーザー
# 結果: 常用コマンドを短縮
alias ll='ls -lah --color=auto'
alias gs='git status'
  • alias:定義済みエイリアス一覧表示
  • unalias name:指定したエイリアスを削除
  • unalias -a:すべてのエイリアスを削除 (man7.org)
# 実行ユーザー: 一般ユーザー
# 結果: 全エイリアスをクリア
unalias -a

💡ポイント:
ファイル操作やパッケージ管理など反復頻度の高いコマンドには、デフォルトオプション付きのエイリアスを設定すると入力が大幅に短縮できます (Opensource.com)。

3.6.3 エイリアスの高度な活用

  • 引数付きエイリアス
    エイリアスは第一語のみ置換されるため、引数部分はユーザー入力に依存します。
alias mygrep='grep --color=auto -n'
# 実行例: mygrep TODO /var/log/messages
  • 一時的に無効化
    エイリアス定義時に意図せぬ展開が起きる場合、コマンドの前にバックスラッシュを付与すると防げます。
alias ls='ls --color=auto'
\ls /etc
  • シェル関数への移行検討
    複雑な置換や複数ステップが必要な場合は、シェル関数を使うと可読性・保守性が向上します。
mybackup() {
  cp -a "$1" "$1.$(date +%F).bak"
}

💡ポイント:
エイリアスを乱用せず、用途に応じてシェル関数と使い分けることで設定の可搬性とデバッグの容易さを両立できます。

3.7 環境変数と初期化ファイル

環境変数はシェルやアプリケーションの動作を制御し、初期化ファイルはログイン時やシェル起動時にこれらを自動設定します。AlmaLinux9では、適切に環境変数を管理し、初期化ファイルを使い分けることで、運用効率やセキュリティ設定を向上できます。

3.7.1 環境変数の基本

環境変数はキーと値のペアで、シェルやプロセスに渡される設定情報です。代表例として、以下があります。

  • PATH:実行ファイルを検索するディレクトリ一覧
  • LANGLC_*:ロケール(言語・文字コード)設定
  • http_proxyhttps_proxy:プロキシ経由アクセス時の設定
# 実行ユーザー: 一般ユーザー
# 結果: /home/user/bin を検索パスに追加し、プロキシを設定
export PATH=$PATH:/home/user/bin
export http_proxy="http://proxy.example.com:3128"

💡ポイント:
環境変数はシェル起動後にexportで即時反映できますが、永続化したい場合は初期化ファイルに記述しましょう。 (The world’s open source leader)

3.7.2 初期化ファイルの種類と読み込み順序

AlmaLinux9のBashでは、シェルの種類(ログイン/非ログイン、対話/非対話)に応じて以下のファイルを読み込みます。

シェル種別読み込まれるファイル用途
ログインシェル/etc/profile/etc/profile.d/*.sh~/.bash_profile~/.bash_login~/.profileログイン時の環境構築
対話型非ログインシェル/etc/bashrc~/.bashrcターミナルエミュレータ起動時
非対話型シェルBASH_ENV または明示的に --rcfile 指定スクリプト実行時
# 実行ユーザー: 一般ユーザー
# 確認: /etc/profile.d 以下の設定を含め、一連の設定が適用される
echo $PATH     # profile で設定された値を確認

💡ポイント:
~/.bash_profile内で必ず~/.bashrcを呼び出す(source ~/.bashrc)ことで、ログイン/非ログイン時の設定を一元管理できます。 (The world’s open source leader, Medium)

3.7.3 永続的な環境変数設定方法

  • ユーザー単位
    • ~/.bash_profile:ログイン時に一度だけ読み込む~/.bashrc :対話シェル毎に読み込む
# ~/.bash_profile に追記(実行ユーザー: 一般ユーザー)
# PATH とプロキシ設定を永続化
export PATH=$PATH:/opt/tools/bin
export https_proxy="http://proxy.example.com:3128"

# ~/.bashrc を読み込んでおく
if [ -f ~/.bashrc ]; then
  . ~/.bashrc
fi
  • システム全体
    • /etc/profile.d/custom.sh:任意のシェルスクリプトを配置/etc/profile および /etc/bashrc がそれを自動読み込み
# /etc/profile.d/99-custom-env.sh (実行ユーザー: root)
# LANG と umask を全ユーザー共通で設定
export LANG=ja_JP.UTF-8
umask 0022

💡ポイント:
システム全体の設定は/etc/profile.dにまとめ、ユーザー固有の調整はホームディレクトリのdotファイルに分けるのがベストプラクティスです。 (The world’s open source leader, LFCS認定準備 eBook)

3.7.4 初期化ファイルのベストプラクティス

  • 条件付き読み込み
    非対話型シェル実行中は不要なプロンプト設定や関数定義を省略します。
# ~/.bashrc (実行ユーザー: 一般ユーザー)
# 対話シェルかどうかを判定
if [[ $- == *i* ]]; then
  # インタラクティブ用設定(プロンプト、エイリアスなど)
  PS1='[\u@\h \W]\$ '
  alias ll='ls -lah --color=auto'
fi
  • ファイル権限の注意
    初期化ファイルは読み取り専用にし、不要な書き換えを防ぎます。
chmod 644 ~/.bash_profile ~/.bashrc
  • コメントとドキュメント
    変更理由や参照先ドキュメントをコメントに残し、メンテナンス性を高めます。

💡ポイント:
長く使う設定ほどコメントを丁寧に書き、チームメンバーや将来の自分に配慮しましょう。

3.8 シェルスクリプト入門

AlmaLinux9環境で繰り返しの運用作業や定期実行をスクリプト化することで、ヒューマンエラーを排除し、一貫性のある自動化基盤を構築できます。本節では、スクリプト作成の基礎からテスト/運用までを詳解します。

3.8.1 スクリプトの基本構造

スクリプトは以下の要素で構成されます。

  • シバン行(Shebang)
    スクリプトの最初に記述し、使用するシェルを指定します。
    • 意味: /usr/bin/env を経由して bash を呼び出すことで、環境PATH上のBashを自動検出します。
    • 効果: より移植性が高く、AlmaLinux9 以外のRHELクローン環境でも動作しやすいです (Wikipedia)。
#!/usr/bin/env bash
  • 実行権限の付与
    • 結果: スクリプトを直接 ./sample_script.sh で実行可能にします。
chmod +x sample_script.sh
  • コメント・ヘッダー
    スクリプトの目的、実行ユーザー、引数仕様、想定環境(例:SELinux有効化状態)を冒頭に明記すると、運用時の誤解を防げます。

💡ポイント:
「何が」「なぜ」作られたかをコメントで残すことで、チームメンバーや将来の自分がメンテナンスしやすくなります。

3.8.2 変数と引数の扱い

スクリプト内で固定値や外部入力を扱うために、変数と位置パラメータを正しく運用します。 (The world’s open source leader)

  • 変数定義
# 実行ユーザー: 一般ユーザー
# 結果: ログ保存先ディレクトリを指定
LOG_DIR="/var/log/myapp"
  • コマンドライン引数
    • $1, $2, …:位置パラメータ
    • $#:引数の個数
    • "$@":すべての引数を個別に展開
if [ $# -lt 1 ]; then
  echo "Usage: $0 <target-directory>"
  exit 1
fi
TARGET_DIR="$1"
  • 環境変数の参照
    外部から渡されたプロキシ設定やロケール情報を利用できます。
echo "HTTP_PROXY: ${HTTP_PROXY:-なし}"

💡ポイント:
引用符で囲む ("$VAR") ことで、スペースを含む値や空文字が意図せず分割されるのを防げます。

3.8.3 制御構造(条件分岐・ループ)

複雑な処理を記述する基本構造です。RHEL9の bash と互換性の高い文法を使います。 (Red Hat Documentation)

if 文

#!/usr/bin/env bash
# 実行ユーザー: root 以外の一般ユーザー
if [ -d "$TARGET_DIR" ]; then
  echo "ディレクトリ $TARGET_DIR が存在します"
else
  echo "ディレクトリ $TARGET_DIR が見つかりません"
  exit 1
fi

case 文

#!/usr/bin/env bash
# 実行ユーザー: 任意
case "$1" in
  start)    echo "サービスを起動します";   systemctl start myservice ;;
  stop)     echo "サービスを停止します";   systemctl stop myservice ;;
  restart)  echo "サービスを再起動します"; systemctl restart myservice ;;
  *)        echo "Usage: $0 {start|stop|restart}"; exit 2 ;;
esac

for/while ループ

#!/usr/bin/env bash
# 実行ユーザー: 任意
for file in /var/log/*.log; do
  echo "処理中: $file"
done

count=0
while [ $count -lt 5 ]; do
  echo "カウント: $count"
  count=$((count + 1))
done

3.8.4 関数定義とモジュール化

反復処理を関数化し、再利用性を高めます。

#!/usr/bin/env bash
# 実行ユーザー: 任意

log() {
  local level="$1"; shift
  echo "$(date '+%F %T') [$level] $*"
}

main() {
  log INFO "スクリプト開始"
  # 関数内で dnf を使った自動更新
  sudo dnf upgrade -y --refresh \
    && log INFO "パッケージ更新完了" \
    || log ERROR "パッケージ更新に失敗"
}
main "$@"

💡ポイント:
local を用いれば、関数内変数のスコープ汚染を防ぎ、他関数への影響を抑制できます。

3.8.5 デバッグとエラー処理

スクリプト品質を担保するために、以下のオプションや手法を組み合わせます。 (Super User)

  • set -e:コマンド失敗時に即終了
  • set -u:未定義変数参照時にエラー
  • set -o pipefail:パイプの途中で失敗した場合もステータス1を返す
  • trap:EXITやERRシグナルで後処理を実行
#!/usr/bin/env bash
set -euo pipefail
trap 'echo "異常終了しました"; exit 1' ERR

# デバッグモード
#!/usr/bin/env bash -x

💡ポイント:
CI環境では -euo pipefail を標準設定にし、想定外の動作を早期検知しましょう。

3.8.6 テストとバージョン管理

スクリプトの信頼性を高めるために、テストフレームワークGitによる管理が効果的です。 (Reddit)

  • Bats: Bash Automated Testing System
@test "ログディレクトリが作成される" {
  run bash sample_script.sh /tmp/testdir
  [ "$status" -eq 0 ]
  [ -d /tmp/testdir ]
}
  • Git: コードレビューや履歴管理で変更箇所を明確化

💡ポイント:
テストコードをCIに組み込むことで、AlmaLinux9へのアップデートや dnf バージョン変更時も自動検証が可能になります。

3.9 学習のまとめ

以下では、本章で学んだ各テーマを改めて振り返り、今後の実践に活かすポイントを詳しく解説します。

3.9.1 CLI操作の習慣化と自動化基盤の構築

AlmaLinux9ではGUIよりCLIが推奨される理由を学びました。日々の定型作業をコマンドで実行し、スクリプト化することでヒューマンエラーを排除するとともに、Ansibleやシステムロールと組み合わせた大規模展開にも対応できます。まずはよく使う dnf update --securitysystemctl status といったコマンドをシェルスクリプトにまとめ、cronやsystemdタイマーで定期実行する習慣をつけましょう。

3.9.2 ファイル/ディレクトリ操作とテキスト処理のマスター

pwdcdls といった基本操作に加え、cp -a で属性を保持したバックアップ、rm -rf の取り扱い注意点、grepsedawk を組み合わせたログ抽出/一括編集などを学びました。これらをパイプで連結することで、一行のワンライナーで深い解析や変換が可能です。まずは自分の環境でログファイルを抽出・加工するワンライナーを10本作成し、使い慣れることをおすすめします。

3.9.3 権限と所有権の徹底理解

ファイルシステムの「所有者」「グループ」「その他」各ビットと、SUID/SGID/sticky ビット、さらに umask の仕組みを細部まで押さえました。加えて、SELinux コンテキスト(ls -lZsemanagerestorecon)による追加制御も確認済みです。実運用では、Git 管理下の設定リポジトリに chmodsemanage fcontext のルールを記載し、チームでの権限変更を追跡すると安全性が向上します。

3.9.4 パイプとリダイレクトの応用

標準入出力と標準エラーを自在に組み替えるリダイレクト(>,2>,&>>)と、パイプ(|,|&)、Hereドキュメント/ヒアストリング、プロセス置換まで解説しました。mycommand 2>&1 | tee -a combined.log のようにエラーを含む全出力をリアルタイムでログ保存するテクニックは、トラブルシュートや自動テストログ取得に不可欠です。実際に各手法を使い分ける場面をシミュレートし、スクリプトに落とし込んでみましょう。

3.9.5 シェルヒストリーとエイリアスで日常作業を効率化

history コマンドで過去ログを再利用しつつ、HISTTIMEFORMATHISTSIZE を調整することで長期的な履歴管理が可能です。さらに、alias ll='ls -lah --color=auto' のように頻出コマンドを短縮することでタイプ量を削減できます。エイリアスとシェル関数を状況に応じて使い分け、unalias で整理しながらメンテナンス性を保ちましょう。

3.9.6 環境変数と初期化ファイルの管理

PATHLANGhttp_proxy などの環境変数を、~/.bash_profile~/.bashrc/etc/profile.d/*.sh に適切に配置することの重要性を解説しました。対話/ログインシェルごとの読み込み順序を理解し、source ~/.bashrc~/.bash_profile に組み込むベストプラクティスも習得済みです。実際に複数ユーザー環境を想定し、個人設定とシステム設定を切り分けて管理ファイルを作成してみましょう。

3.9.7 シェルスクリプトによる運用自動化の実践

スクリプトの基本構造(シバン、コメント、実行権限付与)から、変数・引数処理、set -euo pipefailtrap を使った堅牢化、Batsを用いたテスト例まで幅広く取り上げました。Gitでスクリプトをバージョン管理し、CIパイプラインで自動テストを走らせるワークフローを構築することで、AlmaLinux9環境の変更も安全に反映できます。

💡ポイント
各セクションで学んだ知識を一つのシェルスクリプトに統合し、日次ジョブログ収集や設定ファイルの整合性チェックを自動化することで、AlmaLinux9の運用効率と安定性が飛躍的に向上します。まずは小さなタスクからスクリプト化を始め、徐々に運用基盤を拡張していきましょう。