非エンジニアのための
UNIX/Linux入門

Yusuke Shinyama, Aug. 2026

概要: この記事では、 Claude Codeなど、CLI (コマンドライン)ベースのAIエージェントを使う時に 知っていると便利な UNIX/Linux に関する基礎知識を紹介する。 最終的な目標は各コマンドが何をやっているかおおまかに把握できることである。 記事は3部に分かれており、 1. UNIXの基本、 2. シェルの使い方、 および 3. よく使うコマンド一覧 となっている。

なお、ここでは macOS ターミナルを使うことを想定している。

目次

  1. 基本的な概念
  2. ファイルシステム
  3. プロセス
  4. シェル
  5. 環境変数

第1部 - UNIXの基本

1. 基本的な概念

1.1. オペレーティングシステム (OS) とは?

オペレーティング システム (OS) アプリ アプリ アプリ

1.2. UNIXとは?

UNIX v7 MS-DOS Windows Linux FreeBSD NetBSD OpenBSD Solaris HP-UX macOS 参考 模倣

1.3. Linuxとは?

Windows や macOS の場合、OSの核となる部分 (カーネル) および付属ツールなどをまとめて「OS」と呼んでいるが、Linux の場合は意味が異なる。 本来 "Linux" といえばカーネルのみをさしており 「Linuxだけ」で OSとしては使うことはない。 Linux カーネルにさまざまな部品 (各種デフォルトのアプリなど) を追加して OS として 使えるようにしたものが「ディストリビューション」である。 そのため同じ「Linux」でも、ディストリビューションが違うとまるで別のOSのように見えることもある。

2. ファイルシステム

ファイル1 ファイル2 010010111010001... 11110111011100111111...

2.1. フォルダ・ディレクトリとは

ファイルの数が多くなると管理が大変になるので、 フォルダ (あるいはディレクトリとも呼ばれる) を使って整理する。

UNIXでは、すべてのファイル・フォルダはひとつの巨大な木構造 (tree) をなしている。

ディスク A B C B E C K H K X /

2.2. パス名とは

ファイルシステム中に同じ名前のファイル・フォルダが複数存在している場合、 ファイルの正確な位置は、パス名 (path) で表す。 パス名は、ファイルシステム上におけるファイルの「住所」である。

演習 1. パス名の練習
  1. ディレクトリ X のパス名を書け。
  2. ファイル H のパス名を書け。
  3. ファイル C のパス名を 2つ書け。

UNIXにおける「お約束」パス名

UNIX では、いくつかのパス名は 「お約束」として決められている。

演習 2. やってみよう
以後の例では、コマンド入力時に行頭に表示されるプロンプトを macOS標準の % で表している。 Linuxの場合はプロンプトは通常 $ なので、適宜読みかえてほしい。

2.3. カレント・ディレクトリ (カレント・フォルダ) とは

A B C B E C K H K X カレント・ディレクトリ

2.4. 絶対パス名と相対パス名

実は「パス名」と呼ばれているものには 2つの種類がある。 上で説明した「パス名」は「絶対パス名」のことであった。

A B C B E C K H K X カレント・ディレクトリ 目的のディレクトリ

つまり、上のディレクトリ X の位置は、次の2通りで表せる:

2.5. 相対パス名の表し方

演習 3. 相対パスの練習

カレント・ディレクトリが E のとき…

A B C B E C K H K X カレント・ディレクトリ
  1. ディレクトリ A への相対パス名は?
  2. ファイル H への相対パス名は?
  3. ファイル K への相対パス名は? (2つある)
演習 4. やってみよう

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) という部分がおこなう。)

Slack VSCode Claude
PC上のプロセス(アプリ)
Node nginx Spring (Java)
Linuxサーバ上のプロセス

Claude などのエージェントがいろいろな操作ができるのは、 これらのアプリが内部でプロセスを起動し、各種コマンドを実行させているからである。

Claudeが内部でプロセスを起動している様子

プロセスが入出力装置にアクセスするときは、ほとんどの場合 OS (カーネル) を介している。

OS プロセス ディスク ネットワーク 画面

3.1. UNIXプロセスの特徴

(たいていのLinuxでは init のかわりに systemd、 macOSでは launchd が使われている。)

演習 5. やってみよう

プロセスとコンテナ

最近では、サーバ上では生身のプロセスを直接動かすのではなく、 Dockerなどの「コンテナ」を実行することが多い。

カーネル コンテナ コンテナ プロセス プロセス プロセス

3.2. 標準入力と標準出力

現代のUNIXはさまざまな入出力装置をサポートしているが、 なかでもテキストの入出力をおこなう端末 (ターミナル, TTY) は もっとも基本的な装置であり、昔から多くの場面で利用されてきた。

端末は、コンピュータと接続して文字情報をやりとりする機器のことである。 かつてはタイプライタのような物理的な機械だったが、現在ではGUIにより 仮想的にエミュレートされるアプリになっている。

DEC VT100 端末   macOS ターミナルアプリのアイコン
物理的な端末と、現代の端末エミュレータ

UNIX の各プロセスは、つねに 「標準入力 (stdin)」 「標準出力 (stdout)」 という 2つの架空の入出力装置が使用可能である。 「架空」というのは、これらが単一の装置ではなく、 さまざまな装置に切り替え可能だからである。 これらをまとめて標準入出力 (Standard I/O)と呼ぶ。

標準入力・標準出力に加えて 「標準エラー出力 (stderr)」 というもの使えるが、これはエラー出力のみを別のデバイスに振り分けたいときに使う。 多くの場合、これは標準出力と同じなのでここでは割愛する。

通常のPCにおける標準入出力

通常のPCでは、プロセスの標準入力・標準出力は、 どれも端末エミュレータアプリに接続されている。 これらはプロセスが画面に文字を表示したり、 キーボードから文字を入力するために使用する。

標準出力は、プロセスからの出力を表示するのに使われる:

% date
Wed Aug 12 14:02:25 JST 2026

標準入力は、プロセスがユーザから入力するのに使われる:

% bc
>>> 2+3  (注意: Linuxの場合、>>> は表示されない)
5
プロセス 標準入力 標準出力 端末 端末

サーバにおける標準入出力

いっぽうサーバでは、普通は画面が接続されていないので、プロセスの標準出力は、 ログファイルか、ネットワークを介した AWS CloudWatch などのログ収集サービスに 接続されている。

OS プロセス ディスク ネットワーク 端末 標準出力
PC上のプロセス
OS プロセス ディスク ネットワーク (syslog等) 端末 標準出力
サーバ上のプロセス

3.3. 標準入出力の切り替え

シェルの機能 (後述) を使うと、 標準出力を端末ではなくファイルに切り替える (リダイレクトする) ことができる:

(まず、なんらかの作業用フォルダを作っておく)
% cd
% mkdir tmp
% cd tmp
% open .

% date > output.txt
(テキストファイル output.txt が生成される)
date 標準入力 標準出力 端末 output.txt
注意: UNIX は無愛想な OS なので、 > の出力先として うっかり存在するファイル名を指定してしまうと、 そのファイルは何の警告もなく上書きされ、 空のファイルにされる。

また、標準入力を端末ではなくファイルにリダイレクトすることも 可能である:

(あらかじめエディタでテキストファイル input.txt を作成しておく)
% cat input.txt
2+3
% bc < input.txt
5
bc 標準入力 標準出力 input.txt 端末

さらに、UNIX には「パイプ」という機能がある。 これを使うと 「あるプロセスの標準出力を、別のプロセスの標準入力に」 リダイレクトすることができる:

% date | bc

Parse error: bad expression
    <stdin>:1
date 標準入力 標準出力 端末 パイプ bc 標準入力 標準出力 端末

パイプによる複数プロセスの接続は UNIX (シェル) の特徴的な機能のひとつである。 これをうまく使うと、複雑な処理をいくつかのコマンドの組み合わせによって 実現することができる。

(ls コマンドの出力を検索し、さらにそれをソートして最初の10行を表示する)
% ls -l | grep euske | sort | head -n10
注意: <, >, | による 標準入力・標準出力の切り替えは、 プロセスを起動する瞬間にしか指定できない。 いちどプロセスが起動してしまうと、あとから 切り替えることはできないので注意。
演習 6. やってみよう

第1部のおさらい

  1. 以下の穴埋め問題の中には透明なテキストが書かれており、コピー・ペーストすれば正解が見れるようになっている:
    • Linux および macOS は、どちらも UNIX系の OSであり、共通点がある。
    • UNIXでは、ディスク上の各ファイルの位置はパス名によって指定できる。
    • プロセスはUNIXにおける処理の基本単位であり、PC上のアプリやサーバ上の Node, Spring などもその一種である。
    • 各プロセスには文字情報の入出力をおこなう「標準入力」「標準出力」が付属している。
    • 標準入出力は、端末だけでなくファイルネットワークなどに切り替え可能である。
  2. ターミナルを開いて ls | sort を実行したとき...
    • ls の標準入力および標準出力はそれぞれ何か?
    • sort の標準入力および標準出力はそれぞれ何か?
  3. 以下の用語の違いを説明してみよう:
    • プログラム
    • プロセス
    • コマンド

第2部 - シェルの使い方

4. シェルの動作

UNIX を使ううえで中心的な役割を果たしているのが シェル (shell) と呼ばれるプログラム (アプリ) である。

シェルの基本動作:

  1. 端末 (標準入力) からコマンド文字列が入力されるのを待つ。
    例: ls -l /usr/bin
  2. コマンド文字列を解析し、引数のリストを作成する。
    例: (ls, -l, /usr/bin)
  3. 実行するプログラムを、新しいプロセス (子プロセス) として起動する。
    例: ls
    子プロセスは端末の標準入力・標準出力を使って、ユーザと対話する。
  4. 子プロセスが終了するまで待機する。
  5. 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が終了する)
(シェルが再開する)
%

これは、画面全体を占拠するようなコマンド (たとえば、claudevim) のようなものでも 同じである:

% 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が終了する)
%
zsh zsh zsh 起動 起動 親プロセス (最初のシェル) 子プロセス 孫プロセス

ちなみに UNIXのシェルは複数種存在し、 それぞれのシェルで、キーの使い方やシェルスクリプト (後述) の挙動が若干異なる。

4.2. コマンド引数の展開

先に述べたように、シェルの主な機能はコマンド文字列を解析し、プロセスを起動することである。 たとえば:

% ls -l /etc
という行は、以下の行と同じである:
% /bin/ls -l /etc
さらにこれは、プログラミング的には、関数呼び出しの一種と考えることができる:
ls("-l", "/etc")

この行が入力されたとき、シェルは以下のことをおこなう:

  1. /bin/ls というプログラムを子プロセスとして起動する。
  2. このとき、各引数を文字列としてプロセスに渡す:
    • ls … 0番目の引数 (コマンド名あるいはプログラムのパス名)
    • -l … 1番目の引数
    • /etc … 2番目の引数
  3. 子プロセスが終了するまで待つ。

ここで注意したいのは、引数である 「-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
演習 7. シェルの引数展開

以下のコマンドの引数を 0番目からすべて挙げてみよう:

  1. ls /etc /bin
  2. ls "/etc /bin"
  3. ls "/etc" "/bin"
  4. ls "" "/bin"
  5. "ls /etc /bin"
  6. 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 …
演習 8. ファイル名展開

/etc 以下に次のようなファイルがあるとする:

カレント・ディレクトリも /etc であるとして、 以下のコマンドラインの出力を予想してみよう:
  1. echo *
  2. echo *.conf
  3. echo *.conf /etc/*
  4. echo /etc/issue*
  5. echo "*"
演習 9. ファイル名展開を予測する

とある空のディレクトリ内で、 以下のコマンド列を実行すると何が表示されるか予想してみよう:

% echo > hello
% echo > world
% echo *

5. 環境変数

UNIX では、各プロセスに環境変数 (environment variable) というものが付属している。 これは文字列型の変数で、プログラムの変数と同様に、好きな数だけ作成することができ、 いろいろな設定を保存しておくのに使われる。 慣例により、環境変数の名前には大文字が使われることが多い (実際には、英数字であればなんでもよい)。

プロセス123
  • コマンドライン引数: ls -l
  • カレント・ディレクトリ: /
  • 標準入力・標準出力: 端末
  • 環境変数: HOME
プロセス456
  • コマンドライン引数: cat motd
  • カレント・ディレクトリ: /etc
  • 標準入力・標準出力: 端末
  • 環境変数: PATH
プロセス789
  • コマンドライン引数: 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
…
演習 10. やってみよう

各プロセスに付属している環境変数の値を見るには、以下のコマンドを実行する:

% ps -axeww
注意: 環境変数は各プロセスごとに独立している。 あるプロセスの環境変数を別のプロセスの環境変数にすることはできない。 ただし、親プロセスの環境変数は、子プロセスに引きつがれるため、 最初に共通の環境変数を設定しておけば、以後すべての子プロセスで 共通の設定を利用することができる。
親プロセス 子プロセス 子プロセス USER=euske USER=euske DATABASE=alpha USER=euske DATABASE=beta

5.1. 環境変数を使う

シェルでは、コマンドライン引数に含まれる環境変数の値が展開される。 たとえば環境変数 USEReuske という値が入っている場合、

% ls /Users/${USER}/foo
は、以下のように展開される:
% ls /Users/euske/foo

echoコマンドは、環境変数の内容を確認するためによく使われる:

% echo ${USER}
euske

未定義の環境変数を展開してもエラーにはならず、空文字列として扱われる:

% echo /Users/${USSR}/foo
/Users//foo

なお、${〜}の中カッコは省略可能である:

% echo $USER
euske
演習 11. 環境変数の展開

以下の環境変数に:

という文字列が入っていると想定して、以下のコマンドの出力を予想してみよう:

  1. echo /home/${USER}/${FILE}
  2. echo $USER$FILE
  3. echo "$USER"ny
  4. 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 の環境変数のなかでも PATHHOME は とくに重要である。

環境変数 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 におけるホームディレクトリとは、つまるところ:

だけのものなのである。

第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つの方法がある:

  1. 引数が「-」で始まらなけれさえすればよいので、 -i がカレント・ディレクトリにあることを利用して、 以下のようにする:
    % cp ./-i a.txt
    (カレント・ディレクトリの -i というファイルがコピーされる)
    
  2. 多くの UNIX 標準コマンドは、引数に "--" が表れると、 それ以後の引数をオプションとして解釈することをやめ、 ファイル名として解釈するように実装されている。 このことを利用して:
    % cp -- -i a.txt
    (-i はオプションでなく実際のファイル名として解釈される)
    

Yusuke Shinyama