非エンジニアのための
UNIX/Linux入門
概要: この記事では、 Claude Codeなど、CLI (コマンドライン)ベースのAIエージェントを使う時に 知っていると便利な UNIX/Linux に関する基礎知識を紹介する。 最終的な目標は各コマンドが何をやっているかおおまかに把握できることである。 記事は3部に分かれており、 1. UNIXの基本、 2. シェルの使い方、 および 3. よく使うコマンド一覧 となっている。
なお、ここでは macOS ターミナルを使うことを想定している。
目次
第1部 - UNIXの基本
1. 基本的な概念
1.1. オペレーティングシステム (OS) とは?
- コンピュータの基本的な処理 (ディスク操作、ネットワーク処理、画面表示など) を提供する基本ソフトウェア。
- 人間にとって使いやすいように、多くの「見せかけ」 (ファイルシステム、同時並列処理、権限管理など) を実現している。
- ファイル・フォルダ・空き容量 … ディスクは実際には物理的な媒体であり、「ファイル」「フォルダ」などというものは本来存在しないし、その容量は増えも減りもしない。
- 同時並列処理 … 実際には、コンピュータが実行できるのはひとつのプログラムだけ。
- ほとんどの人は、OS 上で動作するアプリケーション (アプリ、応用ソフトウェア) を書いている。
- アプリは、コンピュータで動いているソフトウェア全体のごく一部である。
1.2. UNIXとは?
- 1970年ごろに作られた OS (オペレーティングシステム)。
- 以後の多くの OS が UNIX を継承あるいは模倣している。
- 一般に、これらの「UNIX風OS」も含めて UNIX と呼称する。 (MS-DOSとWindowsを除く)
1.3. Linuxとは?
- UNIXを模倣したOSのひとつ。
- "RedHat", "Ubuntu", "Debian" といった複数の異なる "Linux" が存在している。 これらは厳密には Linux ではなく、異なる Linux の ディストリビューション と呼ばれている。
- 主要なLinuxディストリビューション一覧
2. ファイルシステム
- たいていのシステムでは、 ファイルという単位を使ってディスクにデータを保存する。 この仕組みをファイルシステムという。
- ファイルはただの「バイト列 (0と1の羅列)」であり、
中身はなんでもよい:
- 文字 (テキストファイル)
- 画像 (画像ファイル)
- 音声・動画
- プログラム (実行可能ファイル)
- 各ファイルはファイル名によって区別する。
- 各ファイルには名前のほかに、以下のようなメタデータが付与されている:
- ファイルサイズ (バイト数)
- 最終更新日時
- 所有者 (ユーザ)
- 読み書き許可フラグ
- 実行可能フラグ
- …
2.1. フォルダ・ディレクトリとは
ファイルの数が多くなると管理が大変になるので、 フォルダ (あるいはディレクトリとも呼ばれる) を使って整理する。
UNIXでは、すべてのファイル・フォルダはひとつの巨大な木構造 (tree) をなしている。
2.2. パス名とは
ファイルシステム中に同じ名前のファイル・フォルダが複数存在している場合、 ファイルの正確な位置は、パス名 (path) で表す。 パス名は、ファイルシステム上におけるファイルの「住所」である。
- ディレクトリ
Xのパス名を書け。 - ファイル
Hのパス名を書け。 - ファイル
Cのパス名を 2つ書け。
UNIXにおける「お約束」パス名
UNIX では、いくつかのパス名は 「お約束」として決められている。
-
/bin: 実行可能ファイル (プログラム) -
/Users/ユーザ名: 各ユーザのホームディレクトリ (macOS以外では/home/ユーザ名) -
/etc: 設定ファイル -
/dev: デバイスファイル - …
% で表している。
Linuxの場合はプロンプトは通常 $ なので、適宜読みかえてほしい。
-
ls パス名… パス名に含まれているファイル一覧を表示する。% ls /bin [ dd launchctl pwd tcsh bash df link realpath test cat echo ln rm unlink ...
-
ls -l パス名… より詳細なメタデータとともに表示する。% ls -l /bin total 9536 -rwxr-xr-x 2 root wheel 101472 Mar 21 15:13 [ -r-xr-xr-x 1 root wheel 1310352 Mar 21 15:13 bash -rwxr-xr-x 1 root wheel 119008 Mar 21 15:13 cat -rwxr-xr-x 1 root wheel 120576 Mar 21 15:13 chmod -rwxr-xr-x 1 root wheel 136704 Mar 21 15:13 cp ...
各行の先頭にある
rwxr-xr-xなどはファイルに対する権限 (パーミッション) を表す。 次のrootwheelはそれぞれ所有者名とグループ名、101472などの数字は ファイルサイズ (バイト数)、Mar 21 15:13は最終更新時刻を表す。パーミッションの最初の3文字rwxは所有者が 読み込み(r)、書き込み(w) および実行 (x) できることを表し、 次の3文字r-xはグループメンバーが読み込み(r) および実行 (x) のみができること、 そして最後の3文字r-xはそれ以外のユーザが読み込み(r) および実行 (x) のみができることを表す。UNIX のコマンドは "
-" や "+" で始まる 文字列を与えることにより異なった動きをするものが多い。 (これは何か規則があるわけではなく、ただの慣例である。) このような文字列を一般にコマンドの「オプション (option)」と呼ぶ。 -
cat パス名… ファイルの内容を表示する。% cat /etc/shells # List of acceptable shells for chpass(1). # Ftpd will not allow users to connect who are not using # one of these shells. /bin/bash /bin/csh /bin/dash ...
UNIX ではどんなファイルも同様に扱われるので、 実はcatコマンドを使えば あらゆるファイルの内容を (バイト列として) 表示できる。 しかし実際には JPEG などの画像ファイルをバイト列として表示しても 意味不明な文字列が表れるだけである。注意: UNIXは普通、パス名の大文字・小文字を区別するが、 macOS だけは大文字・小文字を区別しない。 そのため以下のファイルは、macOSではすべて同じものとして扱われる。-
/etc/shells -
/ETC/SHELLS -
/eTC/sHeLlS
-
-
open パス名… ファイル・フォルダをFinder上で開く (macOS限定)。% open /
macOS の Finderでは、ファイル・フォルダを選択して、 「コピー ⌘-C」を実行すると、そのパス名が文字列としてコピーされる。
2.3. カレント・ディレクトリ (カレント・フォルダ) とは
- パス名を使うことの問題は、パス名は非常に長くなりうるということである。
例:/Applications/Safari.app/Contents/MacOS/… - いちいちパス名を入力するのは面倒。簡単にできないか?
→ いま開いている・注目している (カレント, current) ディレクトリという考えを導入する。
2.4. 絶対パス名と相対パス名
実は「パス名」と呼ばれているものには 2つの種類がある。 上で説明した「パス名」は「絶対パス名」のことであった。
- 絶対パス名: ディスクの先頭からたどったパス名。
- 相対パス名: カレント・ディレクトリからたどったパス名。
つまり、上のディレクトリ X の位置は、次の2通りで表せる:
- 絶対パス名:
/A/E/X - 相対パス名:
./X
2.5. 相対パス名の表し方
- 相対パス名では、カレント・ディレクトリの位置を
「.(ドット)」で表す:./X,./Kなど - さらに、相対パス名では、ひとつ「上の」ディレクトリを
「..」で表せる。 - 相対パス名の能力は、絶対パス名と等価である。
つまり、絶対パスで表せるどんな位置も相対パス名によって表すことができる。
例:../../../../../../../Application=/Application
カレント・ディレクトリが E のとき…
- ディレクトリ
Aへの相対パス名は? - ファイル
Hへの相対パス名は? - ファイル
Kへの相対パス名は? (2つある)
-
pwd… カレント・ディレクトリを表示する。 -
cd パス名… カレント・ディレクトリを指定されたパス名に変更する。 -
cd… カレント・ディレクトリを自分のホームディレクトリに変更する。% pwd /Users/euske % cd /etc % pwd /etc % cd % pwd /Users/euske
-
ls(パス名を省略) … カレント・ディレクトリに含まれているファイル一覧を表示する。 -
ls -a(パス名を省略) … 通常のlsは隠しファイル (「.」で始まるファイル) を表示しないが、-aオプションをつけるとこれらのファイルも表示する。% ls Applications Downloads Movies Pictures Desktop % ls -a . .history .. .ssh .DS_Store .vim .Trash .zshrc .cache Applications
3. プロセス
ファイルシステム上で「実行可能 (executable)」フラグ (x) がついているファイルは、
プログラムとして実行可能である。
通常、ここには機械語で書かれた命令列が記録されている:
% ls -l /bin/ls -rwxr-xr-x 1 root wheel 154352 Mar 21 15:13 /bin/ls
実行されたプログラムは、OS上で プロセス (process) として走り続ける。 UNIXはマルチタスクOSなので、通常は複数のプロセスが並列に実行される。
(実際の CPU は一度にひとつの プログラムしか実行できないため、各プロセスは高速に切り替えられ 少しずつ (10ms程度) 実行される (時分割処理)。 これらプロセス切り替え処理は、OS の カーネル (kernel) という部分がおこなう。)
- 実は我々がPC上で「アプリ」「コマンド (command)」と呼んでいるものは、ほとんどの場合、ひとつのプロセスである。
たいていのコマンドは数ミリ秒〜数秒しか生存しないため、UNIX は「湯水のようにプロセスを消費する」OSといえる。
% ls (lsが起動する) % /Applications/Safari.app/Contents/MacOS/Safari (Safariが起動する)
- 同様に Linuxサーバ上で動いている「サービス」も、 ほとんどの場合、ひとつのプロセスである。 ただしコマンドやアプリと違って、サービスのプロセス生存期間は通常長い (数日〜数年間)。 また、PC上のプロセス(アプリ)が入出力装置としてもっぱらGUIを使うのに対し、 サーバ上のプロセスは入出力装置としてネットワークを使う。
Claude などのエージェントがいろいろな操作ができるのは、 これらのアプリが内部でプロセスを起動し、各種コマンドを実行させているからである。
プロセスが入出力装置にアクセスするときは、ほとんどの場合 OS (カーネル) を介している。
3.1. UNIXプロセスの特徴
- UNIX 起動時には、最初のプロセスである "init" (プロセスID: 1) が実行される。
- 各プロセスは、別のプロセス (子プロセス) を起動することができる。 子プロセスがさらに別のプロセスを起動することもある。
- UNIX のプロセスは、全体として init から始まる木構造を形成している。
- ファイルと同じように、プロセスにも「所有者」が存在する。 あるプロセスの権限は、それを起動したユーザの権限と同じになる。
- 各プロセスには以下のものが付属している (後述):
- プロセスID (固有の識別番号、PID)
- ユーザID (プロセスの所有者)
- カレント・ディレクトリ
- 標準入力・標準出力 (後述)
- 環境変数 (後述)
- ...
(たいていのLinuxでは init のかわりに systemd、
macOSでは launchd が使われている。)
-
ps -x… 自分が所有するプロセス一覧を表示する。% ps -x PID TT STAT TIME COMMAND 1021 ?? Ss 0:14.87 /System/Library/ExtensionKit/…/Contents/MacOS/WallpaperVideoExtension 1110 ?? S 8:48.23 /usr/sbin/distnoted agent 1164 ?? S 23:39.51 /usr/sbin/cfprefsd agent … 78971 s002 R+ 0:00.00 ps -x
-
ps -ax… すべてのプロセス一覧を表示する。% ps -ax PID TT STAT TIME COMMAND 1 ?? Ss 50:47.04 /sbin/launchd 661 ?? Ss 25:50.01 /usr/libexec/logd 673 ?? Ss 16:53.34 /usr/libexec/configd 698 ?? Ss 0:58.62 /usr/sbin/syslogd … 79138 s002 R+ 0:00.00 ps -ax
プロセスとコンテナ
最近では、サーバ上では生身のプロセスを直接動かすのではなく、 Dockerなどの「コンテナ」を実行することが多い。
- コンテナの実体もプロセスである。
- ただしコンテナには、他のプロセスやサーバ環境の影響を受けないという利点がある。
- コンテナには、独自のファイルシステムやネットワークが付属している。
3.2. 標準入力と標準出力
現代のUNIXはさまざまな入出力装置をサポートしているが、 なかでもテキストの入出力をおこなう端末 (ターミナル, TTY) は もっとも基本的な装置であり、昔から多くの場面で利用されてきた。
端末は、コンピュータと接続して文字情報をやりとりする機器のことである。 かつてはタイプライタのような物理的な機械だったが、現在ではGUIにより 仮想的にエミュレートされるアプリになっている。
UNIX の各プロセスは、つねに 「標準入力 (stdin)」 「標準出力 (stdout)」 という 2つの架空の入出力装置が使用可能である。 「架空」というのは、これらが単一の装置ではなく、 さまざまな装置に切り替え可能だからである。 これらをまとめて標準入出力 (Standard I/O)と呼ぶ。
通常のPCにおける標準入出力
通常のPCでは、プロセスの標準入力・標準出力は、 どれも端末エミュレータアプリに接続されている。 これらはプロセスが画面に文字を表示したり、 キーボードから文字を入力するために使用する。
標準出力は、プロセスからの出力を表示するのに使われる:
% date Wed Aug 12 14:02:25 JST 2026
標準入力は、プロセスがユーザから入力するのに使われる:
% bc >>> 2+3 (注意: Linuxの場合、>>> は表示されない) 5
サーバにおける標準入出力
いっぽうサーバでは、普通は画面が接続されていないので、プロセスの標準出力は、 ログファイルか、ネットワークを介した AWS CloudWatch などのログ収集サービスに 接続されている。
3.3. 標準入出力の切り替え
シェルの機能 (後述) を使うと、 標準出力を端末ではなくファイルに切り替える (リダイレクトする) ことができる:
(まず、なんらかの作業用フォルダを作っておく) % cd % mkdir tmp % cd tmp % open . % date > output.txt (テキストファイル output.txt が生成される)
> の出力先として
うっかり存在するファイル名を指定してしまうと、
そのファイルは何の警告もなく上書きされ、
空のファイルにされる。
また、標準入力を端末ではなくファイルにリダイレクトすることも 可能である:
(あらかじめエディタでテキストファイル input.txt を作成しておく) % cat input.txt 2+3 % bc < input.txt 5
さらに、UNIX には「パイプ」という機能がある。 これを使うと 「あるプロセスの標準出力を、別のプロセスの標準入力に」 リダイレクトすることができる:
% date | bc
Parse error: bad expression
<stdin>:1
パイプによる複数プロセスの接続は UNIX (シェル) の特徴的な機能のひとつである。 これをうまく使うと、複雑な処理をいくつかのコマンドの組み合わせによって 実現することができる。
(ls コマンドの出力を検索し、さらにそれをソートして最初の10行を表示する) % ls -l | grep euske | sort | head -n10
<, >, | による
標準入力・標準出力の切り替えは、
プロセスを起動する瞬間にしか指定できない。
いちどプロセスが起動してしまうと、あとから
切り替えることはできないので注意。
- 以下のコマンドを実行し、ls の出力がテキストファイルになっていることを確認する。
% ls -l > output.txt
-
grepコマンドを使うと、 テキストファイル中で特定のパターンが含まれる行だけを表示できる:% grep .conf output.txt -rw-r--r-- 1 root wheel 1051 Mar 21 15:13 asl.conf -rw-r--r-- 1 root wheel 1935 Mar 21 15:13 autofs.conf -rw-r--r-- 1 root wheel 0 Mar 21 15:13 kern_loader.conf -r--r--r-- 1 root wheel 2451 Mar 21 15:13 man.conf …
- パイプを使って、上の操作を (途中のファイルを介さずに) 一気に実行できる:
% ls -l | grep .conf -rw-r--r-- 1 root wheel 1051 Mar 21 15:13 asl.conf -rw-r--r-- 1 root wheel 1935 Mar 21 15:13 autofs.conf -rw-r--r-- 1 root wheel 0 Mar 21 15:13 kern_loader.conf -r--r--r-- 1 root wheel 2451 Mar 21 15:13 man.conf …
第1部のおさらい
- 以下の穴埋め問題の中には透明なテキストが書かれており、コピー・ペーストすれば正解が見れるようになっている:
- Linux および macOS は、どちらも UNIX系の OSであり、共通点がある。
- UNIXでは、ディスク上の各ファイルの位置はパス名によって指定できる。
- プロセスはUNIXにおける処理の基本単位であり、PC上のアプリやサーバ上の Node, Spring などもその一種である。
- 各プロセスには文字情報の入出力をおこなう「標準入力」「標準出力」が付属している。
- 標準入出力は、端末だけでなくファイルやネットワークなどに切り替え可能である。
- ターミナルを開いて
ls | sortを実行したとき...-
lsの標準入力および標準出力はそれぞれ何か? -
sortの標準入力および標準出力はそれぞれ何か?
-
- 以下の用語の違いを説明してみよう:
- プログラム
- プロセス
- コマンド
第2部 - シェルの使い方
4. シェルの動作
UNIX を使ううえで中心的な役割を果たしているのが シェル (shell) と呼ばれるプログラム (アプリ) である。
シェルの基本動作:
- 端末 (標準入力) からコマンド文字列が入力されるのを待つ。
例:ls -l /usr/bin - コマンド文字列を解析し、引数のリストを作成する。
例:(ls, -l, /usr/bin) - 実行するプログラムを、新しいプロセス (子プロセス) として起動する。
例:ls
子プロセスは端末の標準入力・標準出力を使って、ユーザと対話する。 - 子プロセスが終了するまで待機する。
- 1. に戻る。
4.1. シェルとプロセス制御
UNIXでは複数のプロセスが並列動作するので、
実はシェルとその子プロセス (lsなど) は同時並列的に動いている。
ただしシェルと子プロセスは同じ端末を共有しているため、
シェルは子プロセスが終了するまで、端末を邪魔しないように「待っている」。
ユーザからみると、これはコマンドが一時的に端末を「乗っ取った」ように見える。
% ls -l /usr/bin (子プロセスが起動する)
(lsが端末を乗っ取る)
total 172688
-rwxr-xr-x 1 root wheel 171888 Jun 25 11:29 AssetCacheLocatorUtil
-rwxr-xr-x 1 root wheel 227664 Jun 25 11:29 AssetCacheManagerUtil
...
-rwxr-xr-x 1 root wheel 3314 Jun 25 11:29 znew
-rwxr-xr-x 1 root wheel 170320 Jun 25 11:29 zprint
(lsが終了する)
(シェルが再開する)
%
これは、画面全体を占拠するようなコマンド (たとえば、claudeやvim) のようなものでも
同じである:
% claude (子プロセスが起動する)
(claudeが端末を乗っ取る)
...
(claudeが終了する)
(シェルが再開する)
%
端末を乗っ取っているプロセスは、Ctrl + C で強制終了させることができる。 (できない場合もある)
% find /
(findが端末を乗っ取る)
/
/home
/usr
/usr/bin
/usr/bin/uux
/usr/bin/cpan
...
Ctrl + C (findが強制終了する)
^C
(シェルが再開する)
%
子プロセスの終了を「待たない」ようにすることも可能である。
コマンドの末尾に & をつけると、シェルは子プロセスの終了を待たずに続行する。
この場合、シェルの出力と子プロセスと出力が混ざってしまう:
% ls -l / & [1] 54383 % total 10 (シェルのプロンプトとlsの出力が混じって表示される) drwxrwxr-x 36 root admin 1152 Aug 12 18:18 Applications/ drwxr-xr-x 68 root wheel 2176 Aug 10 18:45 Library/ drwxr-xr-x@ 10 root wheel 320 Aug 2 08:15 System/ drwxr-xr-x 5 root admin 160 Aug 10 18:45 Users/ drwxr-xr-x 3 root wheel 96 Aug 10 19:04 Volumes/ ... (lsが終了する)
シェルからシェルを起動する
UNIX的にみれば、シェルもまたひとつの子プロセスにすぎず、特別な存在ではない。 シェルからさらに別のシェルを起動することも可能である。
(最初のシェルが起動している)
% zsh
(シェルが子プロセスとして起動する)
% zsh
(さらにシェルが孫プロセスとして起動する)
% exit
(孫プロセスのzshが終了する)
% exit
(子プロセスのzshが終了する)
%
ちなみに UNIXのシェルは複数種存在し、 それぞれのシェルで、キーの使い方やシェルスクリプト (後述) の挙動が若干異なる。
- macOSでは zshが標準となっており、ターミナルアプリを開くと zsh が起動する。
- いっぽう Linuxでは bashが標準である。
4.2. コマンド引数の展開
先に述べたように、シェルの主な機能はコマンド文字列を解析し、プロセスを起動することである。 たとえば:
% ls -l /etcという行は、以下の行と同じである:
% /bin/ls -l /etcさらにこれは、プログラミング的には、関数呼び出しの一種と考えることができる:
ls("-l", "/etc")
この行が入力されたとき、シェルは以下のことをおこなう:
-
/bin/lsというプログラムを子プロセスとして起動する。 - このとき、各引数を文字列としてプロセスに渡す:
-
ls… 0番目の引数 (コマンド名あるいはプログラムのパス名) -
-l… 1番目の引数 -
/etc… 2番目の引数
-
- 子プロセスが終了するまで待つ。
ここで注意したいのは、引数である
「-l」や「/etc」をどのように利用するかは
各コマンド次第ということである。
すべてのコマンドにおいて
「-l」がオプションであると決まっているわけではないし
「/etc」がパス名として解釈されるとも限らない。
この意味で、UNIX の使い方を学ぶことは
API の使い方を学ぶのに似ている。
個々の関数・メソッドの引数がどのような意味をもつのか学習し、
それらを組み合わせて必要な処理を実現する。
-l」という名前のディレクトリがあったとすると、
そのままでは ls のパス名として指定できない。
だが ls ./-l というトリックを使えば指定できる。
たとえば echo というコマンドは、シェルから与えらえた引数をただそのまま
表示するだけのコマンドである:
% echo abc 1234 abc 1234 % echo -l /etc -l /etc
一般にシェルの引数は「 」(スペース) で
区切られるが、"〜" で囲むことにより
スペースが入っている文字列を「ひとつの引数」として認識させることができる:
% ls -l /etc … % ls "-l /etc" ls: invalid option -- ' ' % "ls -l" /etc ls -l: command not found
以下のコマンドの引数を 0番目からすべて挙げてみよう:
-
ls /etc /bin -
ls "/etc /bin" -
ls "/etc" "/bin" -
ls "" "/bin" -
"ls /etc /bin" -
ls /etc /bin > output.txt
実は、
> output.txt のような部分は
コマンドの引数ではない。
リダイレクト指定はプロセスが起動する前にシェルによって処理され、
コマンドには渡らない。
(つまり、シェルから起動されたプロセスは自分の標準入出力が実際はどこに接続されているのか知らない。)
4.3. ファイル名(パス名)の展開
シェルでは、ディレクトリ上に複数のファイルがあるとき、 それらのファイル名を複数の引数として展開する機能がある (ファイル名展開, pathname expansion)。
たとえば、カレント・ディレクトリ内に
a, bb, ccc
というファイルがあるとき…
(ファイルを準備) % echo > a % echo > bb % echo > ccc % ls a bb ccc以下の
* (ワイルドカード) を指定すると
% cat *以下の引数を与えたのと同じである:
% cat a bb ccc
ワイルドカードには、パターンを指定することもできる。
たとえば /etc 内に多くの「.conf」で終わるファイルがあるとき…
% cd /etc % ls -l | grep .conf -rw-r--r-- 1 root wheel 1051 Mar 21 15:13 asl.conf -rw-r--r-- 1 root wheel 1935 Mar 21 15:13 autofs.conf …以下のパターンは
% cat *.conf以下のような引数に展開される:
% cat asl.conf autofs.conf …
繰り返すが、ここで展開されたパス名をどのように扱うかは 各コマンド次第である。 シェルがファイル名展開したからといって、 各コマンドがこれらをファイル名として扱う保証はない。
ここで、echo コマンドは
シェルが各引数をどのように展開したかを表示するのに使える:
% echo /etc/*.conf /etc/asl.conf /etc/autofs.conf …
/etc 以下に次のようなファイルがあるとする:
-
a.conf -
b.conf -
issue
/etc であるとして、
以下のコマンドラインの出力を予想してみよう:
-
echo * -
echo *.conf -
echo *.conf /etc/* -
echo /etc/issue* -
echo "*"
とある空のディレクトリ内で、 以下のコマンド列を実行すると何が表示されるか予想してみよう:
% echo > hello % echo > world % echo *
5. 環境変数
UNIX では、各プロセスに環境変数 (environment variable) というものが付属している。 これは文字列型の変数で、プログラムの変数と同様に、好きな数だけ作成することができ、 いろいろな設定を保存しておくのに使われる。 慣例により、環境変数の名前には大文字が使われることが多い (実際には、英数字であればなんでもよい)。
- コマンドライン引数: ls -l
- カレント・ディレクトリ: /
- 標準入力・標準出力: 端末
- 環境変数: HOME
- コマンドライン引数: cat motd
- カレント・ディレクトリ: /etc
- 標準入力・標準出力: 端末
- 環境変数: PATH
- コマンドライン引数: date
- カレント・ディレクトリ: /Users/euske
- 標準入力・標準出力: output.txt
- 環境変数: HOME, PATH
現在のシェルに付属している環境変数一覧を見るためには envコマンドを使う:
% env SHLVL=3 HOME=/root OLDPWD=/root PAGER=less …
順序がばらばらで見にくいので sortで並べ変えてみる:
% env | sort HOME=/root OLDPWD=/root PAGER=less …
各プロセスに付属している環境変数の値を見るには、以下のコマンドを実行する:
% ps -axeww
5.1. 環境変数を使う
シェルでは、コマンドライン引数に含まれる環境変数の値が展開される。
たとえば環境変数 USER に euske という値が入っている場合、
% ls /Users/${USER}/foo
は、以下のように展開される:
% ls /Users/euske/foo
echoコマンドは、環境変数の内容を確認するためによく使われる:
% echo ${USER}
euske
未定義の環境変数を展開してもエラーにはならず、空文字列として扱われる:
% echo /Users/${USSR}/foo
/Users//foo
なお、${〜}の中カッコは省略可能である:
% echo $USER euske
以下の環境変数に:
-
USER=jon -
FILE=athan
という文字列が入っていると想定して、以下のコマンドの出力を予想してみよう:
-
echo /home/${USER}/${FILE} -
echo $USER$FILE -
echo "$USER"ny -
echo $USERny
5.2. 環境変数を設定する
各プロセスの環境変数は、一般にそのプロセスの起動時にだけ設定できる。
プロセスの起動時に環境変数を設定するには、実行したいコマンド引数の前に
「変数名=値」のような形式を追加する。
たとえば date コマンドは、
環境変数 TZ の値によって異なる時間帯の時刻を返す:
% date Wed Aug 12 14:03:35 JST 2026 % TZ=UTC date Wed Aug 12 05:03:42 UTC 2026 % TZ=America/New_York date Wed Aug 12 01:03:57 EDT 2026
また、親プロセスが持っている環境変数はすべて子プロセスに継承される。 そのため親プロセスに環境変数を設定しておけば、すべての子プロセスで共通の値が使える:
% echo $XYZ (環境変数XYZは未定義) % XYZ=abc123 zsh (環境変数XYZにabc123を設定して zshを起動) % echo $XYZ (環境変数XYZに値が入っている) abc123
例外はシェルで、シェルの中ではいつでも環境変数を作成・変更できる。
実際には、環境変数はより一般的なシェル変数 (shell variable) の一部として扱われる。
シェル変数の一覧 (環境変数も含む) を表示するには
setコマンドを使う:
% set BASH=/bin/bash COLUMNS=100 DISPLAY=:1 EDITOR=vi …
シェル変数は、ただ
「変数名=値」のように書けば
値を設定できる。
% XYZ=abc123 (シェル変数XYZにabc123を設定) % echo $XYZ (シェル変数XYZの値を表示する)
ただし、すべてのシェル変数が環境変数として扱われるわけではないことに注意。 環境変数として扱われるのは、シェル変数のうち 「export属性」をもつものだけである。 Export属性をもったシェル変数は、何も指定しなくても 以後シェルから起動したすべてのプロセスに環境変数として渡される:
% XYZ=abc123 (シェル変数XYZにabc123を設定) % echo $XYZ (シェル変数XYZの値を表示する) abc123 % env (XYZは環境変数ではない) … % export XYZ (XYZにexport属性をつける) % env (XYZが環境変数として渡されている) … XYZ=abc123 …
.zshrcなど) に以下のように書いておくと、
シェルの起動時につねに決まった値を設定することができる (詳細は割愛する):
# .zshrc export XYZ=abc123 export TZ=UTC
5.3. 重要な環境変数: PATHとHOME
UNIX の環境変数のなかでも PATH と HOME は
とくに重要である。
環境変数 PATH
通常、UNIX シェルでは第0引数としてコマンド (プログラム) のパス名を指定する:
% /bin/ls -l /etcしかし実際には以下のように書いても動く:
% ls -l /etcこれを可能にしているのは環境変数
PATH のためである。
環境変数 PATH の中身を見てみると、
コロン (:) で区切られたパス名 (ディレクトリ名) の一覧が含まれているのがわかる:
% echo $PATH /usr/local/bin:/usr/bin:/bin
これは「あるコマンドが実行されたとき、
/usr/local/bin/コマンド名、
/usr/bin/コマンド名、
/bin/コマンド名
のいずれかのプログラムを実行せよ」ということを表している。
PATH にはこのようなコマンドの「検索順序」が記録されている。
その証拠に、PATH をおかしな値にすると動かない:
% PATH=xxx % ls ls: command not found % /bin/ls …
なお、PATH はよくシステムのデフォルト値をカスタマイズして
使うことが多い。PATH に独自のディレクトリを追加するには、以下のようにする:
PATH=$PATH:/Users/euske/bin (/Users/euske/bin もコマンド検索順序に追加する)
環境変数 HOME
UNIX では、各ユーザのホームディレクトリは
/Users/ユーザ名
(Linuxの場合は /home/ユーザ名) とされているが、
これはただの慣例であり、実際にはどこであってもかまわない。
環境変数 HOME は、そのユーザの所有する
ホームディレクトリのパス名を指定する。
これは起動時には通常そのユーザのデフォルト値が設定されているが、
この値を変更することで、どんなディレクトリでもホームディレクトリとして
使用することができる:
% echo $HOME (環境変数HOMEの内容を表示する) /Users/euske % cd (ホームディレクトリに移動) % pwd (カレント・ディレクトリを表示) /Users/euske % HOME=/etc (環境変数HOMEを変更する - ホームディレクトリが変更される) % cd (ホームディレクトリに移動) % pwd (カレント・ディレクトリを表示) /etc
また、シェルのコマンドライン上では ~ が
自分のホームディレクトリに展開されるが、
この値も実際には環境変数 HOME を展開しているだけである:
% echo $HOME/work /Users/euske/work % echo ~/work /Users/euske/work
UNIX では、各ユーザのデフォルトのホームディレクトリ (やシェル) は
/etc/passwd というテキストファイル内に記載されている。
UNIX におけるホームディレクトリとは、つまるところ:
- そのユーザが所有している
- 環境変数
HOMEが、そのパス名に設定されている
第3部 - よく使うコマンド一覧
-
ls(LiSt) - 指定したディレクトリに含まれるファイル一覧を表示する。
% ls … (カレント・ディレクトリのファイル一覧を表示) % ls -l /etc … (ディレクトリ /etc のファイル一覧を表示) % ls -a … (カレント・ディレクトリの隠しファイルを含めた一覧を表示)
-
cd(Change Directory) - カレント・ディレクトリを変更する。
% cd /etc (カレント・ディレクトリを /etc に変更) % cd (カレント・ディレクトリを自分のホームディレクトリに変更)
-
pwd(Print Working Directory) - カレント・ディレクトリのパス名を表示する。
% pwd (現在のパス名を表示)
-
cat(conCATenate) ・less - ファイルの内容を表示する。
もともと
catは 複数のファイルを連結 (conCATenate) するためのコマンドだった。% less /etc/services (/etc/services の内容を表示) % cat /etc/hosts /etc/services (/etc/hosts の内容と /etc/services の内容を連結して表示)
なお、lessコマンド内では以下のキー操作が使える:
- Space … 次のページへ進む。
- b … 前のページへ戻る。
- q … 終了する。
- j … 1行下へ (↓)。
- k … 1行上へ (↑)。
- / … 文字列検索。
-
mkdir(MaKe DIRectory) - 空のディレクトリを新規作成する。
% mkdir foo (カレント・ディレクト下に foo を作成)
-
cp(CoPy) - 指定したファイルを宛先パス名に複製する。
% cp a.txt b.txt (a.txt を新しい b.txt という名前で複製する) % cp a.txt dest/ (a.txt を dest/ ディレクトリ内に同じ名前で複製する) % cp a.txt b.txt c.txt dest/ (a.txt, b.txt, c.txt の各ファイルを dest/ 内に同じ名前で複製する) % cp *.txt dest/ (〜.txt で終わるすべてのファイルを dest/ 内に同じ名前で複製する)
cpで複製できるのは、通常はファイルのみである。 あるディレクトリ内のファイルを (ディレクトリごと) 複製したい場合には-rオプションを使う:% cp -r foo dest/ (foo ディレクトリ内とその中のファイルをすべて dest/ 内に複製する)
注意: UNIX は無愛想な OS なので、 コピー先としてうっかり存在するファイル名を指定してしまうと、 そのファイルは何の警告もなく上書きされる。 これを防ぐためには-iオプションを使う:% cp -i a.txt b.txt (a.txt を新しい b.txt という名前で複製するが、 すでに同名のファイルがある場合は確認する)
-
mv(MoVe) - 指定したファイルを宛先パス名に変更あるいは移動する。
% mv a.txt b.txt (a.txt を新しい b.txt という名前に変更する) % mv a.txt dest/ (a.txt を dest/ ディレクトリ内に移動する) % mv a.txt b.txt c.txt dest/ (a.txt, b.txt, c.txt の各ファイルを dest/ 内に移動する) % mv *.txt dest/ (〜.txt で終わるすべてのファイルを dest/ 内に移動する)
注意: UNIX は無愛想な OS なので、 移動先としてうっかり存在するファイル名を指定してしまうと、 そのファイルは何の警告もなく上書きされる。 これを防ぐためには-iオプションを使う:% mv -i a.txt b.txt (a.txt を新しい b.txt という名前に変更するが、 すでに同名のファイルがある場合は確認する)
-
rm(ReMove) - 指定したファイルを削除する。
% rm a.txt (ファイル a.txt を削除する) % rm *.txt (〜.txt で終わるすべてのファイルを削除する)
rmで削除できるのは、通常はファイルのみである。 あるディレクトリ内のファイルを (ディレクトリごと) 削除したい場合には-rオプションを使う:% rm -r dest/ (dest/ ディレクトリ内とその中のファイルをすべて削除する)
注意: UNIX は無愛想な OS なので、rmコマンドは削除に対して何も確認しない (ディレクトリまるごとの削除でも同じ)。 これは非常に危険なので、削除の際には、必ずファイルをひとつずつ確認する-iオプションを使うのがおすすめである:% rm -i *.txt (〜.txt で終わる各ファイルを yes/no で確認しながら削除する)
-
du(DiskUse) - 指定したディレクトリのファイル使用量を表示する。
% du ~ (ホームディレクトリの使用量を各ディレクトリごとに表示する) % du -sh . (カレント・ディレクトリの総使用量のみを表示する)
-
grep(g/re/p) - 指定したファイルあるいは標準入力から、特定の文字列を検索する。
% grep yusuke hello.txt (文字列 yusuke が含まれる hello.txt 内の行を表示する) % ls | grep 2026 (ls の出力から 2026 という文字列が含まれる行を表示する)
-
sort - 指定したファイルあるいは標準入力の行をアルファベット順にソートして表示する。
デフォルトでは昇順でソートするが、
-rオプションをつけると降順でソートする。% sort list.txt (list.txtの各行をアルファベット順にソートして表示する) % ls date-*.txt | sort -r (date-*.txt というパターンのファイル名を降順にソートして表示する)
-
head - 指定したファイルあるいは標準入力の行の最初の数行 (デフォルトは10行) だけを表示する。
% head list.txt (list.txtの最初の10行だけを表示する) % ls date-*.txt | sort -r | head -n5 (date-*.txt というパターンのファイル名を降順にソートし、その上位5件を表示する)
-
open(macOS限定) - 指定したパス名のファイル・フォルダをFinder上で開く。
% open . (カレント・ディレクトリの内容をFinderで開く)
パス名の指定方法に注意
cp, mv, rm などのコマンドでは
「-」で始まる引数はオプションとみなされる。
もし実際に "-i" というファイルを複製したい場合、
cp -i a.txt などとやってもうまくいかない:
% cp -i a.txt cp: missing destination file operand after 'a' (エラーが出て実行できない)
このような場合には、2つの方法がある:
- 引数が「
-」で始まらなけれさえすればよいので、-iがカレント・ディレクトリにあることを利用して、 以下のようにする:% cp ./-i a.txt (カレント・ディレクトリの -i というファイルがコピーされる)
- 多くの UNIX 標準コマンドは、引数に "
--" が表れると、 それ以後の引数をオプションとして解釈することをやめ、 ファイル名として解釈するように実装されている。 このことを利用して:% cp -- -i a.txt (-i はオプションでなく実際のファイル名として解釈される)

