-- Views
April 16, 26
スライド概要
はじめまして、yukikoと申します。 DX推進のお力になれれば嬉しいです! 気軽にLinkedinなどでお声がけくださいね! ★スキル LPICレベル2取得者 AI、Python、Splunk、BIが得意領域です。
シェルのしくみ 皮=シェル アボカドで完全理解 〜 LPIC-1 Topic 101 / Linux基礎 〜 石黒友季子 / LPIC講師 果肉=カーネル ALJ Education Plus株式会社 シェルとは 層構造 種=ハードウェア bash/zsh パイプ スクリプト
アボカドの断面=Linuxの層構造 外皮(シェル) シェル (bash/zsh) ユーザーとカーネルをつなぐ「通訳者」。 キー ボー ドか らのコ マン ドを受 け取 り、 カーネルが理解できる言語に変換する。 bash・zsh・sh などの種類がある。 カーネル 果肉(カーネル) OSの核心部分。メモリ管理・プロセス管理・ HW デバ イス 制御 など全 てを 担う。 シェ ルか ら受 け取っ た命 令を実 行す る。 LinuxカーネルはGPL v2ライセンス。 種(ハードウェア) CPU・メモリ・ストレージ・NICなど 物理的なデバイスすべて。 カー ネル の指 示を受 けて 実際に 動作 する 。 シェルから直接触ることはできない。 皮の外(ユーザー) アボカドを食べる人=ユーザー。 ターミナルを開いてコマンドを打ち込む。 シェ ルを 通じ てだけ カー ネルと 対話 でき る。 直接カーネルに触れることはできない。 石黒友季子 / LPIC講師 / ALJ Education Plus株式会社 「面白きなき世を面白く」 1/11
シェルは「言語の通訳者」── 人間の言葉をカーネルに伝える シェルとは アナロジー:アボカドの皮は食べる人と果肉の「境界線」。シェルもユーザーとカーネルの境界線で「通訳」する。 ユーザー ls -la と入力 → シェル bash が解釈する → カーネル HW → システムコール発行 → ディスクを読む 結果 ファイル一覧 ← 結果がユーザーへ戻ってくる(シェルが表示する) コマンド解釈 環境の管理 スクリプト実行 ユーザーが入力した「ls」「cd」などを解釈 PATH・HOME などの環境変数を管理する。 複数のコマンドをファイルにまとめて実行で してカーネルへ渡す。スペルミスがあるとエ シェルを起動するたびに ~/.bashrc や きる。繰り返し作業の自動化に不可欠な機能 ラーを返す。 ~/.zshrc を読み込む。 。 石黒友季子 / LPIC講師 / ALJ Education Plus株式会社 「面白きなき世を面白く」 2/11
アボカドの品種違い ── 同じ「アボカド」でも味が違う シェルの種類 シェルの品種=bash・zsh・sh・fish など。どれもアボカド(シェル)だが、機能・使いやすさが違う。 bash sh Bourne Again Shell echo $SHELL • LPICの試験に最頻出 → Bourne Shell #!/bin/sh • 最も古いUnixシェル • ほぼ全Linuxディストリに標準搭載 • スクリプト互換性が最も高い zsh • 最小限の機能しかない LPIC受験者は必ずbashをマ スターすること • 補完機能・履歴機能あり • スクリプトの互換性の基準 • 実体はdash等のシェルの場合も多い fish Z Shell • macOSのデフォルトシェル echo $SHELL → • 強力な補完・プロンプトカスタマイズ • Oh My Zshが人気 軽量スクリプトや移植性重視 の場面で使う Friendly Interactive Shell • 初心者に優しい自動補完 /bin/zsh • Gitステータスを表示できる (スクリプト の1行目) /bin/bash fish (起動するだけ) • 構文ハイライトが標準搭載 開発者に人気。bashを覚え てから移行がベスト • インストール直後からカラフル • スクリプトはbash非互換 学習・日常使いに便利。試験 には使わない 石黒友季子 / LPIC講師 / ALJ Education Plus株式会社 「面白きなき世を面白く」 3/11
コマンド実行の流れ 1 ls -la を打ったとき アボカドの中で何が起きているか ユーザー ターミナルに「ls -la」と入力してEnterを押す キーボード入力がターミナルエミュレータを通じてシェルに届く ↓ 2 シェル(bash) コマンドを解析する(パース) 「ls」がコマンド・「-la」がオプションであることを判断。PATHからlsの実行ファイルを探す(/bin/ls) ↓ 3 カーネル(Linuxカーネル) システムコールを発行してファイル一覧を取得 シェルからexec()・getdents()などのシステムコールを受け取り、ファイルシステムからディレクトリ情報 を読み出す ↓ 4 ハードウェア(ストレージ) ディスクからデータを読み込む カーネルのデバイスドライバがHDDまたはSSDにアクセスし、inode・ディレクトリエントリを読む ↓ 5 シェル(bash) 結果をフォーマットしてターミナルに表示 カーネルから受け取ったデータを人間が読みやすい形式に整形してプロンプトとともに画面に出力する 石黒友季子 / LPIC講師 / ALJ Education Plus株式会社 「面白きなき世を面白く」 4/11
環境変数・PATH 環境変数はアボカドの「栄養素」── シェルが育つための土 台 PATHのしくみ 環境変数とは シェルが持つ「名前つきの値(変数)」。プロセスが起動するとき子 「ls」と打つと、シェルはPATHに書かれたディレクトリを左から順に探 プロセスに引き継がれる。 して「ls」の実行ファイルを見つける。 PATH HOME USER SHELL LANG PS1 /usr/bin:/bin:/usr/local/ bin PATHの探索順序: コマンドを探すディレクトリ一覧 /home/yukiko 1. /usr/local/bin ls なし 2. /usr/bin ls なし 3. /bin ls 発見! ホームディレクトリのパス yukiko 現在のログインユーザー名 /bin/bash 使用中のシェルのパス ja_JP.UTF-8 環境変数の操作コマンド ロケール・文字コード設定 \u@\h:\w\$ プロンプトの表示形式 printenv 環境変数を一覧表示 echo $PATH PATHの値を確認 export FOO=bar 環境変数を設定 unset FOO 環境変数を削除 env 現在の環境変数を表示 石黒友季子 / LPIC講師 / ALJ Education Plus株式会社 「面白きなき世を面白く」 5/11
パイプは「アボカドのタネをくり抜く道具」── 出力を次のコマンドに 渡す パイプ・リダイレクト パイプ(|)── 前のコマンドの出力を次のコマンドの入力にする ls -la ファイル一覧 | grep '.sh' .shだけ絞り込む | sort | 並び替える head -5 上5行だけ取り出す $ ls -la | grep '.sh' | sort | head -5 リダイレクト(> >>) > ls > files.txt >> echo hi >> log.txt < wc -l < files.txt 2> cmd 2> err.log 2>&1 コマンドの結果をファイルに書き込む(上書き) コマンドの結果を既存ファイルに追記する よく使うパイプ活用パターン ログからエラーを抽出 cat syslog | grep ERROR プロセス検索 ps aux | grep nginx ディレクトリのファイル数を数 える ls | wc -l ファイルの内容を標準入力として渡す エラーメッセージだけファイルに保存する cmd > all.log 2>&1 通常出力とエラー出力を同じファイルへ コマンドの出力をファイルへ dmesg > boot.log コマンド履歴から検索 history | grep systemctl ポート確認(LPIC頻出) netstat -an | grep :80 石黒友季子 / LPIC講師 / ALJ Education Plus株式会社 「面白きなき世を面白く」 6/11
シェルスクリプト
シェルスクリプトは「アボカドレシピ帳」── 手順を書いてお
いて自動実行
スクリプトの基本構造
必ず覚えるシェル構文
#!/bin/bash
シバン(1行目)
# 変数定義
#!/bin/bash
どのシェルで実行するか宣言
このスクリプトは研修環境をセットアップする
#
変数代入
USER_NAME="yukiko"
LOG_FILE="/var/log/setup.log"
変数参照
VAR=value(スペースNG)
=の前後にスペースを入れない
$VAR または ${VAR}
波括弧は式の中で使う
# 関数定義
log() {
if文
echo "$(date): $1" >> $LOG_FILE
}
for文
# メイン処理
log "セットアップ開始"
コマンド置換
if [ 条件 ]; then ... fi
条件の前後にスペース必要
for i in 1 2 3; do ... done
ファイル・リストの繰り返し
$(command)
コマンドの出力を変数に入れる
if [ -d "/ho me/$ USER_NAME" ]; then
echo "ユーザー $USER_NAME は存在します"
終了 コー ド
else
useradd $USER_NAME
log "ユーザー $USER_NAME を作成しました"
fi
実行権限
exit 0(成功)exit 1(失敗)
0=正常終了
chmod +x script.sh
実行前に必ず付与する
log "セットアップ完了"
exit 0
石黒友季子 / LPIC講師 / ALJ Education Plus株式会社 「面白きなき世を面白く」
7/11
LPIC頻出 シェルコマンド早見表 ファイル操作 テキスト処理 ls -la ファイル詳細一覧 cat file ファイル内容を表示 cd ~ ホームへ移動 less file スクロールして閲覧 pwd 現在のパス表示 head -n 10 file 先頭10行 cp -r src dst ディレクトリごとコピー tail -f log リアルタイム末尾表示 mv old new 移動・名前変更 grep 'error' log パターン検索 rm -rf dir 強制削除(注意!) awk '{print $1}' 列を取り出す find / -name '*.sh' ファイルを検索 sed 's/old/new/g' 文字列置換 システム管理 ネットワーク ps aux プロセス一覧 ping 8.8.8.8 疎通確認 kill -9 PID プロセス強制終了 ifconfig ネットワーク情報(旧) top リアルタイム監視 ip addr ネットワーク情報(新) df -h ディスク使用量 netstat -an 接続状態 free -h メモリ使用量 ss -tuln ソケット一覧 uname -a カーネル情報 wget URL ファイルダウンロード whoami 現在のユーザー curl -I URL HTTPヘッダ取得 石黒友季子 / LPIC講師 / ALJ Education Plus株式会社 「面白きなき世を面白く」 8/11
シェルのしくみ ── アボカド完全図解まとめ 01 02 シェル=ユーザーとカーネルをつなぐ通 訳者 コマンド解釈・環境管理・スクリプト実行の3役を 担う コマンド → シェル解析 → カーネル → HW → 結果表示 ls を打つだけで5ステップの処理が走っている ユーザー コマンドを打つ人 bash が LPIC 試験で最重要シェル 03 zsh・sh・fish の違いも理解しておく 04 パイプ(|)で複数コマンドをつないで 強力な処理に grep / sort / awk / sed を組み合わせる シェル(bash) 通訳・解釈・実行 05 カーネル OS の核心・管理者 シェルスクリプト=レシピ帳。自動化の 第一歩 #!/bin/bash・変数・if・for・exit 0 を覚える 石黒友季子 / LPIC講師 / ALJ Education Plus株式会社 「面白きなき世を面白く」 9/11
まとめ シェルはアボカドの皮。カーネルという果肉を守り、ユーザーに届ける。 シェル=通訳者 ユーザーのコマンドをカーネルが理解できる形に変換する。bash・zsh・sh など種類がある。 カーネル=管理者 メモリ・プロセス・デバイスをすべて管理する。シェルから渡された命令を実行する。 ハードウェア=実 CPU・メモリ・ストレージ。カーネルの指示で実際の処理を行う。シェルから直接は触れない。 行者 パイプ=連携ツー コマンドの出力を次の入力へ。ls | grep | sort などの組み合わせで強力な処理が可能。 ル スクリプト=レシ 手順をファイルに書いて自動実行。#!/bin/bash・変数・if・for・exit 0 が基本構文。 ピ帳 「面白きなき世を面白く」 石黒友季子 / LPIC講師 / ALJ Education Plus株式会社