AlmaLinux 10 総合ガイド
第2章: Linuxの基本操作をマスターする
【なぜ重要か】 すべてのLinux操作の基礎となる最重要スキル
【前提知識】 第1章完了、ログイン可能な環境
【所要時間】 約3時間
第1章でAlmaLinux 10のVPS環境を構築し、SSH接続でログインできるようになりました。ここからが本格的なLinux学習の始まりです。
この章では、Linuxを操作するための基本的なコマンドを学びます。「コマンド」と聞くと難しそうに感じるかもしれませんが、実際には「決まった言葉を入力して、決まった動作をさせる」だけのことです。最初は覚えることが多く感じますが、日常的に使うコマンドは限られています。まずは頻繁に使うものから確実に身につけていきましょう。
2.1 シェルとコマンドの基礎
Linuxを操作する方法は大きく分けて2つあります。1つはGUI(グラフィカルユーザーインターフェース)で、マウスを使ってアイコンをクリックする操作です。もう1つがCUI(キャラクターユーザーインターフェース)で、キーボードから文字(コマンド)を入力して操作します。
サーバー管理では、CUIが圧倒的に多く使われます。理由は単純で、GUIよりも効率的で、リモートからでも軽快に操作できるからです。本ガイドでは、CUIでの操作を中心に学んでいきます。
2.1.1 シェル(bash)とは何か
ターミナル(端末)を開いてコマンドを入力すると、そのコマンドを解釈して実行してくれるプログラムがあります。これをシェル(shell)と呼びます。シェルは「殻」という意味で、OSの中核部分(カーネル)を包み込む殻のような役割を果たしています。
AlmaLinux 10では、デフォルトのシェルとしてbash(Bourne Again Shell)が採用されています。bashは最も広く使われているシェルで、多くのLinuxディストリビューションで標準となっています。
シェルの役割をもう少し具体的に説明すると、次のようになります:
- ユーザーがコマンドを入力する
- シェルがそのコマンドを解釈する
- シェルがカーネルに処理を依頼する
- カーネルが実際の処理を行う
- 結果がシェルを通じてユーザーに表示される
つまり、シェルはユーザーとOSの間の「通訳」のような存在です。
2.1.2 コマンドの基本構文(コマンド + オプション + 引数)
Linuxのコマンドには、基本的な構文パターンがあります:
コマンド [オプション] [引数]
それぞれの意味を説明します:
- コマンド:実行したい命令(動詞に相当)
- オプション:コマンドの動作を変更する指定(通常
-や--で始まる) - 引数:コマンドの対象となるもの(ファイル名やディレクトリ名など)
具体例で見てみましょう:
ls -l /home
この例では:
ls:ファイル一覧を表示するコマンド-l:詳細情報を表示するオプション/home:対象ディレクトリ(引数)
オプションや引数は省略できる場合が多く、省略した場合はデフォルトの動作になります。例えば ls だけ実行すると、現在のディレクトリのファイル一覧が簡易表示されます。
2.1.3 プロンプトの見方($と#の違い)
ターミナルを開くと、コマンドを入力する前に何か文字列が表示されています。これをプロンプトと呼びます。
[実行ユーザー: 一般ユーザー]
[developer@alma ~]$
このプロンプトには重要な情報が含まれています:
developer:現在のユーザー名alma:ホスト名(コンピュータの名前)~:現在のディレクトリ(~はホームディレクトリを表す)$:一般ユーザーであることを示す
特に重要なのが最後の記号です:
$:一般ユーザーでログインしている#:root(管理者)ユーザーでログインしている
root ユーザーはシステムに対して何でもできる強力な権限を持っています。プロンプトが # になっている場合は、操作に十分注意してください。
2.1.4 コマンドの実行とEnterキー
コマンドを入力したら、Enterキーを押して実行します。Enterを押すまでは、いくら入力してもコマンドは実行されません。
入力中に間違いに気づいた場合は、以下のキーで修正できます:
- Backspace:カーソルの左の文字を1文字削除
- Delete:カーソル位置の文字を削除
- Ctrl + U:行頭からカーソルまでをすべて削除
- Ctrl + C:入力をキャンセルして新しいプロンプトを表示
試しに簡単なコマンドを実行してみましょう:
[実行ユーザー: 一般ユーザー]
$ echo "Hello, AlmaLinux!"
Hello, AlmaLinux!
echo は、指定した文字列をそのまま画面に表示するコマンドです。プログラミングでいう「Hello World」のような、最初の一歩として最適なコマンドです。
2.1.5 コマンド履歴の活用(↑キー、historyコマンド)
過去に入力したコマンドを再度実行したい場合、一から入力し直す必要はありません。bashにはコマンド履歴機能があり、過去のコマンドを簡単に呼び出せます。
矢印キーでの履歴呼び出し
- ↑(上矢印):1つ前のコマンドを表示
- ↓(下矢印):1つ後のコマンドを表示
↑キーを繰り返し押すと、どんどん過去のコマンドに遡れます。目的のコマンドが表示されたらEnterで実行できます。
historyコマンドでの一覧表示
[実行ユーザー: 一般ユーザー]
$ history
1 echo "Hello, AlmaLinux!"
2 ls
3 pwd
4 cd /tmp
5 history
history コマンドは、過去に実行したコマンドの一覧を番号付きで表示します。表示される履歴の数はデフォルトで1000件程度ですが、設定で変更できます。
履歴番号を使って特定のコマンドを再実行することもできます:
[実行ユーザー: 一般ユーザー]
$ !3
pwd
/home/developer
!番号 の形式で、その番号のコマンドを再実行できます。また、!! で直前のコマンドを再実行できます。
2.1.6 タブ補完で入力を効率化
Linuxを使う上で、タブ補完は最も時間を節約できる機能の1つです。コマンドやファイル名を途中まで入力してTabキーを押すと、残りを自動的に補完してくれます。
例えば、/etc/hostname というファイルを指定したい場合:
[実行ユーザー: 一般ユーザー]
$ cat /etc/hostn[Tab]
$ cat /etc/hostname # 自動的に補完される
候補が複数ある場合は、Tabを2回押すと候補の一覧が表示されます:
[実行ユーザー: 一般ユーザー]
$ cat /etc/host[Tab][Tab]
host.conf hostname hosts hosts.allow hosts.deny
タブ補完を使うメリットは、入力の手間を省くだけではありません。入力ミスを防ぐという重要な効果があります。存在しないファイル名は補完されないため、タブ補完が効かない場合は「何か間違っている」というサインになります。
💡 Tips: タブ補完を積極的に使おう
Linux初学者の中には、すべてを手入力しようとする人がいます。しかし、熟練したエンジニアほどタブ補完を多用します。入力ミスによるトラブルを防ぎ、作業効率を大幅に向上させるため、最初から「タブを押す癖」をつけることをおすすめします。
2.2 ヘルプとマニュアルの使い方
Linuxには膨大な数のコマンドがあり、それぞれに多数のオプションが存在します。これらをすべて暗記する必要はありません。重要なのは、調べ方を知っていることです。
2.2.1 –helpオプションの使い方
ほとんどのコマンドは --help オプションをサポートしています。これを付けて実行すると、そのコマンドの簡単な使い方が表示されます。
[実行ユーザー: 一般ユーザー]
$ ls --help
Usage: ls [OPTION]... [FILE]...
List information about the FILEs (the current directory by default).
Sort entries alphabetically if none of -cftuvSUX nor --sort is specified.
Mandatory arguments to long options are mandatory for short options too.
-a, --all do not ignore entries starting with .
-A, --almost-all do not list implied . and ..
--author with -l, print the author of each file
-b, --escape print C-style escapes for nongraphic characters
...(省略)...
--help の出力は通常1画面に収まらないほど長いです。出力が流れてしまう場合は、後で学ぶ less コマンドと組み合わせると便利です:
[実行ユーザー: 一般ユーザー]
$ ls --help | less
2.2.2 manコマンドでマニュアルを読む
--help よりも詳しい情報が必要な場合は、man(マニュアル)コマンドを使います。
[実行ユーザー: 一般ユーザー]
$ man ls
このコマンドを実行すると、ls コマンドの完全なマニュアルページが表示されます。
LS(1) User Commands LS(1)
NAME
ls - list directory contents
SYNOPSIS
ls [OPTION]... [FILE]...
DESCRIPTION
List information about the FILEs (the current directory by default).
Sort entries alphabetically if none of -cftuvSUX nor --sort is speci‐
fied.
...
manページは英語ですが、コマンドの正確な動作を知りたい場合の最も信頼できる情報源です。
2.2.3 manページの操作方法(検索、ページ送り)
manページは less というページャ(ページ表示プログラム)で表示されます。以下の操作で閲覧できます:
| キー | 動作 |
|---|---|
| スペース / f | 次のページへ進む |
| b | 前のページへ戻る |
| ↓ / j | 1行下へスクロール |
| ↑ / k | 1行上へスクロール |
| /文字列 | 文字列を前方検索 |
| n | 次の検索結果へ |
| N | 前の検索結果へ |
| q | 終了 |
例えば、ls のマニュアルで「recursive」という単語を探す場合:
man lsを実行/recursiveと入力してEnternで次の出現箇所へ移動qで終了
2.2.4 セクション番号の意味(man 1, man 5等)
manページは複数のセクションに分類されています。同じ名前でも、セクションによって内容が異なります。
| セクション | 内容 | 例 |
|---|---|---|
| 1 | ユーザーコマンド | ls, cp, cat |
| 2 | システムコール | open, read, write |
| 3 | ライブラリ関数 | printf, malloc |
| 4 | デバイスファイル | /dev/null |
| 5 | 設定ファイルの形式 | passwd, fstab |
| 6 | ゲーム | (現在はほぼ使用されない) |
| 7 | その他 | man, groff |
| 8 | システム管理コマンド | mount, systemctl |
例えば passwd という名前は、コマンド(セクション1)と設定ファイル(セクション5)の両方に存在します:
[実行ユーザー: 一般ユーザー]
$ man 1 passwd # passwdコマンドのマニュアル
$ man 5 passwd # /etc/passwdファイル形式のマニュアル
セクション番号を省略した場合、番号の小さいセクションが優先して表示されます。
2.2.5 infoコマンドの紹介
info コマンドは、manよりも詳細でハイパーリンク形式のドキュメントを表示します。GNUプロジェクトのツールで特に充実しています。
[実行ユーザー: 一般ユーザー]
$ info coreutils
infoは操作方法がmanと異なり、学習コストがやや高いため、最初はmanを中心に使うことをおすすめします。より詳しい情報が必要になったときに、infoを参照するとよいでしょう。
2.3 ファイルとディレクトリの操作
Linuxでは、すべてがファイルとして扱われます。テキストファイルはもちろん、設定ファイル、デバイス、プロセス情報に至るまで、「ファイル」という統一された方法でアクセスできます。この考え方を理解することが、Linux習得の第一歩です。
2.3.1 ディレクトリ構造の理解(ルート/からの階層)
Windowsでは、ドライブごとに C:\、D:\ のように分かれていますが、Linuxは単一のルートディレクトリ / から始まる階層構造になっています。
主要なディレクトリの役割を理解しておきましょう:
| ディレクトリ | 役割 |
|---|---|
| / | ルートディレクトリ(すべての起点) |
| /home | 一般ユーザーのホームディレクトリが配置される |
| /root | rootユーザーのホームディレクトリ |
| /etc | システムの設定ファイル |
| /var | ログファイルなど、変動するデータ |
| /tmp | 一時ファイル(再起動時に削除されることがある) |
| /usr | ユーザー向けプログラムやライブラリ |
| /bin, /sbin | 基本的なコマンド(現在は/usr/bin, /usr/sbinへのシンボリックリンク) |
| /dev | デバイスファイル |
| /proc | プロセス情報(仮想ファイルシステム) |
この構造はFHS(Filesystem Hierarchy Standard)という標準に基づいています。どのLinuxディストリビューションでもほぼ同じ構造なので、一度覚えれば他のディストリビューションでも応用できます。
2.3.2 pwdで現在位置を確認
pwd(print working directory)は、現在いるディレクトリ(カレントディレクトリ)の絶対パスを表示します。
[実行ユーザー: 一般ユーザー]
$ pwd
/home/developer
「今自分がどこにいるのか」を確認することは、Linux操作の基本中の基本です。迷ったらまず pwd を実行しましょう。
2.3.3 lsでファイル一覧を表示(-l, -a, -hオプション)
ls(list)は、ディレクトリ内のファイルやディレクトリを一覧表示するコマンドです。最も頻繁に使うコマンドの1つです。
基本的な使い方
[実行ユーザー: 一般ユーザー]
$ ls
Desktop Documents Downloads Pictures
-l オプション:詳細表示
[実行ユーザー: 一般ユーザー]
$ ls -l
total 16
drwxr-xr-x. 2 developer developer 4096 Jan 15 10:30 Desktop
drwxr-xr-x. 2 developer developer 4096 Jan 15 10:30 Documents
drwxr-xr-x. 2 developer developer 4096 Jan 15 10:30 Downloads
drwxr-xr-x. 2 developer developer 4096 Jan 15 10:30 Pictures
出力の各列の意味:
drwxr-xr-x.:ファイルタイプとパーミッション(後述)2:ハードリンク数developer:所有者developer:所有グループ4096:ファイルサイズ(バイト)Jan 15 10:30:最終更新日時Desktop:ファイル/ディレクトリ名
-a オプション:隠しファイルも表示
Linuxでは、ドット(.)で始まるファイルは「隠しファイル」として扱われ、通常の ls では表示されません。
[実行ユーザー: 一般ユーザー]
$ ls -a
. .. .bash_history .bash_logout .bash_profile .bashrc Desktop Documents Downloads Pictures
. は現在のディレクトリ、.. は1つ上のディレクトリを表す特殊なエントリです。
-h オプション:人間が読みやすい形式
-l と組み合わせて使い、ファイルサイズをKB、MB、GB単位で表示します。
[実行ユーザー: 一般ユーザー]
$ ls -lh /var/log
total 2.1M
-rw-r--r--. 1 root root 15K Jan 15 10:30 boot.log
-rw-------. 1 root root 1.2M Jan 15 11:00 messages
-rw-------. 1 root root 856K Jan 15 11:00 secure
オプションの組み合わせ
オプションは組み合わせて使えます。ls -la や ls -lah は非常によく使う組み合わせです。
[実行ユーザー: 一般ユーザー]
$ ls -lah
total 32K
drwx------. 4 developer developer 4.0K Jan 15 10:30 .
drwxr-xr-x. 3 root root 4.0K Jan 15 09:00 ..
-rw-------. 1 developer developer 123 Jan 15 10:30 .bash_history
-rw-r--r--. 1 developer developer 18 Jan 15 09:00 .bash_logout
-rw-r--r--. 1 developer developer 141 Jan 15 09:00 .bash_profile
-rw-r--r--. 1 developer developer 492 Jan 15 09:00 .bashrc
drwxr-xr-x. 2 developer developer 4.0K Jan 15 10:30 Desktop
...
2.3.4 cdでディレクトリを移動(絶対パスと相対パス)
cd(change directory)は、カレントディレクトリを変更するコマンドです。
絶対パスと相対パス
パス(ファイルやディレクトリの場所)の指定方法には2種類あります:
- 絶対パス:ルート(/)から始まる完全なパス(例:
/home/developer/Documents) - 相対パス:現在のディレクトリを基準としたパス(例:
Documentsや../developer)
相対パスでは以下の特殊な表記を使います:
.:現在のディレクトリ..:1つ上のディレクトリ~:ホームディレクトリ
具体的な使用例
[実行ユーザー: 一般ユーザー]
# 絶対パスでの移動
$ cd /var/log
$ pwd
/var/log
# 相対パスでの移動(1つ上へ)
$ cd ..
$ pwd
/var
# ホームディレクトリに戻る(3つの方法)
$ cd ~
$ cd
$ cd $HOME
# 直前のディレクトリに戻る
$ cd -
/var
cd を引数なしで実行すると、どこにいてもホームディレクトリに戻ります。これは非常に便利な機能です。
2.3.5 mkdirでディレクトリを作成
mkdir(make directory)は、新しいディレクトリを作成します。
[実行ユーザー: 一般ユーザー]
$ mkdir myproject
$ ls -l
drwxr-xr-x. 2 developer developer 4096 Jan 15 11:00 myproject
-p オプション:親ディレクトリも同時に作成
深い階層のディレクトリを一度に作成したい場合は -p オプションを使います。
[実行ユーザー: 一般ユーザー]
$ mkdir -p projects/2025/january
$ ls -R projects
projects:
2025
projects/2025:
january
projects/2025/january:
-p がない場合、親ディレクトリが存在しないとエラーになります。
2.3.6 touchで空ファイルを作成
touch は、本来はファイルのタイムスタンプを更新するコマンドですが、指定したファイルが存在しない場合は空のファイルを作成します。この用途でよく使われます。
[実行ユーザー: 一般ユーザー]
$ touch newfile.txt
$ ls -l newfile.txt
-rw-r--r--. 1 developer developer 0 Jan 15 11:05 newfile.txt
ファイルサイズが0(空ファイル)であることがわかります。
2.3.7 cpでコピー(-r, -pオプション)
cp(copy)は、ファイルやディレクトリをコピーします。
基本的な使い方
[実行ユーザー: 一般ユーザー]
# ファイルのコピー
$ cp original.txt copy.txt
$ ls
copy.txt original.txt
# 別のディレクトリにコピー
$ cp original.txt /tmp/
$ ls /tmp/original.txt
/tmp/original.txt
-r オプション:ディレクトリを再帰的にコピー
ディレクトリをコピーする場合は -r(recursive)オプションが必要です。
[実行ユーザー: 一般ユーザー]
$ cp -r myproject myproject_backup
$ ls
myproject myproject_backup
-p オプション:属性を保持
-p オプションを付けると、所有者、パーミッション、タイムスタンプをそのまま保持してコピーします。
[実行ユーザー: 一般ユーザー]
$ cp -p important.txt important_backup.txt
バックアップを取る際には -rp を組み合わせて使うことが多いです。
2.3.8 mvで移動・名前変更
mv(move)は、ファイルやディレクトリを移動または名前変更します。
[実行ユーザー: 一般ユーザー]
# ファイル名の変更
$ mv oldname.txt newname.txt
# ファイルの移動
$ mv newname.txt /tmp/
# ディレクトリの移動(-rは不要)
$ mv myproject /tmp/
cp と違い、mv はディレクトリを移動する際に -r オプションは不要です。
2.3.9 rmで削除(-r, -fオプションの危険性)
rm(remove)は、ファイルやディレクトリを削除します。
⚠️ 重要な警告
Linuxには「ゴミ箱」の概念がありません。rm で削除したファイルは、基本的に復元できません。削除前に必ず確認しましょう。
基本的な使い方
[実行ユーザー: 一般ユーザー]
$ rm unwanted.txt
-r オプション:ディレクトリを再帰的に削除
[実行ユーザー: 一般ユーザー]
$ rm -r old_directory
-f オプション:確認なしで強制削除
[実行ユーザー: 一般ユーザー]
$ rm -f file.txt
🔥 絶対に実行してはいけないコマンド
# 以下のコマンドは絶対に実行しないでください
$ rm -rf / # システム全体を削除
$ rm -rf /* # ルート直下のすべてを削除
$ rm -rf ~ # ホームディレクトリを削除
特に rm -rf / は、システムを完全に破壊します。最近のLinuxでは保護機能がありますが、--no-preserve-root オプションをつけると保護が無効になります。絶対に試さないでください。
安全に削除するための習慣
- 削除前に
lsで対象を確認する rm -iで確認プロンプトを表示させる- 本番環境では特に慎重に操作する
[実行ユーザー: 一般ユーザー]
$ rm -i important.txt
rm: remove regular file 'important.txt'? y
2.3.10 ワイルドカード(*, ?)の使い方
ワイルドカードは、複数のファイルを一度に指定するための特殊な文字です。
| 記号 | 意味 | 例 |
|---|---|---|
| * | 0文字以上の任意の文字列 | *.txt → すべての.txtファイル |
| ? | 任意の1文字 | file?.txt → file1.txt, fileA.txt など |
| […] | 括弧内のいずれか1文字 | file[123].txt → file1.txt, file2.txt, file3.txt |
[実行ユーザー: 一般ユーザー]
# .txtで終わるファイルをすべて表示
$ ls *.txt
file1.txt file2.txt notes.txt
# 「log」を含むファイルをすべてコピー
$ cp *log* /tmp/
# file1.txt から file9.txt までを削除
$ rm file[1-9].txt
ワイルドカードを使うと、多数のファイルを効率的に操作できます。ただし、rm と組み合わせる場合は、事前に ls で対象を確認することを強くおすすめします。
[実行ユーザー: 一般ユーザー]
# 削除前に確認
$ ls *.log
access.log error.log debug.log
# 確認してから削除
$ rm *.log
2.4 テキストファイルの表示
Linuxでは、設定ファイルやログファイルなど、テキストファイルを扱う機会が非常に多いです。ファイルの内容を確認するためのコマンドをいくつか覚えておきましょう。
2.4.1 catでファイル全体を表示
cat(concatenate)は、ファイルの内容を標準出力(画面)に表示します。
[実行ユーザー: 一般ユーザー]
$ cat /etc/hostname
alma
複数のファイルを指定すると、連結して表示します(これが本来の用途です):
[実行ユーザー: 一般ユーザー]
$ cat file1.txt file2.txt
(file1.txtの内容)
(file2.txtの内容)
cat はファイル全体を一度に表示するため、長いファイルには向きません。数十行程度の短いファイルを確認する際に使います。
2.4.2 lessでページ単位で表示(操作方法)
less は、長いファイルをページ単位で表示するためのページャです。manコマンドと同じ操作方法で閲覧できます。
[実行ユーザー: 一般ユーザー]
$ less /var/log/messages
主要な操作キー:
| キー | 動作 |
|---|---|
| スペース / f | 次のページ |
| b | 前のページ |
| g | ファイルの先頭へ |
| G | ファイルの末尾へ |
| /文字列 | 前方検索 |
| ?文字列 | 後方検索 |
| n | 次の検索結果 |
| N | 前の検索結果 |
| q | 終了 |
less は「Less is more」(less はmore より優れている)という意味を込めて名付けられました。古い more コマンドより高機能で、後方スクロールや検索機能を備えています。
2.4.3 headで先頭部分を表示
head は、ファイルの先頭部分だけを表示します。デフォルトでは最初の10行が表示されます。
[実行ユーザー: 一般ユーザー]
$ head /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
-n オプションで表示行数を指定できます:
[実行ユーザー: 一般ユーザー]
$ head -n 3 /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
2.4.4 tailで末尾部分を表示(-fオプションでリアルタイム表示)
tail は、ファイルの末尾部分を表示します。デフォルトでは最後の10行が表示されます。
[実行ユーザー: 一般ユーザー]
$ tail /var/log/messages
Jan 15 10:30:01 alma systemd[1]: Started Session 1 of user developer.
Jan 15 10:30:05 alma sshd[1234]: Accepted password for developer
...(最後の10行)...
-f オプション:リアルタイム監視
-f(follow)オプションは、ログファイルの監視に非常に便利です。ファイルに新しい内容が追記されると、リアルタイムで画面に表示されます。
[実行ユーザー: 一般ユーザー]
$ tail -f /var/log/messages
(新しいログが追記されるたびに表示される)
(Ctrl+C で終了)
サーバーのトラブルシューティングでは、tail -f でログを監視しながら別のターミナルで操作を行い、エラーメッセージをリアルタイムで確認することがよくあります。
2.4.5 実践例: ログファイルの確認
ここまで学んだコマンドを組み合わせて、実際のログファイルを確認してみましょう。
[実行ユーザー: 一般ユーザー(sudo使用)]
# ログファイルの場所を確認
$ ls -lh /var/log/
total 2.1M
-rw-r--r--. 1 root root 15K Jan 15 10:30 boot.log
-rw-------. 1 root root 1.2M Jan 15 11:00 messages
-rw-------. 1 root root 856K Jan 15 11:00 secure
...
# セキュリティログの最新10行を確認(root権限が必要)
$ sudo tail /var/log/secure
Jan 15 10:30:05 alma sshd[1234]: Accepted password for developer from 192.168.1.100 port 52345 ssh2
Jan 15 10:30:05 alma sshd[1234]: pam_unix(sshd:session): session opened for user developer
...
# ログをページャで確認
$ sudo less /var/log/messages
2.5 テキストエディタの基本
Linuxでは、設定ファイルを編集する機会が頻繁にあります。そのため、テキストエディタの操作は必須スキルです。
2.5.1 なぜエディタが必要か
サーバー管理では、以下のような場面でテキストエディタを使います:
- 設定ファイルの編集(/etc/配下のファイル)
- シェルスクリプトの作成
- ログファイルの確認・編集
- ドキュメントの作成
GUIのエディタもありますが、サーバーは通常GUIがインストールされていないため、コマンドラインで動作するエディタを使えることが重要です。
2.5.2 nanoエディタ(初心者向け)
nano は、初心者に最も優しいコマンドラインエディタです。画面下部に操作方法が表示されるため、直感的に使えます。
起動と終了
[実行ユーザー: 一般ユーザー]
# 新規ファイルを作成
$ nano newfile.txt
# 既存ファイルを編集
$ nano existing.txt
起動すると以下のような画面が表示されます:
GNU nano 5.x newfile.txt
(ここに内容を入力)
^G Get Help ^O Write Out ^W Where Is ^K Cut Text ^J Justify
^X Exit ^R Read File ^\ Replace ^U Paste Text ^T To Spell
画面下部の ^ は Ctrl キーを意味します。例えば ^X は Ctrl+X です。
編集と保存
- 通常のテキスト入力で編集
- Ctrl+O:保存(ファイル名を確認してEnter)
- Ctrl+X:終了(未保存の場合は保存するか確認される)
カット&ペースト
- Ctrl+K:現在の行をカット
- Ctrl+U:カットした内容をペースト
- Ctrl+W:文字列検索
nanoは操作が簡単で、初学者にはおすすめです。ただし、本番環境のサーバーにnanoがインストールされていないこともあるため、次に説明するviの最低限の操作も覚えておくべきです。
2.5.3 vi/vimエディタ(最低限の使い方)
vi(または拡張版のvim)は、UNIX系OSに必ず存在するエディタです。AlmaLinux 10のMinimalインストールでは、vim-minimalパッケージが含まれており、viコマンドで最小限のvimが起動します。
モードの概念(コマンドモード、挿入モード)
viの最大の特徴は「モード」という概念です:
- コマンドモード:キー入力がコマンドとして解釈される(起動時のモード)
- 挿入モード:キー入力がテキストとして入力される
多くの初学者が「viで入力できない」「viから抜け出せない」と困るのは、このモードの概念を理解していないからです。
起動と終了(:q, :q!, :wq)
[実行ユーザー: 一般ユーザー]
$ vi filename.txt
終了方法(コマンドモードで入力):
| コマンド | 動作 |
|---|---|
| :q | 終了(変更がない場合) |
| :q! | 変更を破棄して強制終了 |
| :wq | 保存して終了 |
| :w | 保存(終了しない) |
| ZZ | 保存して終了(:wqと同じ) |
💡 viから抜け出せなくなったら
以下の手順を試してください:
- Escキーを何度か押す(コマンドモードに戻る)
:q!と入力してEnter(変更を破棄して終了)
それでもダメな場合は、Ctrl+C を試すか、別のターミナルから作業してください。
最小限の編集操作(i, Esc, dd, yy, p)
| キー/コマンド | 動作 | モード |
|---|---|---|
| i | 挿入モードに入る(カーソル位置から入力開始) | コマンド→挿入 |
| Esc | コマンドモードに戻る | 挿入→コマンド |
| dd | 現在の行を削除 | コマンド |
| yy | 現在の行をコピー | コマンド |
| p | ペースト(カーソルの下の行に) | コマンド |
| u | 元に戻す(undo) | コマンド |
基本的な編集の流れ
vi filename.txtでファイルを開く(コマンドモードで起動)iを押して挿入モードに入る- テキストを入力・編集
Escを押してコマンドモードに戻る:wqで保存して終了
なぜviを学ぶべきか
viは操作が独特で学習コストが高いですが、以下の理由から最低限の操作を覚えておくべきです:
- すべてのUNIX/Linuxシステムに標準でインストールされている
- 緊急時(nanoがない環境、システムが壊れかけている時など)に唯一使えるエディタの可能性がある
- 設定ファイルの簡単な編集ができれば十分(本格的な開発には別のエディタを使っても良い)
| 項目 | nano | vi/vim |
|---|---|---|
| 学習コスト | 低い | 高い |
| 操作性 | 直感的 | 独特(モード概念) |
| インストール状況 | 別途インストールが必要な場合あり | ほぼ全環境で利用可能 |
| 機能 | 基本的な編集 | 非常に高機能 |
| 推奨用途 | 日常的な設定編集 | 緊急時、大量編集 |
2.6 パイプとリダイレクト – Linuxの真髄
ここで学ぶ「パイプ」と「リダイレクト」は、Linuxの最も強力な機能の1つです。これらを理解すると、複数のコマンドを組み合わせて複雑な処理を簡単に実現できるようになります。
2.6.1 標準入力・標準出力・標準エラー出力とは
Linuxのコマンドは、3つの「標準ストリーム」を持っています:
| 名称 | 略称 | 番号 | 説明 |
|---|---|---|---|
| 標準入力 | stdin | 0 | コマンドへの入力(通常はキーボード) |
| 標準出力 | stdout | 1 | コマンドの通常出力(通常は画面) |
| 標準エラー出力 | stderr | 2 | エラーメッセージの出力(通常は画面) |
例えば、ls コマンドを実行すると:
- 標準出力:ファイル一覧
- 標準エラー出力:エラーメッセージ(存在しないディレクトリを指定した場合など)
2.6.2 リダイレクト(>)で出力をファイルに保存
>(リダイレクト)を使うと、コマンドの出力を画面ではなくファイルに保存できます。
[実行ユーザー: 一般ユーザー]
# lsの出力をファイルに保存
$ ls -l > filelist.txt
# 内容を確認
$ cat filelist.txt
total 16
drwxr-xr-x. 2 developer developer 4096 Jan 15 10:30 Desktop
drwxr-xr-x. 2 developer developer 4096 Jan 15 10:30 Documents
...
> は、ファイルが存在する場合は上書きします。既存の内容は失われるので注意してください。
2.6.3 追記リダイレクト(>>)
>> を使うと、既存のファイルに追記できます。
[実行ユーザー: 一般ユーザー]
# 日時を追記
$ date >> log.txt
$ date >> log.txt
$ cat log.txt
Wed Jan 15 11:30:00 JST 2025
Wed Jan 15 11:30:05 JST 2025
2.6.4 入力リダイレクト(<)
< を使うと、ファイルの内容をコマンドの入力として使えます。
[実行ユーザー: 一般ユーザー]
# ファイルの行数をカウント
$ wc -l < /etc/passwd
45
2.6.5 パイプ(|)でコマンドを繋ぐ
|(パイプ)は、あるコマンドの出力を、別のコマンドの入力として渡します。これがLinuxの真髄とも言える機能です。
[実行ユーザー: 一般ユーザー]
# lsの出力をlessで表示
$ ls -la | less
# ファイル数をカウント
$ ls | wc -l
15
パイプを使うと、小さな機能を持つコマンドを組み合わせて、複雑な処理を実現できます。これはUNIX哲学の「1つのことをうまくやる」という考え方に基づいています。
2.6.6 実践例: ログから特定のエラーを抽出
実際の運用でよく使うパターンを見てみましょう:
[実行ユーザー: 一般ユーザー(sudo使用)]
# messagesログから「error」を含む行を抽出
$ sudo cat /var/log/messages | grep -i error
# 結果を行数付きで表示
$ sudo cat /var/log/messages | grep -i error | nl
# 結果をファイルに保存
$ sudo cat /var/log/messages | grep -i error > errors.txt
2.6.7 複数コマンドの組み合わせ
パイプは何段でも繋げることができます:
[実行ユーザー: 一般ユーザー]
# /etc/passwdからシェルがbashのユーザーを抽出し、
# ユーザー名だけを取り出し、ソートして表示
$ cat /etc/passwd | grep bash | cut -d: -f1 | sort
root
developer
この例では:
cat /etc/passwd:passwdファイルの内容を出力grep bash:「bash」を含む行だけを抽出cut -d: -f1:「:」区切りの1番目のフィールド(ユーザー名)を取り出すsort:アルファベット順にソート
このように、単純なコマンドを組み合わせることで、強力なデータ処理が可能になります。
2.7 ファイルを探す・内容を検索する
システム管理では、「あのファイルどこにあったっけ?」「このエラーメッセージはどのログに出てる?」ということが頻繁にあります。検索コマンドを使いこなせるようになりましょう。
2.7.1 findコマンドの基本構文
find は、ファイルやディレクトリを様々な条件で検索するコマンドです。
基本構文:
find [検索開始ディレクトリ] [検索条件] [アクション]
[実行ユーザー: 一般ユーザー]
# カレントディレクトリ以下のすべてのファイルを表示
$ find .
.
./file1.txt
./dir1
./dir1/file2.txt
...
2.7.2 名前で検索(-name)
[実行ユーザー: 一般ユーザー]
# 「config」という名前のファイルを検索
$ find /etc -name "config" 2>/dev/null
/etc/selinux/config
# ワイルドカードを使った検索(*.confファイルを検索)
$ find /etc -name "*.conf" 2>/dev/null | head -5
/etc/resolv.conf
/etc/host.conf
/etc/krb5.conf
/etc/ld.so.conf
/etc/man_db.conf
2>/dev/null は、権限エラーなどのエラーメッセージを捨てるためのリダイレクトです。
大文字小文字を区別しない場合は -iname を使います:
[実行ユーザー: 一般ユーザー]
$ find . -iname "readme*"
./README.txt
./readme.md
./Readme
2.7.3 更新日時で検索(-mtime)
-mtime は、最終更新日時でファイルを検索します。
[実行ユーザー: 一般ユーザー]
# 過去1日以内に更新されたファイル
$ find . -mtime -1
# ちょうど7日前に更新されたファイル
$ find . -mtime 7
# 30日以上前に更新されたファイル
$ find . -mtime +30
-mtime の数値の意味:
-n:n日より新しい(n日以内)n:ちょうどn日前+n:n日より古い
2.7.4 サイズで検索(-size)
[実行ユーザー: 一般ユーザー]
# 100MB以上のファイルを検索
$ find /var -size +100M 2>/dev/null
# 1KB未満のファイルを検索
$ find . -size -1k
# ちょうど0バイト(空ファイル)を検索
$ find . -size 0
サイズの単位:c(バイト)、k(キロバイト)、M(メガバイト)、G(ギガバイト)
2.7.5 検索結果に対するアクション(-exec)
-exec を使うと、検索結果に対してコマンドを実行できます。
[実行ユーザー: 一般ユーザー]
# 検索結果のファイルの詳細を表示
$ find . -name "*.txt" -exec ls -l {} \;
-rw-r--r--. 1 developer developer 1234 Jan 15 10:00 ./file1.txt
-rw-r--r--. 1 developer developer 5678 Jan 15 11:00 ./file2.txt
# 7日以上前のログファイルを削除(確認付き)
$ find /tmp -name "*.log" -mtime +7 -exec rm -i {} \;
{} は検索結果のファイル名に置き換わり、\; は-execの終了を示します。
2.7.6 grepコマンドでテキスト検索
grep は、ファイルの内容を検索するコマンドです。findがファイル名で検索するのに対し、grepはファイルの中身を検索します。
[実行ユーザー: 一般ユーザー]
# ファイル内で「error」を検索
$ grep "error" /var/log/messages
# 大文字小文字を区別しない(-i)
$ grep -i "error" /var/log/messages
# 行番号を表示(-n)
$ grep -n "error" /var/log/messages
123:Jan 15 10:00:00 alma app: error occurred
456:Jan 15 11:00:00 alma app: connection error
2.7.7 正規表現の基礎
grepは正規表現をサポートしており、より柔軟な検索が可能です。基本的なパターン:
| パターン | 意味 | 例 |
|---|---|---|
| ^ | 行頭 | ^root:rootで始まる行 |
| $ | 行末 | bash$:bashで終わる行 |
| . | 任意の1文字 | a.c:abc, aXc など |
| * | 直前の文字の0回以上の繰り返し | ab*c:ac, abc, abbc など |
| […] | 括弧内のいずれか1文字 | [0-9]:数字1文字 |
[実行ユーザー: 一般ユーザー]
# rootで始まる行を検索
$ grep "^root" /etc/passwd
root:x:0:0:root:/root:/bin/bash
# bashで終わる行を検索
$ grep "bash$" /etc/passwd
root:x:0:0:root:/root:/bin/bash
developer:x:1000:1000:Test User:/home/developer:/bin/bash
2.7.8 再帰的検索(-r)とファイル名表示(-H)
-r オプションを使うと、ディレクトリ内を再帰的に検索できます。
[実行ユーザー: 一般ユーザー]
# /etc以下で「Listen」を含むファイルを検索
$ grep -r "Listen" /etc 2>/dev/null
/etc/ssh/sshd_config:#ListenAddress 0.0.0.0
/etc/httpd/conf/httpd.conf:Listen 80
-H オプションは、マッチした行の前にファイル名を表示します(-rの場合はデフォルトで表示されます)。
2.7.9 実践例: 「昨日更新されたログファイルからエラーを探す」
findとgrepを組み合わせた実践的な例を見てみましょう:
[実行ユーザー: 一般ユーザー(sudo使用)]
# 昨日更新されたログファイルを探し、その中から「error」を検索
$ sudo find /var/log -name "*.log" -mtime -1 -exec grep -l "error" {} \;
/var/log/httpd/error_log
/var/log/app/application.log
# 見つかったファイルの該当行を表示
$ sudo find /var/log -name "*.log" -mtime -1 -exec grep -H "error" {} \;
/var/log/httpd/error_log:error connecting to database
/var/log/app/application.log:configuration error detected
この例では:
findで昨日更新された .log ファイルを検索-exec grepでそれぞれのファイル内を検索-lオプションはマッチしたファイル名のみを表示-Hオプションはファイル名と該当行を表示
2.8 ファイルの圧縮と解凍
ファイルの圧縮は、ディスク容量の節約やファイル転送の効率化に欠かせません。Linuxでは主に tar コマンドを使って圧縮・解凍を行います。
2.8.1 なぜ圧縮が必要か
圧縮には以下のメリットがあります:
- ディスク容量の節約(特にログファイルなど)
- ネットワーク転送時間の短縮
- 複数のファイルを1つにまとめられる(アーカイブ)
- バックアップの効率化
2.8.2 tar形式の理解(アーカイブと圧縮の違い)
「アーカイブ」と「圧縮」は異なる概念です:
- アーカイブ:複数のファイルを1つのファイルにまとめる(サイズは変わらない)
- 圧縮:データを圧縮してファイルサイズを小さくする
tar は本来アーカイブツールで、圧縮機能を追加して使うのが一般的です。
よく見る拡張子と意味:
| 拡張子 | 意味 |
|---|---|
| .tar | アーカイブのみ(圧縮なし) |
| .tar.gz または .tgz | gzip圧縮されたtarアーカイブ |
| .tar.xz | xz圧縮されたtarアーカイブ |
| .tar.bz2 | bzip2圧縮されたtarアーカイブ |
2.8.3 tarコマンドの基本
tar の主要なオプション:
| オプション | 意味 |
|---|---|
| -c | 作成(create) |
| -x | 展開(extract) |
| -t | 内容確認(list) |
| -v | 詳細表示(verbose) |
| -f | ファイル名指定(file) |
| -z | gzip圧縮 |
| -J | xz圧縮 |
2.8.4 tar.gzの作成(-czf)
[実行ユーザー: 一般ユーザー]
# ディレクトリをtar.gzに圧縮
$ tar -czf archive.tar.gz myproject/
# 圧縮結果を確認
$ ls -lh archive.tar.gz
-rw-r--r--. 1 developer developer 2.3M Jan 15 12:00 archive.tar.gz
オプションの意味:
-c:アーカイブを作成-z:gzip圧縮を適用-f archive.tar.gz:出力ファイル名を指定
2.8.5 tar.gzの展開(-xzf)
[実行ユーザー: 一般ユーザー]
# 展開(カレントディレクトリに展開される)
$ tar -xzf archive.tar.gz
# 展開先を指定する場合(-Cオプション)
$ tar -xzf archive.tar.gz -C /tmp/
2.8.6 tar.xzの作成と展開
xz圧縮はgzipより圧縮率が高いですが、処理に時間がかかります。
[実行ユーザー: 一般ユーザー]
# tar.xz形式で作成
$ tar -cJf archive.tar.xz myproject/
# tar.xz形式を展開
$ tar -xJf archive.tar.xz
| 形式 | 圧縮率 | 速度 | 用途 |
|---|---|---|---|
| gzip (.tar.gz) | 中程度 | 速い | 一般的な用途、日常的なバックアップ |
| xz (.tar.xz) | 高い | 遅い | 配布用パッケージ、長期保存 |
| bzip2 (.tar.bz2) | 中〜高 | 中程度 | 現在はxzに置き換わりつつある |
2.8.7 アーカイブ内容の確認(-tzf)
展開する前に、アーカイブの中身を確認できます:
[実行ユーザー: 一般ユーザー]
$ tar -tzf archive.tar.gz
myproject/
myproject/file1.txt
myproject/file2.txt
myproject/subdir/
myproject/subdir/file3.txt
2.8.8 よくあるトラブル: 展開先でファイルが散らかる問題
アーカイブの作り方によっては、展開時にファイルがカレントディレクトリに散らばってしまうことがあります。
問題のあるアーカイブ
# ファイルが直接アーカイブされている
$ tar -tzf bad_archive.tar.gz
file1.txt
file2.txt
config.ini
この場合、展開するとカレントディレクトリに直接ファイルが作成されます。
対策:展開前に確認する習慣
[実行ユーザー: 一般ユーザー]
# 1. まず内容を確認
$ tar -tzf archive.tar.gz | head
# 2. ディレクトリを含まない場合は、新しいディレクトリを作成して展開
$ mkdir extracted
$ tar -xzf archive.tar.gz -C extracted/
2.9 ユーザーと権限の基礎
Linuxはマルチユーザーシステムであり、複数のユーザーが同時にシステムを利用できます。そのため、ファイルやディレクトリに対するアクセス制御(パーミッション)が非常に重要です。
2.9.1 マルチユーザーシステムとしてのLinux
Linuxは、以下の特徴を持つマルチユーザーシステムです:
- 複数のユーザーが同時にログインできる
- 各ユーザーは自分のファイルとプロセスを持つ
- ユーザーごとにアクセス権限が設定できる
- 特権ユーザー(root)がシステム全体を管理する
2.9.2 whoamiとidで自分の情報を確認
[実行ユーザー: 一般ユーザー]
# 現在のユーザー名を表示
$ whoami
developer
# ユーザーID、グループID、所属グループを表示
$ id
uid=1000(developer) gid=1000(developer) groups=1000(developer),10(wheel)
id コマンドの出力の意味:
uid=1000(developer):ユーザーID(数値)とユーザー名gid=1000(developer):プライマリグループIDとグループ名groups=...:所属しているすべてのグループ
wheel グループは、sudo を使用できるグループです(RHEL系の慣習)。
2.9.3 sudoとは何か – なぜ必要なのか
sudo(Super User DO)は、一般ユーザーが一時的に管理者(root)権限でコマンドを実行するための仕組みです。
なぜrootで直接ログインしないのか?
- ミスの影響を最小限に抑える(通常操作は一般ユーザーで行う)
- 誰が何をしたか履歴が残る(監査目的)
- セキュリティリスクの低減(rootパスワードの共有を避ける)
2.9.4 sudoの実行方法と認証
[実行ユーザー: 一般ユーザー(sudo使用)]
# 管理者権限でコマンドを実行
$ sudo cat /etc/shadow
[sudo] password for developer: (パスワードを入力)
(/etc/shadowの内容が表示される)
sudoを実行すると、自分自身のパスワードを求められます(rootのパスワードではありません)。パスワードは一定時間(通常5分)キャッシュされ、その間は再入力不要です。
sudoが許可されていないユーザーが実行しようとすると、エラーになります:
$ sudo cat /etc/shadow
developer is not in the sudoers file. This incident will be reported.
2.9.5 ファイルパーミッションの概念
Linuxのすべてのファイル・ディレクトリには、「誰が何をできるか」を制御するパーミッション(権限)が設定されています。
パーミッションには3種類があります:
| 記号 | 意味 | ファイルの場合 | ディレクトリの場合 |
|---|---|---|---|
| r | 読み取り(read) | 内容を読める | 一覧を見られる |
| w | 書き込み(write) | 内容を変更できる | ファイルを作成・削除できる |
| x | 実行(execute) | プログラムとして実行できる | 中に入れる(cdできる) |
2.9.6 ls -lの見方(rwxrwxrwx)
[実行ユーザー: 一般ユーザー]
$ ls -l
-rw-r--r--. 1 developer developer 1234 Jan 15 10:00 file.txt
drwxr-xr-x. 2 developer developer 4096 Jan 15 10:00 mydir
最初の10文字を分解すると:
-rw-r--r--
│└┬─┘└┬─┘└┬─┘
│ │ │ └── その他のユーザー(other)の権限
│ │ └────── グループ(group)の権限
│ └────────── 所有者(user)の権限
└──────────── ファイルタイプ(-:通常ファイル, d:ディレクトリ, l:シンボリックリンク)
例:-rw-r--r--
- 所有者:読み書き可能(rw-)
- グループ:読み取りのみ(r–)
- その他:読み取りのみ(r–)
2.9.7 所有者・グループ・その他の理解
パーミッションは3つのカテゴリに対して設定されます:
| カテゴリ | 説明 | 記号 |
|---|---|---|
| 所有者(user) | ファイルを所有しているユーザー | u |
| グループ(group) | ファイルの所有グループに属するユーザー | g |
| その他(other) | 上記以外のすべてのユーザー | o |
| 全員(all) | すべてのカテゴリ | a |
2.9.8 chmodでパーミッション変更(数値指定と記号指定)
chmod コマンドでパーミッションを変更できます。2つの指定方法があります。
数値指定(8進数)
各権限を数値で表します:
- r = 4
- w = 2
- x = 1
これらを足し合わせて3桁の数字で指定します。
[実行ユーザー: 一般ユーザー]
# 所有者:読み書き実行(7)、グループ:読み実行(5)、その他:読み実行(5)
$ chmod 755 script.sh
# 所有者:読み書き(6)、グループ:読み(4)、その他:読み(4)
$ chmod 644 file.txt
# 確認
$ ls -l
-rwxr-xr-x. 1 developer developer 256 Jan 15 12:00 script.sh
-rw-r--r--. 1 developer developer 1234 Jan 15 12:00 file.txt
よく使う数値パターン:
| 数値 | 意味 | 用途 |
|---|---|---|
| 755 | rwxr-xr-x | 実行可能なスクリプト、ディレクトリ |
| 644 | rw-r–r– | 一般的なファイル |
| 600 | rw——- | 秘密鍵など、所有者のみアクセス可能 |
| 700 | rwx—— | 所有者のみアクセス可能なディレクトリ |
記号指定
より直感的に「誰に」「何を」「追加/削除するか」を指定します。
[実行ユーザー: 一般ユーザー]
# 所有者に実行権限を追加
$ chmod u+x script.sh
# グループとその他から書き込み権限を削除
$ chmod go-w file.txt
# すべてのユーザーに読み取り権限を追加
$ chmod a+r file.txt
# 所有者に全権限、グループとその他は読み取りのみ
$ chmod u=rwx,go=r file.txt
2.9.9 chownで所有者変更
chown は、ファイルの所有者やグループを変更します。通常、root権限が必要です。
[実行ユーザー: 一般ユーザー(sudo使用)]
# 所有者を変更
$ sudo chown newuser file.txt
# 所有者とグループを同時に変更
$ sudo chown newuser:newgroup file.txt
# グループのみ変更
$ sudo chown :newgroup file.txt
# ディレクトリ以下を再帰的に変更(-R)
$ sudo chown -R newuser:newgroup directory/
2.9.10 実践例: スクリプトファイルに実行権限を付与
シェルスクリプトを作成して実行するまでの流れを見てみましょう:
[実行ユーザー: 一般ユーザー]
# スクリプトを作成
$ cat > hello.sh << 'EOF'
#!/bin/bash
echo "Hello, World!"
EOF
# パーミッションを確認(実行権限がない)
$ ls -l hello.sh
-rw-r--r--. 1 developer developer 32 Jan 15 12:30 hello.sh
# 実行しようとするとエラー
$ ./hello.sh
bash: ./hello.sh: Permission denied
# 実行権限を付与
$ chmod +x hello.sh
# 再度確認
$ ls -l hello.sh
-rwxr-xr-x. 1 developer developer 32 Jan 15 12:30 hello.sh
# 実行
$ ./hello.sh
Hello, World!
2.10 環境変数とPATH
環境変数は、シェルやプログラムの動作を制御する設定値です。特に重要なのが PATH 環境変数で、コマンドの実行に直接関わります。
2.10.1 環境変数とは何か
環境変数は、シェルの「設定」を保存している変数です。ユーザー名、ホームディレクトリ、言語設定など、様々な情報が環境変数として保存されています。
[実行ユーザー: 一般ユーザー]
# 現在設定されている環境変数を表示
$ env
SHELL=/bin/bash
HOME=/home/developer
USER=developer
PATH=/home/developer/.local/bin:/home/developer/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin
LANG=en_US.UTF-8
...
個別の環境変数を確認するには echo を使います:
[実行ユーザー: 一般ユーザー]
$ echo $HOME
/home/developer
$ echo $USER
developer
$ を付けることで、変数の中身(値)を参照できます。
2.10.2 echo $PATHでPATHを確認
PATH は最も重要な環境変数の1つで、コマンドを検索するディレクトリのリストが格納されています。
[実行ユーザー: 一般ユーザー]
$ echo $PATH
/home/developer/.local/bin:/home/developer/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin
これは :(コロン)区切りのディレクトリリストです。上記の例では:
- /home/developer/.local/bin
- /home/developer/bin
- /usr/local/bin
- /usr/bin
- /usr/local/sbin
- /usr/sbin
の順番で検索されます。
2.10.3 PATHの仕組み(コマンドが見つかる理由)
コマンドを入力すると、シェルは以下の流れで処理します:
- 入力されたコマンドがシェルの組み込みコマンドかチェック
- PATH の各ディレクトリを順番に検索
- 最初に見つかった実行可能ファイルを実行
例えば ls と入力すると、/usr/bin/ls が見つかって実行されます。
2.10.4 whichコマンドでコマンドの場所を特定
which コマンドは、指定したコマンドがどのパスにあるかを表示します。
[実行ユーザー: 一般ユーザー]
$ which ls
/usr/bin/ls
$ which python3
/usr/bin/python3
$ which vim
/usr/bin/vim
コマンドが見つからない場合は何も表示されないか、エラーになります:
[実行ユーザー: 一般ユーザー]
$ which nonexistent
(何も表示されない、または「nonexistent not found」)
2.10.5 環境変数の設定(export)
環境変数を設定するには export コマンドを使います。
[実行ユーザー: 一般ユーザー]
# 新しい環境変数を設定
$ export MY_VAR="Hello"
$ echo $MY_VAR
Hello
# PATHに新しいディレクトリを追加
$ export PATH=$PATH:/opt/myapp/bin
$ echo $PATH
/home/developer/.local/bin:...:/opt/myapp/bin
ただし、この方法で設定した環境変数は、現在のシェルセッションでのみ有効です。ターミナルを閉じると消えてしまいます。
2.10.6 .bashrcと.bash_profileの違い
環境変数を永続的に設定するには、シェルの設定ファイルに記述します。
| ファイル | 読み込まれるタイミング | 用途 |
|---|---|---|
| ~/.bash_profile | ログインシェル起動時 | 環境変数の設定 |
| ~/.bashrc | 対話型シェル起動時 | エイリアス、関数、シェル設定 |
実際には、~/.bash_profile から ~/.bashrc を読み込む設定になっていることが多いため、~/.bashrc に記述するのが一般的です。
2.10.7 設定の反映(sourceコマンド)
設定ファイルを編集した後、変更を現在のシェルに反映するには source コマンドを使います。
[実行ユーザー: 一般ユーザー]
# .bashrcを編集後、反映
$ source ~/.bashrc
# または、ドット(.)でも同じ
$ . ~/.bashrc
再ログインしなくても、設定が即座に反映されます。
2.10.8 よくあるトラブル: “command not found”エラー
「command not found」エラーは、入力したコマンドがPATH内のどのディレクトリにも見つからなかった場合に発生します。
原因と対処法
- コマンドのタイプミス
$ pyhton3 # pythonのスペルミス bash: pyhton3: command not found - コマンドがインストールされていない
$ htop # htopがインストールされていない場合 bash: htop: command not found # インストールする $ sudo dnf5 install htop - コマンドのパスがPATHに含まれていない
$ /opt/myapp/bin/mycommand # フルパスなら実行できる - スクリプトにパスを指定していない
# カレントディレクトリのスクリプトは ./を付ける $ ./myscript.sh # OK $ myscript.sh # command not found
【コラム1】パイプを繋ぎまくって本番サーバーで遊んだ話
これは、私の後輩がLinuxを学び始めた頃の話です。
後輩はパイプの便利さに感動し、「どんな複雑な処理もパイプで繋げば一発でできる!」と目を輝かせていました。確かにパイプは強力で、彼は検証環境で様々なワンライナーを作っては試していました。
ある日、本番サーバーのログ解析を任された後輩は、検証環境で作った「必殺のワンライナー」を意気揚々と実行しました。
cat /var/log/messages | grep error | awk '{print $5}' | sort | uniq -c | sort -rn | head -20
しかし、本番サーバーのログファイルは検証環境とは比べものにならないほど巨大でした。数ギガバイトのログファイルをcatで丸ごと読み込み、複数のパイプ処理が走り始めると、サーバーのCPUとメモリが逼迫。他のサービスにも影響が出始めました。
幸い、先輩がすぐに気づいて Ctrl+C で処理を止め、大事には至りませんでしたが、後輩は青ざめた顔で「検証環境では一瞬だったのに…」と呟いていました。
この経験から学んだ教訓:
- 検証環境で試してから本番へ:データ量が違えば結果も違う
- 本番での実行は慎重に:影響範囲を考慮する
- ファイルサイズを確認してから処理:
ls -lhで確認 - tailやheadで一部だけテスト:いきなり全量処理しない
パイプは本当に便利です。でも、本番環境では「便利だから」と安易に使わず、影響を考えてから実行しましょう。後輩は今では、本番作業前に必ず ls -lh でファイルサイズを確認する習慣が身についています。
章末まとめ
この章では、Linuxの基本操作を学びました。以下のスキルを身につけたことになります:
- シェルの基礎:bashの基本、コマンド構文、履歴機能、タブ補完
- ヘルプの使い方:–help、man、infoでの情報取得
- ファイル操作:ls、cd、mkdir、cp、mv、rm、touch、ワイルドカード
- テキスト表示:cat、less、head、tail
- エディタ:nano(推奨)とvi(最低限)
- パイプとリダイレクト:コマンドの組み合わせ、出力のファイル保存
- 検索:findでファイル検索、grepでテキスト検索
- 圧縮:tarでのアーカイブ作成・展開
- 権限:パーミッションの理解、chmod、chown、sudo
- 環境変数:PATH、環境変数の設定
これらは、Linuxを使う上での基礎中の基礎です。最初は覚えることが多く感じますが、日常的に使っていれば自然と身につきます。大切なのは、すべてを暗記しようとしないこと。困ったら --help や man で調べる習慣をつけましょう。
練習問題
問題1:ファイル操作の基本
以下の操作を順番に行ってください:
- ホームディレクトリに
practiceというディレクトリを作成 - その中に
file1.txt、file2.txt、file3.txtという空のファイルを作成 file1.txtをbackupというサブディレクトリにコピー(backupディレクトリも作成)file3.txtをimportant.txtにリネーム
問題2:パーミッションの理解
ls -l の出力が以下のとき、各質問に答えてください:
-rw-r-----. 1 webadmin developers 2048 Jan 15 10:00 config.ini
- このファイルの所有者は誰ですか?
- 所有者にはどのような権限がありますか?
developersグループのメンバーにはどのような権限がありますか?- その他のユーザーにはどのような権限がありますか?
- このファイルに対して、所有者が実行権限を追加し、グループに書き込み権限を追加する
chmodコマンドを2通りで書いてください(数値指定と記号指定)
問題3:findとgrepの組み合わせ
/etc ディレクトリ以下で、以下の条件に合うファイルを検索するコマンドを書いてください:
- 拡張子が
.confのファイルを検索 - 過去7日以内に更新されたファイルを検索
- 「password」という文字列を含むファイルを検索(大文字小文字を区別しない)
問題4:パイプを使ったコマンドの組み合わせ
以下の処理を1行のコマンドで実現してください:
/etc/passwdの内容から、/bin/bashを含む行だけを抽出し、その行数をカウントする- カレントディレクトリ以下のすべてのファイルを
ls -laで表示し、ファイルサイズが大きい順にソートして上位5件を表示する
問題5:圧縮と解凍
~/practiceディレクトリ全体をpractice_backup.tar.gzとして圧縮するコマンドを書いてください- 作成したアーカイブの中身を展開せずに確認するコマンドを書いてください
- 作成したアーカイブを
/tmpディレクトリに展開するコマンドを書いてください
次章への橋渡し
この章で、Linuxの基本操作をマスターしました。コマンドラインでファイルを操作し、テキストを検索し、権限を管理できるようになりました。
次章では、パッケージ管理を学びます。サーバーに必要なソフトウェアをインストールし、システムを最新の状態に保つ方法です。AlmaLinux 10では dnf5 というパッケージマネージャーを使用します。これにより、セキュリティアップデートの適用や、開発ツール、サーバーソフトウェアの導入が簡単に行えるようになります。
第3章「パッケージ管理とソフトウェアのインストール」へ進みましょう。
