この教科書では、UNIXオペレーティングシステムについての基本的な概念と操作方法について説明します。UNIXは、多くのプログラマーやエンジニアによって広く使用されているオペレーティングシステムであり、特にコマンドラインでの作業に長けています。この教科書を通して、あなたはUNIXの基本的な操作方法を学び、UNIXを使用してタスクを実行するためのスキルを身につけることができます。
『UNIX/Linux入門』もあります。
UNIXは、オペレーティングシステムの一種で、多くのコンピューターシステムで広く使用されています。UNIXは、マルチタスク、マルチユーザーのシステムであり、ユーザーが同時に複数のタスクを実行できることが特徴的です。
UNIXは、プログラマや研究者などの技術者たちが開発したもので、初期のバージョンは主に大学や研究所で使用されていました。その後、商用化され、多くの企業がUNIXを採用し、現在では多くのサーバーやスーパーコンピューターに使用されています。
UNIXの特徴の1つは、コマンドラインインタフェースを使用することです。コマンドラインインタフェースは、テキストベースのコマンドを使用してシステムを操作する方法であり、UNIXの強力な機能の1つです。また、UNIXは、システムを構成するための標準的なツールセットを提供しており、システムの管理や開発が簡単になります。
UNIXは、ネットワーク機能を強力にサポートしており、インターネットの成長に大きく貢献しています。また、UNIXは、オープンソースソフトウェアであるため、多くのユーザーがシステムを改良し、新しいアプリケーションを開発することができます。
UNIXは、多くのバリエーションが存在しており、それぞれ異なる目的や環境に最適化されています。代表的なUNIXのバリエーションには、FreeBSD、OpenBSD、Solarisなどがあります。
UNIXは、高度なユーザーにとって非常にパワフルであるが、初心者は学習に時間がかかることがあります。しかし、UNIXを学習することは、プログラマーやシステム管理者にとって非常に役立つスキルであり、コンピューターサイエンス分野で重要な役割を果たしています。
この章では、UNIXで使用される一般的なコマンドについて説明します。UNIXは、多くのコマンドがあり、これらのコマンドは、ファイルの操作、プロセスの管理、システム情報の取得などの様々な目的に使用されます。この章では、これらのコマンドについて詳しく説明し、コマンドの実行方法を学びます。
UNIXのファイル操作コマンドには、以下のようなものがあります。
lsコマンドは、指定されたディレクトリ内のファイルやディレクトリを一覧表示するために使用されます。 
以下は、一般的な使用例です。
ls ： カレントディレクトリ内のファイルとディレクトリの一覧を表示する。
ls -l ： 詳細な情報（ファイルの所有者、サイズ、更新日時など）を含めたカレントディレクトリ内のファイルとディレクトリの一覧を表示する。
ls -a ： カレントディレクトリ内の隠しファイルを含めたすべてのファイルとディレクトリを表示する。
cdコマンドは、現在のディレクトリを変更するために使用されます。
以下は、一般的な使用例です。
cd /path/to/directory：/path/to/directoryに移動します。
cd ..：現在のディレクトリの親ディレクトリに移動します。
cd ~：ユーザーのホームディレクトリに移動します。
cd ：ユーザーのホームディレクトリに移動します。
mkdirコマンドは、指定されたディレクトリを作成するために使用されます。 
以下は、一般的な使用例です。
mkdir test ： カレントディレクトリに "test" という名前の新しいディレクトリを作成する。
mkdir -p test1/test2 ： "test1" ディレクトリが存在しない場合、新しい "test1" ディレクトリとそのサブディレクトリ "test2" を作成する。
rmdirコマンドは、ディレクトリを削除するために使用されます。ただし、このコマンドは、削除しようとしているディレクトリが空である場合にのみ機能します。
以下は、一般的な使用例です。
rmdir /path/to/directory：/path/to/directoryにある空のディレクトリを削除します。
cpコマンドは、ファイルやディレクトリをコピーするために使用されます。
以下は一般的な使用例です。
cp file1 file2：file1をfile2にコピーします。
cp -r dir1 dir2：ディレクトリdir1を再帰的にdir2にコピーします。
cp -p file1 dir1：file1をdir1にコピーし、元のファイルのパーミッションを維持します。
mvコマンドは、ファイルやディレクトリを移動または名前を変更するために使用されます。
以下は一般的な使用例です。
mv file1 file2：file1をfile2に移動または名前を変更します。
mv -r dir1 dir2：ディレクトリdir1を再帰的にdir2に移動または名前を変更します。
mv -i file1 dir1：file1をdir1に移動または名前を変更し、同名のファイルがある場合は上書きするかどうかを確認します。
lnコマンドは、ファイルやディレクトリへのリンクを作成するために使用されます。
以下は一般的な使用例です。
ln -s file1 file2：file1へのシンボリックリンクをfile2に作成します。
ln file1 file2：file1へのハードリンクをfile2に作成します。
ln -s dir1 dir2：dir1へのシンボリックリンクをdir2に作成します。
UNIXのrmコマンドは、指定されたファイルやディレクトリを削除するために使用されます。 
以下は、一般的な使用例です。
rm file.txt ： カレントディレクトリ内の "file.txt" という名前のファイルを削除する。
rm -r directory ： "directory" という名前のディレクトリとその中のすべてのファイルを再帰的に削除する。
catコマンドは、ファイルの内容を表示するために使用されます。
以下は、一般的な使用例です。
cat /path/to/file：/path/to/fileの内容を表示します。
touchコマンドは、新しい空のファイルを作成するために使用されます。また、既存のファイルのタイムスタンプを更新することもできます。
以下は、一般的な使用例です。
touch /path/to/file：/path/to/fileに新しい空のファイルを作成します。 touch -a /path/to/file：/path/to/fileの最終アクセス時刻を更新します。
touch -m /path/to/file：/path/to/fileの最終更新時刻を更新します。
UNIXのシステム管理コマンドには、以下のようなものがあります。
suコマンドは、別のユーザーに切り替えるために使用されます。rootユーザーになるために使用されることが一般的です。
以下は、一般的な使用例です。
su：rootユーザーになります。
su username：usernameユーザーになります。
chmodコマンドは、ファイルまたはディレクトリのアクセス許可を変更するために使用されます。ファイルシステムは、各ファイルやディレクトリに対して、所有者、グループ、その他のユーザーのアクセス許可を管理します。 chmodコマンドは、これらのアクセス許可を変更するために使用されます。
以下は、一般的な使用例です。
chmod u+r file.txt：所有者に読み取りアクセス許可を与えます。 chmod g+w directory：グループに書き込みアクセス許可を与えます。
chmod o-x file.txt：その他のユーザーから実行アクセス許可を削除します。
chmod 755 script.sh：所有者には読み取り、書き込み、実行アクセス許可を与え、グループとその他のユーザーには読み取りおよび実行アクセス許可を与えます。
chownコマンドは、ファイルまたはディレクトリの所有者を変更するために使用されます。所有者は、ファイルまたはディレクトリを所有し、コントロールするユーザーです。
以下は、一般的な使用例です。
chown user1 file.txt：所有者をuser1に変更します。
chown user1:group1 directory：所有者をuser1に、グループをgroup1に変更します。
chown :group2 file.txt：グループをgroup2に変更します。
chown -R user1:group1 directory：再帰的に、ディレクトリとそのサブディレクトリ内のすべてのファイルとディレクトリの所有者をuser1に、グループをgroup1に変更します。
chgrpコマンドは、ファイルまたはディレクトリのグループを変更するために使用されます。グループは、ファイルまたはディレクトリにアクセスすることができるユーザーの集合を定義します。
以下は、一般的な使用例です。
chgrp group1 file.txt：グループをgroup1に変更します。
chgrp -R group1 directory：再帰的に、ディレクトリとそのサブディレクトリ内のすべてのファイルとディレクトリのグループをgroup1に変更します。
chgrp :group2 file.txt：グループをgroup2に変更します。
UNIXのプロセス管理コマンドには、以下のようなものがあります。
psコマンドは、実行中のプロセスの情報を表示するために使用されます。
以下は、一般的な使用例です。
ps：現在実行中のプロセスをリスト表示します。
ps -ef：全てのプロセスを表示します。
ps -aux：実行中の全てのプロセスをユーザー名の表示を含めて表示します。
killコマンドは、実行中のプロセスを停止するために使用されます。
以下は、一般的な使用例です。
kill [PID]：PIDで指定されたプロセスを停止します。
kill -9 [PID]：強制的にPIDで指定されたプロセスを停止します。
UNIXには、以下のようなファイル検索関係のコマンドがあります。
find： ディレクトリツリーの中から、指定された条件に合致するファイルを検索することができます。たとえば、名前がある文字列を含むファイル、ある日付以降に更新されたファイル、あるサイズ以上のファイルなどを検索することができます。
locate： システム全体から、指定された文字列にマッチするファイルを高速に検索することができます。このコマンドは、あらかじめ作成されたインデックスを使用するため、findコマンドよりも高速ですが、検索結果がリアルタイムではないことが欠点です。
grep： 指定された文字列を含むファイルを検索することができます。このコマンドは、検索対象のファイルを指定する必要がありますが、正規表現を使用することで、検索パターンを柔軟に指定することができます。
which： 実行可能ファイルのパスを検索することができます。たとえば、コマンドラインから実行するコマンドがどのディレクトリにあるかを調べることができます。
whereis： 指定されたコマンドやファイルの場所を検索することができます。
UNIXには、ネットワーク関係のコマンドが豊富にあります。
以下は、それらのコマンドの主なユースケースの例です。
ping： ホスト名またはIPアドレスに対して、ネットワーク接続をテストするために使用されます。pingコマンドは、指定したホストに到達できるかどうかを確認するために、ICMPメッセージを送信し、応答を待ちます。
netstat： ネットワーク接続とネットワークインタフェースの状態を表示するために使用されます。このコマンドは、TCPやUDPのポート番号、アドレス、および状態を表示することができます。
ifconfig： ネットワークインタフェースを設定するために使用されます。このコマンドは、IPアドレス、サブネットマスク、MACアドレス、およびネットワークインタフェースの状態を表示することができます。
traceroute： パケットがどのようにルーティングされるかを示すために使用されます。このコマンドは、ホップの数、IPアドレス、および時間を表示することができます。
ssh： リモートホストに安全にログインするために使用されます。このコマンドは、SSHプロトコルを使用して、リモートホストに接続します。
scp： リモートホスト間でファイルを転送するために使用されます。このコマンドは、SSHプロトコルを使用して、リモートホストにファイルを転送します。
これらのコマンドは、ネットワークのトラブルシューティングや設定、およびデータの転送に役立ちます。
UNIXのシステム情報関係のコマンドには、以下のようなユースケースがあります。
uname：システムの種類やハードウェアの種類、OSのバージョンなど、カーネルの情報を表示するコマンドです。例えば、uname -aを実行すると、システムのすべての情報が表示されます。
top：実行中のプロセスを監視するためのコマンドです。CPUやメモリの使用状況、プロセスの状態、プロセスのIDなどが表示されます。topを実行すると、現在実行されているプロセスのリストが表示されます。
ps：実行中のプロセスの情報を表示するコマンドです。psを実行すると、現在実行されているプロセスのリストが表示されます。また、特定のプロセスの情報を表示するために、プロセスIDを指定することもできます。
df：ディスクの使用状況を確認するためのコマンドです。dfを実行すると、使用可能なディスクスペース、ファイルシステムの種類、マウントされた場所などが表示されます。
du：ディスク使用量を確認するためのコマンドです。duを実行すると、指定したディレクトリの使用量が表示されます。さらに、サブディレクトリの使用量も表示されるので、どのファイルが最も多くのディスクスペースを占有しているかを特定することができます。
vmstat：メモリ使用状況を確認するためのコマンドです。vmstatを実行すると、使用中のメモリ、空きメモリ、バッファキャッシュなどの情報が表示されます。
この章では、UNIXで使用される一般的なユーティリティについて説明します。UNIXは、多くのユーティリティがあり、これらのユーティリティは、アーカイブの操作、ファイルやストリームの圧縮・伸長などの様々な目的に使用されます。この章では、これらのユーティリティについて詳しく説明し、ユーティリティの実行方法を学びます。
tarは、ファイルやディレクトリをアーカイブし、圧縮するために使用されます。
以下は、一般的な使用例です。
tar -cvf archive.tar file1 file2 file3：ファイルのアーカイブ、ファイル1、ファイル2、ファイル3をアーカイブする。
tar -cvf archive.tar directory：ディレクトリのアーカイブ、ディレクトリをアーカイブする。
tar -xvf archive.tar：アーカイブファイルの展開、アーカイブを展開する。
tar -czvf archive.tar.gz file1 file2 file3：アーカイブファイルの圧縮、ファイル1、ファイル2、ファイル3をアーカイブして、gzipで圧縮する。
tar -xzvf archive.tar.gz：アーカイブファイルの解凍と展開、gzipで圧縮されたアーカイブを解凍して、展開する。
cpioは、ファイルやディレクトリをアーカイブし、圧縮するために使用されます。
以下は、一般的な使用例です。
find . -depth -print | cpio -ov > archive.cpio：ファイルのアーカイブ、カレントディレクトリ以下のすべてのファイルをアーカイブする。
find directory -depth -print | cpio -ov > archive.cpio：ディレクトリのアーカイブ、ディレクトリをアーカイブする。
cpio -ivd < archive.cpio：アーカイブファイルの展開、アーカイブを展開する。
find . -depth -print | cpio -ov | gzip > archive.cpio.gz：アーカイブファイルの圧縮、カレントディレクトリ以下のすべてのファイルをアーカイブして、gzipで圧縮する。
gzip -d < archive.cpio.gz | cpio -ivd：アーカイブファイルの解凍と展開、gzipで圧縮されたアーカイブを解凍して、展開する。
compress コマンドは、Uファイルを圧縮するために使用されるコマンドです。圧縮されたファイルの拡張子は .Z になります。
以下は、compress コマンドの一般的な使用例です。
圧縮・伸長をサポートするプログラムは、UNIXの一部である pack や compress の他にもサードパーティから様々なライセンスで配布されています。
ここでは主要なものだけ扱います。
gzip は、ファイルを圧縮するために使用されされます。gzip はUNIXの一部ではなくGNUプロジェクトがGPLの元配布しています。圧縮されたファイルの拡張子は .gz になります。
以下は、gzip の一般的な使用例です。
xz は、ファイルを圧縮するために使用されます。xz はUNIXの一部ではなくLasse Collinが開発したパブリックドメインなソフトウェアです。圧縮されたファイルの拡張子は .xz になります。以下は、xz コマンドの一般的な使用例です。
圧縮レベルを指定してファイルを圧縮する: xz -9 filename : 圧縮レベルを最大まで指定して、filename を圧縮する。結果として filename.xz という名前のファイルが作成される。
圧縮・伸長をサポートするプログラムは、多岐にわたるのでここでは名前と特徴を列挙するにとどめます。
bzip2 - ブロックソートアルゴリズムを使用する圧縮プログラム。
lz4 - 非常に高速なLZ77ベースのデータ圧縮アルゴリズムを使用する圧縮プログラム。
Zstd - Facebookが開発した非常に高速な圧縮アルゴリズムを使用する圧縮プログラム。
lzo - インメモリデータ圧縮/伸長アルゴリズムを使用する圧縮プログラム。
snappy - Googleが開発した非常に高速な圧縮アルゴリズムを使用する圧縮プログラム。
シェル（Shell）は、コンピュータのオペレーティングシステム上で動作するコマンドラインインターフェースを提供するプログラムです。ユーザーがキーボードから入力したコマンドを解釈して、オペレーティングシステムの機能を呼び出します。一般的に、シェルはUNIXおよびLinuxシステムで使用されます。
シェルスクリプト（Shell script）は、シェルが解釈できるプログラムの一種であり、シェルコマンドを記述するテキストファイルです。シェルスクリプトを作成することで、複数のシェルコマンドを一度に実行したり、繰り返し処理を行ったり、条件分岐を行ったりすることができます。シェルスクリプトは、オペレーティングシステムの自動化、バッチ処理、テスト自動化、ログの解析など、多くの目的で使用されます。シェルスクリプトは、csh、bash、sh、zshなどのシェルで実行できます。
UNIXのシェル（コマンドインタープリタ）は、置き換え可能で、多数のシェルが開発されています。
以下にそれぞれの特徴を説明します。
組み込みコマンドが少ないですが、それでも強力でシンプルなスクリプト言語です。
C言語に似たシンタックスを使用し、より直感的でユーザーフレンドリーなインターフェースを提供します。
ヒストリー機能が優れており、ユーザーは過去のコマンドをすばやく再利用できます。
ジョブコントロール機能を最初にサポートしました。
GNUプロジェクトの一部として開発されました。
Bourne Shellの強力な機能に加えて、多数の組み込みコマンドがあり、高度なシェルスクリプトを作成できます。
C Shellの直感的な構文とBourne Shellの高度な機能を組み合わせたもので、スクリプトの開発に適しています。
以上の特徴から、選択するシェルは、その目的や開発の必要性に応じて異なる場合があります。
この章では、UNIXのファイルシステムとパーミッションについて説明します。UNIXは、ファイルシステムを基本として動作しており、ファイルやディレクトリを操作することができます。また、UNIXでは、ファイルやディレクトリに対するアクセス権限が重要です。
UNIXカーネルは、オペレーティングシステムの中核となるソフトウェアであり、ユーザーがコンピューターを操作するための様々な機能を提供します。
以下に、UNIXカーネルが提供する代表的な機能をいくつか挙げます。
プロセス管理：UNIXカーネルは、プロセスの作成、削除、スケジューリング、通信、同期などの機能を提供します。
メモリ管理：UNIXカーネルは、メモリの割り当て、解放、保護、仮想メモリ、スワッピングなどの機能を提供します。
ファイルシステム：UNIXカーネルは、ファイルの作成、削除、移動、コピー、検索などの機能を提供します。また、ファイルの保護やアクセス制御なども行います。
ネットワーク：UNIXカーネルは、ネットワーク通信を可能にする機能を提供します。TCP/IPプロトコルスタック、ソケットインタフェース、ネットワークドライバなどが含まれます。
デバイス管理：UNIXカーネルは、デバイスの制御やドライバの管理、ハードウェアリソースの割り当てなどの機能を提供します。
セキュリティ管理：UNIXカーネルは、セキュリティ上の問題を検知したり、回避したりする機能を提供します。例えば、アクセス制御、パスワード管理、暗号化などが含まれます。
これらの機能は、ユーザーがコンピューターを効率的に利用できるようにするために不可欠です。UNIXカーネルは、多くのオペレーティングシステムに基礎を提供しています。