本記事には広告(アフィリエイトリンク)が含まれます。

シェル環境カスタマイズ LinuC102 第1回

広告

新卒インフラエンジニア向けLinuC 102 試験対策シリーズがスタートします。前シリーズ(101)でサーバーへのログインからディスク管理までを扱いました。102 シリーズでは 運用・カスタマイズ・自動化・ネットワーク・セキュリティへと一段進みます。

第1回のテーマは シェル環境のカスタマイズ。環境変数の永続化、bash の起動ファイルの読み込み順、alias・history のチューニング、ロケールとタイムゾーンの設定 ── 「自分が毎日使うシェル」を整える基本動作を一度に押さえます。LinuC 101 第9回で扱った env/export/alias/history の基礎の上に、永続化運用設定を積み上げる回です。

環境前提

  • ディストリビューション: AlmaLinux 9.6(Sage Margay)
  • シェル: bash 5.1.8(既定 alias と HISTSIZE=1000 が /etc/profile で設定済み)
  • ユーザー: developer(sudo NOPASSWD設定済み)
  • 関連VM: linuc-alma(10.0.10.132)
  • NTP: linuc-proxy(10.0.10.131、stratum 3)から chrony で同期
  • ロケール初期値: ja_JP.UTF-8 / タイムゾーン: Asia/Tokyo
  • ~/.bashrc を編集する演習があります。必ず先にバックアップ(cp ~/.bashrc ~/.bashrc.bakを取ってから操作してください
広告

今ここマップ

LinuC 102 試験対策シリーズ(全12回)

▶ 第1回 シェル環境のカスタマイズ    ← いまここ
  第2回 Bashスクリプト入門
  第3回 ネットワーク基礎
  第4回 ネットワークトラブルシューティングとDNS
  第5回 ユーザ・グループ管理と sudo 設定
  第6回 ジョブスケジューリングと時刻管理
  第7回 ログ管理実践
  第8回 メール配送エージェント(MTA)の基本
  第9回 ファイアウォールと SELinux 入門
  第10回 暗号化によるデータ保護
  第11回 クラウドセキュリティの基礎
  第12回 オープンソースの文化

この記事で身につくこと

  1. シェル変数と環境変数の違いを説明し、set / env / printenv / export / unset を使い分けられる
  2. bash の起動ファイル(/etc/profile/etc/bashrc~/.bash_profile~/.bashrc)の読み込み順を説明できる
  3. alias / unalias / シェル関数を活用し、対話シェルの効率を上げられる
  4. HISTSIZE HISTCONTROL 等で history をカスタマイズできる
  5. locale / localectl / timedatectl でロケールとタイムゾーンを確認・設定できる

第1章:「シェルそのもの」を整える

毎日触るサーバーのシェル ── プロンプトの色、頻用コマンドの短縮、履歴の保持件数、エラーメッセージの言語、ログの時刻表示。これらは全て「シェルそのものの設定」です。LinuC 101 第9回で envalias の基本は扱いました。本記事では、「再ログインしても消えない」永続化と、運用環境としての整え方に踏み込みます。

誰のために整えるか

  • 毎日のあなた:ログインのたびに同じ環境が用意されているのが当然になる
  • 後任の引き継ぎ:あなたの ~/.bashrc を渡せばだいたい同じ操作感が再現できる
  • 自動化スクリプトLANG=C で英語ロケール固定、タイムゾーンは UTC 統一、など環境差異の予防
  • 監査・障害対応:時刻が NTP で正確、ログメッセージのロケールが揃っている、というインフラ品質

第2章:環境変数の復習と永続化

2.1 シェル変数と環境変数(101 第9回の復習)

linuc-almaで実行:

$ MY_VAR=local
$ export MY_GLOBAL=exported
$ bash -c 'echo "child: MY_VAR=[$MY_VAR] MY_GLOBAL=[$MY_GLOBAL]"'

実行結果:

child: MY_VAR=[] MY_GLOBAL=[exported]
シェル変数と環境変数が子プロセスに継承されるかを示した図。親シェルで定義した MY_VAR(export なしのシェル変数)と MY_GLOBAL(export ありの環境変数)のうち、子プロセス(bash -c で起動した bash)に継承されるのは export した MY_GLOBAL だけで、MY_VAR は継承されず子プロセスでは空になることを表している。export した環境変数はコピーされて子プロセスに引き継がれる。
図 01-02. シェル変数と環境変数の子プロセス継承

子プロセスから見えるのは export された方だけ。シェル変数は現セッション内だけ、環境変数は子プロセスにも継承。これが基礎。

2.2 確認・操作のコマンド

コマンド表示する内容
env環境変数のみ
setシェル変数すべて+シェル関数定義
echo $VAR / printenv VAR個別の値
export(引数なし)環境変数の一覧(declare -x 形式)
unset VAR変数を削除

linuc-almaで実行:

$ set | wc -l
$ env | wc -l

実行結果(環境ごとに前後します):

104
36

set は 104 件(シェル変数+関数)、env は 36 件(環境変数のみ)。差の 68 件はシェル変数とシェル関数です。

2.3 主要な環境変数

変数意味
PATH実行ファイルを探すディレクトリのリスト(コロン区切り)
HOME現ユーザーのホームディレクトリ
USER / LOGNAME現ユーザー名
SHELLログインシェルのパス(/etc/passwd 由来)
PS1プライマリプロンプトの定義
LANG / LC_*言語・ロケール
TERM端末種別
EDITOR / VISUAL既定エディタ(visudo 等が参照)

2.4 「今だけ」と「ずっと」── 永続化の基本

  • 今だけ(現セッションのみ)export VAR=value をシェルで打つ
  • ずっと(再ログインしても)~/.bashrc または ~/.bash_profile に書く
  • 全ユーザー共通/etc/profile または /etc/profile.d/*.sh に書く(要 root)

「どのファイルに書くべきか」は次章の起動ファイルの読み込み順を理解すると判断できます。

📖 試験Tipsボックス:環境変数とシェル変数

主題:1.06.1(重要度:中〜高)
出題パターン:「環境変数のみを表示するコマンドは?」「シェル変数を環境変数化するは?」「シェル変数全部を表示するは?」

暗記ポイント

  • VAR=value:シェル変数(子に伝わらない)
  • export VAR=value:環境変数(子に伝わる)/ 既存変数も export VAR で環境変数化
  • env:環境変数のみ / set:シェル変数全部+関数 / printenv VAR:個別
  • unset VAR:削除
  • 主要:PATH HOME USER SHELL PS1 LANG TERM EDITOR

第3章:bash の起動ファイル

3.1 ログインシェルと非ログインシェル

bash は起動の仕方によって読み込むファイルが変わります。区別の鍵は「ログインシェルかどうか」。

  • ログインシェル:SSH 接続直後、su -、コンソールログインなど。「ログイン処理を伴って起動した bash」
  • 非ログイン・インタラクティブシェル:すでにログインしているターミナルから新しく bash を打って起動した子シェル
  • 非インタラクティブシェル:シェルスクリプト実行時の bash

3.2 読み込み順の地図

【ログインシェル】(SSH 接続など)

  /etc/profile
       │
       ├─ /etc/profile.d/*.sh (色付け、言語設定など)
       │
       ▼
  ~/.bash_profile (無ければ ~/.bash_login → ~/.profile)
       │
       │(多くは中で)
       ▼
  ~/.bashrc を source する記述あり
       │
       │
       ▼
  /etc/bashrc (~/.bashrc が source)

【非ログイン・インタラクティブ】(端末から bash を新規起動)

  /etc/bashrc
       │
       ▼
  ~/.bashrc
bash の起動ファイルの読み込み順を示した図。左列はログインシェルの経路で、/etc/profile、/etc/profile.d/*.sh、~/.bash_profile、~/.bashrc、/etc/bashrc の順に読み込まれる。右列は非ログイン・対話シェルの経路で、/etc/bashrc から ~/.bashrc の順に読み込まれる。~/.bash_profile が内部で ~/.bashrc を source し、~/.bashrc がさらに /etc/bashrc を source するため、どちらの経路でも最終的に ~/.bashrc と /etc/bashrc が読み込まれることを示している。
図 01-01. bash 起動ファイルの読み込み順

AlmaLinux 9 既定の ~/.bash_profile は次のようになっています。linuc-almaで実行:

$ cat ~/.bash_profile

実行結果:

# .bash_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
        . ~/.bashrc
fi

# User specific environment and startup programs

~/.bash_profile から ~/.bashrc を source している点に注目。結果として、SSH ログイン時も非ログインシェル起動時も、~/.bashrc は両方とも読まれる。これは多くのディストリビューションの慣習です。

3.3 ファイルごとの役割

ファイル役割典型的な記述
~/.bash_profileログイン時に1回だけ実行PATH 永続追加、起動時のお知らせ
~/.bashrcシェル起動のたび毎回alias、関数、PS1、HISTSIZE などの対話設定
~/.bash_logoutログアウト時に1回履歴のクリア、画面消去など
/etc/profile全ユーザー共通のログイン時設定システムワイド PATH、共通環境変数
/etc/profile.d/*.sh/etc/profile から自動 sourceパッケージごとの初期化(vim、git 等)
/etc/bashrc全ユーザー共通の bashrc 相当システムワイド alias、関数

3.4 自分が今ログインシェルにいるか確認

echo $0 はシェルの名前を返しますが、ログインかどうかは判別しません。確実なのは shopt login_shell。linuc-almaで実行:

$ shopt login_shell

実行結果:

login_shell    off

SSH の接続直後でも、スクリプト実行のときの bash は非ログインで起動する場合があります。意外と複雑なので、「現在のシェルがログインかどうかは shopt login_shell で確認する」と覚えておきます。

3.5 編集後に再読み込み

~/.bashrc を編集しても、編集中のシェルには反映されません。再ログインするか、source(または短縮形 .)で再読み込みします:

$ source ~/.bashrc      # または
$ . ~/.bashrc

📖 試験Tipsボックス:bash 起動ファイル

主題:1.06.1(重要度:中〜高)
出題パターン:「ログインシェルが最初に読むファイルは?」「全ユーザー共通の bashrc は?」「~/.bash_profile~/.bashrc の違いは?」

暗記ポイント

  • ログインシェル:/etc/profile/etc/profile.d/*.sh~/.bash_profile(→ 多くは ~/.bashrc を source)
  • 非ログイン・インタラクティブ:/etc/bashrc~/.bashrc
  • ~/.bash_profile:ログイン1回だけ/ ~/.bashrc:シェル起動のたび
  • 全ユーザー共通:/etc/profile /etc/profile.d/ /etc/bashrc
  • 編集後は source ~/.bashrc または . ~/.bashrc で再読み込み
  • 判定:shopt login_shell

第4章:alias と関数

4.1 既定で定義されている alias

AlmaLinux 9 はログイン時に /etc/profile.d/colorls.sh 等から alias を自動定義します。linuc-almaで実行:

$ alias | head -8

実行結果:

alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias xzegrep='xzegrep --color=auto'
alias xzfgrep='xzfgrep --color=auto'

注目すべきは ll が既に定義されている点。LinuC 101 第9回では「自分で alias ll='ls -alF' する」と書きましたが、AlmaLinux 系では既定で ls -l --color=auto として定義されています。確認は type コマンド。

linuc-almaで実行:

$ type ls
$ type ll

実行結果:

ls は `ls --color=auto' のエイリアスです
ll は `ls -l --color=auto' のエイリアスです

4.2 自分の alias を永続化

新しい alias を ~/.bashrc に追記すれば、再ログイン後も生きます。

# ~/.bashrc に追記する例
alias ll='ls -alFh --color=auto'   # 上書きで属性多めに
alias g='git'
alias ..='cd ..'
alias ...='cd ../..'

追記後は source ~/.bashrc で即時反映。alias の上書きを一時的に避けたい場面では、コマンドの前にバックスラッシュを置いて \ls のように呼び出すと素のコマンドが実行されます。

4.3 alias で表現できないものは関数で

alias は単純な文字列置換なので、引数を取って加工する処理には向きません。引数を扱いたい場合はシェル関数を使います。

linuc-almaで実行:

$ myls() { ls -l "$@"; }
$ myls /etc | head -3

実行結果:

合計 1052
-rw-r--r--.  1 root root     4673  3月 12  2025 DIR_COLORS
-rw-r--r--.  1 root root     4755  3月 12  2025 DIR_COLORS.lightbgcolor

"$@" は「呼び出し時の全引数を、引用を維持しつつ展開」するイディオム。関数の中で使えば、myls /etc でも myls -a /etc でも引数が透過的に渡ります。

関数の永続化も ~/.bashrc への追記。削除は unset -f myls

第5章:history のカスタマイズ

5.1 既定値を確認

linuc-almaで実行:

$ echo "HISTSIZE=$HISTSIZE / HISTFILESIZE=$HISTFILESIZE / HISTCONTROL=$HISTCONTROL"
$ echo "HISTFILE=$HISTFILE / HISTTIMEFORMAT=$HISTTIMEFORMAT"

実行結果:

HISTSIZE=1000 / HISTFILESIZE= / HISTCONTROL=
HISTFILE=/home/developer/.bash_history / HISTTIMEFORMAT=

AlmaLinux 9 既定の状態:

  • HISTSIZE=1000:メモリ上の履歴件数(1000行)。/etc/profile で設定されている
  • HISTFILESIZE=:未設定(ファイル ~/.bash_history の件数上限は明示されていない)
  • HISTCONTROL=:未設定(重複や先頭スペース行の制御なし)
  • HISTTIMEFORMAT=:未設定(履歴にタイムスタンプ無し)

5.2 おすすめのチューニング

~/.bashrc に以下を追記すると、history が一気に使いやすくなります:

# ~/.bashrc に追記
HISTSIZE=10000                          # メモリ上の履歴件数を増やす
HISTFILESIZE=20000                      # ファイル上の履歴件数を増やす
HISTCONTROL=ignoredups:ignorespace      # 重複と先頭スペース行を除外
HISTTIMEFORMAT='%F %T '                 # 履歴にタイムスタンプ表示
shopt -s histappend                     # 上書きでなく追記(複数セッションで安全)
設定意味運用上の効果
HISTSIZE=10000履歴件数を増やす「先週何打ったっけ」が遡れる
HISTCONTROL=ignoredups連続する重複を除外同じコマンドを何度も打っても1件にまとまる
HISTCONTROL=ignorespace先頭がスペースの行を除外(スペース)mysql -p MyPassword のように打つと履歴に残らない
HISTTIMEFORMAT='%F %T '履歴にタイムスタンプ「いつそのコマンドを打ったか」が監査用に残る
shopt -s histappend追記モード複数セッションを並行で使っても履歴が消えない

5.3 機密情報を履歴に残さない

パスワードを引数に渡すコマンド(mysql -pcurl -u user:pass など)は、履歴に残ると後で漏洩リスクになります。HISTCONTROL=ignorespace を設定したうえで、コマンドの先頭に半角スペースを入れて打つと履歴に残りません:

$  mysql -uadmin -psecret  # 先頭スペースで履歴に残らない
$ history | tail -3        # 確認 → 上のコマンドは出ない

既に履歴に入ってしまったら history -d <番号> で個別削除、または history -c で全削除(履歴は空になります)。

📖 試験Tipsボックス:history のカスタマイズ

主題:1.06.1(重要度:中)
出題パターン:「履歴の重複を除外する設定は?」「履歴ファイルの場所は?」「先頭スペースの行を履歴から除外するには?」

暗記ポイント

  • HISTSIZE:メモリ上の履歴件数 / HISTFILESIZE:ファイル上の件数
  • HISTCONTROL=ignoredups 重複除外 / =ignorespace 先頭スペース行除外 / =ignoreboth 両方
  • HISTTIMEFORMAT='%F %T ' でタイムスタンプ
  • HISTFILE:履歴ファイルの場所(既定 ~/.bash_history
  • history -c 全消去 / history -d N 個別削除 / shopt -s histappend 複数セッション追記

第6章:locale ── ロケールと国際化

6.1 ロケールが決めるもの

ロケールは 「言語+地域+文字エンコーディング+数値・通貨・日付の書式」のセットです。ja_JP.UTF-8 なら「日本語・日本・UTF-8」。en_US.UTF-8 なら「英語・米国・UTF-8」。

linuc-almaで実行:

$ locale

実行結果:

LANG=ja_JP.UTF-8
LC_CTYPE="ja_JP.UTF-8"
LC_NUMERIC="ja_JP.UTF-8"
LC_TIME="ja_JP.UTF-8"
LC_COLLATE="ja_JP.UTF-8"
LC_MONETARY="ja_JP.UTF-8"
LC_MESSAGES="ja_JP.UTF-8"
LC_PAPER="ja_JP.UTF-8"
LC_NAME="ja_JP.UTF-8"
LC_ADDRESS="ja_JP.UTF-8"
LC_TELEPHONE="ja_JP.UTF-8"
LC_MEASUREMENT="ja_JP.UTF-8"
LC_IDENTIFICATION="ja_JP.UTF-8"
LC_ALL=
カテゴリ用途
LC_CTYPE文字種別(大小判定、エンコーディング)
LC_NUMERIC数値の桁区切り・小数点
LC_TIME日付・時刻の表示形式
LC_MESSAGESシステム・コマンドのメッセージ言語
LC_MONETARY通貨書式
LC_COLLATEソート順
LANG上記すべての既定値
LC_ALLすべてを上書きする最上位の指定

6.2 優先順位

LC_ALL > 個別の LC_* > LANG の順で優先されます。日常では LANG だけ設定すれば十分。LC_ALL はスクリプト内で「他の設定を上書きしてでも英語ロケールに固定したい」場合に使います。

6.3 利用可能なロケールの確認

linuc-almaで実行:

$ locale -a | grep -E '^(C|en_US|ja_JP|POSIX)' | head

実行結果:

C
C.utf8
POSIX
ja_JP.eucjp
ja_JP.utf8

C ロケールは「最小限の英語環境」。スクリプトで LANG=C を使うと出力を予測可能にできます。

6.4 ロケール切り替えで動作が変わる実例

linuc-almaで実行:

$ LANG=C ls /no-such-file 2>&1
$ LANG=ja_JP.UTF-8 ls /no-such-file 2>&1

実行結果:

ls: cannot access '/no-such-file': No such file or directory
ls: '/no-such-file' にアクセスできません: そのようなファイルやディレクトリはありません

同じコマンドでも、LANG=C なら英語、LANG=ja_JP.UTF-8 なら日本語のメッセージ。自動化スクリプトで grep するなら、メッセージが揺れない英語版(LANG=C 固定)が安全です。

6.5 システム全体のロケール

OS 全体のロケールは localectl で管理します。linuc-almaで実行:

$ localectl status

実行結果:

System Locale: LANG=ja_JP.UTF-8
    VC Keymap: jp
   X11 Layout: jp

変更したい場合(変更は本記事では実行せず説明のみ):

$ sudo localectl set-locale LANG=en_US.UTF-8       # 英語に
$ sudo localectl set-keymap us                     # キーマップ変更

📖 試験Tipsボックス:locale

主題:1.08.3(重要度:中)
出題パターン:「現在のロケールを表示するコマンドは?」「利用可能ロケール一覧は?」「LANGLC_ALL の優先順は?」

暗記ポイント

  • locale:現在の設定 / locale -a:利用可能ロケール一覧
  • 優先順位:LC_ALL > 個別 LC_* > LANG
  • LANG=C コマンド:英語ロケールでスクリプト実行
  • システム全体:localectl status 確認 / localectl set-locale LANG=... 変更
  • 主要カテゴリ:LC_CTYPE(文字)/ LC_TIME(日付)/ LC_MESSAGES(メッセージ)/ LC_NUMERIC(数値)

第7章:timedatectl ── 時刻とタイムゾーン

7.1 現状の確認

linuc-almaで実行:

$ timedatectl status

実行結果(時刻は実行時のもの):

               Local time: 日 2026-05-10 22:04:50 JST
           Universal time: 日 2026-05-10 13:04:50 UTC
                 RTC time: 日 2026-05-10 13:04:51
                Time zone: Asia/Tokyo (JST, +0900)
System clock synchronized: yes
              NTP service: active
          RTC in local TZ: no
  • Local time:タイムゾーンを反映した現地時刻(JST)
  • Universal time:UTC(協定世界時)
  • RTC time:ハードウェア時計(マザーボード上の電池でも動く時計)
  • Time zone:現タイムゾーン名と UTC からのオフセット
  • System clock synchronized:NTP との同期完了か
  • NTP service:NTP クライアント(chrony)が動作中か
  • RTC in local TZ:RTC を UTC で持つか現地時刻で持つか(Linux は UTC が標準、Windows と Dual Boot 時のみ true)

7.2 タイムゾーン管理

linuc-almaで実行:

$ timedatectl list-timezones | grep -E "Tokyo|UTC" | head

実行結果:

Asia/Tokyo
Etc/UTC
UTC

タイムゾーンを変更する場合(本記事では実行せず説明のみ):

$ sudo timedatectl set-timezone Asia/Tokyo
$ sudo timedatectl set-timezone UTC               # クラウドの定石
$ sudo timedatectl set-ntp true                   # NTP 有効化(chrony が動く)

7.3 chrony で NTP 同期状態を確認

本検証環境では、社内 NTP サーバー linuc-proxy から時刻同期しています。linuc-almaで実行:

$ chronyc tracking | head -6
$ chronyc sources

実行結果(一部抜粋):

Reference ID    : 0A000A83 (linuc-proxy.linuc.local)
Stratum         : 4
Ref time (UTC)  : Sun May 10 13:04:21 2026
System time     : 0.000000032 seconds slow of NTP time

MS Name/IP address         Stratum Poll Reach LastRx Last sample
===============================================================================
^* linuc-proxy.linuc.local       3   6   377    29  -4938ns[  +21us] +/-   71ms
  • Reference ID:同期している NTP サーバー(linuc-proxy)
  • Stratum:階層数。4 は「stratum 0(原子時計など)から4 段下」
  • System time:システム時刻と NTP との誤差(秒)
  • Last sample:直近の補正量と誤差範囲

^*」のマークは「現在同期中のサーバー」を示す。複数 NTP サーバーを設定していれば、Reach や RMS offset で品質を判断します。

第8章:現場での使いどころ

  • 運用環境のカスタマイズ~/.bashrc に PS1 / alias / 関数 / HISTCONTROL を集約。新規サーバーへの引き継ぎは scp ~/.bashrc 1発で済む
  • dotfiles を git 管理~/.bashrc ~/.bash_profile ~/.vimrc 等を git init でリポ化、複数サーバー間で同期
  • クラウドのタイムゾーン設計:本番は UTC 統一(ログ突合と海外メンバー協業のため)、踏み台や運用ツールサーバーは JST、のような使い分け
  • 自動化スクリプトの安定化:スクリプト先頭で export LC_ALL=C を書く。日本語メッセージで grep が引っかかる事故を予防
  • 機密情報の履歴除外~/.bashrcHISTCONTROL=ignoredups:ignorespace。パスワード入力時は先頭スペースで打つ
  • 監査用タイムスタンプHISTTIMEFORMAT='%F %T ' で「いつ何を打ったか」を残す。インシデント調査の基本
  • NTP の死活監視chronyc tracking をスクリプト化、System time が一定値を超えたらアラート

第9章:ヒヤリハット ── ~/.bashrc 構文ミスでログイン不能

⚠️ ~/.bashrc のクォート閉じ忘れで SSH ログインできない

新人M君は、本番運用サーバーのプロンプトをカラフルにしたくなり、~/.bashrcPS1 設定を追記しました。クォートを閉じ忘れたまま保存し、その日はそのまま退社。翌朝、別の作業で SSH 再接続したところ、ログイン直後にプロンプトが表示されず、シェルが起動エラーで切断。リモートでは復旧できず、Hyper-V コンソールから直接ログインして ~/.bashrc を修正する事態に。

教訓

  • ~/.bashrc 編集前に必ず バックアップcp ~/.bashrc ~/.bashrc.bak
  • 編集後、保存前に 構文チェックbash -n ~/.bashrc(エラー無しなら何も出ない)
  • 反映前に 別の SSH セッションを別タブで開いておく:現セッションが切れても予備で復旧可能
  • 致命的に壊れても bash --norc でログインすれば ~/.bashrc をスキップできる(緊急脱出)
  • SSH 接続不能になった場合、Hyper-V コンソール / クラウドのシリアルコンソールを確保しておく

類似事例~/.bash_profileexport PATH=... でタイポ → PATH が壊れて lsvi も呼べなくなる。復旧は /usr/bin/vi ~/.bash_profile のようにフルパス指定。あるいは PATH=/usr/bin:/usr/sbin と打って一時復旧。

やってみよう

linuc-alma にログインしている前提で、演習1〜4を順に実行してください。演習2の前に必ず ~/.bashrc のバックアップを取得します。

演習1:環境変数とシェル変数

  1. echo "$PATH" で PATH を確認
  2. env | head -10 で環境変数の頭10件
  3. set | wc -lenv | wc -l で件数差を比較
  4. MY_VAR=local
  5. export MY_GLOBAL=exported
  6. bash -c 'echo "child: MY_VAR=[$MY_VAR] MY_GLOBAL=[$MY_GLOBAL]"'
  7. 子プロセスから MY_VAR が空になっていることを確認
  8. unset MY_VAR MY_GLOBAL

演習2:bash 起動ファイルを観察

  1. cp ~/.bashrc ~/.bashrc.bak必ずバックアップ
  2. cat ~/.bash_profile で内容確認(~/.bashrc を source しているはず)
  3. head -20 ~/.bashrc で頭20行
  4. ls /etc/profile.d/ | head -10 でシステム profile.d
  5. shopt login_shell で現セッションがログインかどうか
  6. bash --login -c 'shopt login_shell' でログインで起動した場合の値を比較
  7. bash -n ~/.bashrc で構文チェック(何も出なければ OK)

演習3:alias と関数

  1. type ls type ll(既定 alias 確認)
  2. alias | head -8
  3. myls() { ls -l "$@"; }
  4. myls /etc | head -3
  5. type myls
  6. unset -f myls
  7. echo "HISTSIZE=$HISTSIZE / HISTCONTROL=$HISTCONTROL" で history の既定値

演習4:locale と timedatectl

  1. locale で現在の設定
  2. locale -a | grep -E '^(C|en_US|ja_JP|POSIX)' | head
  3. LANG=C ls /no-such 2>&1(英語メッセージ)
  4. LANG=ja_JP.UTF-8 ls /no-such 2>&1(日本語メッセージ)
  5. localectl status
  6. timedatectl status
  7. timedatectl list-timezones | grep Tokyo
  8. chronyc tracking | head -6
  9. chronyc sources
  10. クリーンアップ:必要なら mv ~/.bashrc.bak ~/.bashrc でバックアップから復元(編集していなければそのまま削除:rm ~/.bashrc.bak

分からないオプションは man bash(STARTUP FILES セクション)、man localeman timedatectlman chrony で調べてください。

理解度チェック

○か×で答えてください。回答と解説は次回冒頭で振り返ります。

  1. set コマンドは環境変数のみを表示し、シェル変数は表示しない。
  2. SSH でログインすると、最初に ~/.bashrc が読み込まれ、その後 ~/.bash_profile が読み込まれる。
  3. HISTCONTROL=ignorespace を設定すると、コマンドの先頭に半角スペースを置いて打った行は履歴に残らない。
  4. ロケール設定の優先順位は LC_ALL > 個別の LC_* > LANG である。
  5. timedatectl set-ntp true を実行すると、systemd が NTP サービス(AlmaLinux 9 では chrony)の自動起動を有効化する。

解答

  • 1. × set はシェル変数すべて+関数を表示。環境変数のみは env または printenv
  • 2. × ログインシェルでは ~/.bash_profile が先に読まれ、そこから ~/.bashrc が source される(多くのディストロの慣習)
  • 3.  ignorespace で先頭スペース行が履歴除外。パスワード入力時の定石
  • 4.  LC_ALL が最優先、次に個別 LC_*、最後に LANG
  • 5.  timedatectl set-ntp true で systemd-timesyncd または chrony が有効化される(AlmaLinux 9 は chrony)

次回予告

第2回は「Bashスクリプト入門:if / for / 関数で書く現場の自動化スクリプト」です。今回扱った環境変数・関数・bashrc の知識を土台に、シェルスクリプトを書く側に回ります。#!/bin/bash の意味、変数のクォーティング、条件分岐とループ、終了ステータスの扱いを実機で習得します。

LinuC 102 試験対策シリーズ 全12回

広告
Linux
スポンサーリンク