----
『UNIX入門』もあります。
UNIXの起源はアメリカ・AT&T社のベル研究所が開発したOSです。後にカリフォルニア大学バークレー校で学術目的に実装され、ベル研究所のUNIXとカリフォルニア大学バークレー校のUNIX (BSD) 両者が現在広く用いられているUNIXの源流をなしています。
マルチユーザ・マルチタスク機能を発表当初から持っており、ネットワークを介して異なる端末から更新作業などを行える環境をいち早く作り上げた。しかも、マルチタスク機能で、同時にログインして同時に作業することもでき、業務の効率を大幅に改善した。
以下現在主に使用されているUNIX系OSを挙げます。
詳細はウィキペディアのUNIXの記事を参照のこと。
Linuxは、MINIXを模倣して作られたOSカーネルです。
OSの構成要素には、カーネルとユーザーランド（コマンドインタープリターを含むコマンド、デーモン、ライブラリや付帯するデータ）がありますが、Linuxはカーネルのみを提供しているので、不足するユーザーランドをGNUのユーティリティを始めとするサードパーティ・ソフトウェアで補いOSの体裁を整えています。
この本で紹介するコマンドはGNU/Linuxでは、全てLinuxではなくGNUのユーティリティなどサードパーティが提供するものです。
[https://www.gnu.org/software/bash/|GNU Bash]:bash
[https://www.gnu.org/software/coreutils/|GNU Core Utilities]
[https://www.gnu.org/software/findutils/|GNU Find Utilities]:find, locate, updatedb
[https://www.gnu.org/software/glibc/|The GNU C Library (glibc)]:標準Cライブラリ実装。
[https://www.gnu.org/software/grep/|GNU Grep]:grep, fgrep, egrep
[https://www.gnu.org/software/texinfo/|GNU Texinfo]:info, install-info, makeinfo, texi2dvi, texindex, texinfo
[https://greenwoodsoftware.com/less less]:less
[https://man-db.nongnu.org/ mandb]:apropos, man, manpath, whatis, zsoelim
[https://www.kernel.org/doc/man-pages/ manpages]:man(1) で参照されるマニュアル本文（コマンド自体に付属するマニュアルは除く）
[https://gitlab.com/psmisc/psmisc psmisc]:fuser, killall, peekfd, prtstat, pstree
これらのオリジナルにあたるUNIXでの実装（*BSDを含む）は、/usr/src 以下のソースツリーに一体として維持されており、カーネルのソースコードも/usr/src/sys以下に全てあります。
このように、OSとしての体裁は似通っていますが、UNIXがカーネルとユーザーランドをトータルで維持・管理・提供しているのに対し、GNU/LINUXではカーネルとは出自の異なるソフトウェアの調整のもとOSとして提供しているので、上記以外の組み合わせ（例：coreutilsの代わりにbusyboxを使う、glibcの代わりにmuslを使う等）が無数に考えられ、GNU/LINUXでは、それらのパッケージ管理の重要度が増します。
基本的には、CUIで操作を行う。CUIとは、コマンドベースのインターフェイスのことで、一定の書式に則った文字列（これをコマンドという）を入力することでコンピュータを操作する体系です。近年、ウィンドウシステムの発達もあって、特にクライアント分野では起動から終了までGUI(CUIに対して、視覚的に操作できる体系)で操作を完結できる環境が整いつつあるが、簡素かつ強力なコマンドラインベースの操作環境は根強く支持されています。GUIを採用しているシステムでも、GUI環境中でコマンドを実行するためのアプリケーション（ターミナルエミューレータと呼ばれます）を利用するのが一般的です。
ファイルシステムという用語も多義的であるが、ここではUnix File Systemのユーザー側から観た特徴について述べます。
UNIXでは、ファイルをディレクトリで管理します。ディレクトリはWindowsのフォルダーに対応するものでありUnixのファイルシステムは、VMS,CP/M,MS-DOS,Windowsと異なり、「ドライブ」はなく、ルートファイルシステムの下位の階層に別のファイルシステムをマウントすることで、ユーザーには単一のファイルシステムに見えるようにします。ただし、例えばファイルシステムを跨いでハードリンクを張ることは出来ないなど、全くユーザーが意識しないで済むわけではありません。、複数のファイルを収めることができます。さらに、ディレクトリ内に別のディレクトリがあっても良いので、ディレクトリ群は木構造になります。
この構造の頂点となる最上位のディレクトリがただひとつあります。これをルートディレクトリと呼び、/と書く。
なお、 /root/ というディレクトリがあるが、こちらはファイルシステムの頂点のディレクトリという意味の「ルートディレクトリ」ではなく、ユーザー root のホームディレクトリであるFHS（Filesystem Hierarchy Standard）以前の Unixでは、実際に / が、システム管理者 root のホームディレクトリでした。。
ディレクトリ構造上の位置をパス  ''(path)''と呼ぶ。
パスには絶対パスと相対パスがあります。
絶対パス
/home/user01/main.txt
相対パス
main.txt
意味:カレントディレクトリが /home/user01/ ならば /home/user01/main.txt に同じ。
カレントディレクトリ
親ディレクトリ
例： /usr/local/bin/../../lib は /usr/lib/ に同じ。
ホームディレクトリ
環境変数 HOME で参照できます。
記号 '~'（チルダー１文字）で多くのシェルで参照できるが、全てのシェルで出来るわけではありません。
ファイルシステムのレイアウトについては hier(7) を参照。
コマンドとは、コンピュータ上で処理を行うための、特定の書式に則った一連の文字列です。コマンドを入力し、実行します（通常はEnterキーを押す）ことで、そのコマンドに応じた処理が実行されます。
例:
$ date
2020年  2月 22日 土曜日 20:26:11 JST
$ _
コマンドの例における$は、コマンドが入力できる状態であることを示すために表示された文字で、「プロンプト」と呼ばれます。プロンプトは場合によって異なるがここでは$を用いています。
この例では、'date'というコマンドを実行しています。これにより、コンピュータは'date'という指示を受け、その結果'Sun Feb 12 22:11:48 JST 2006'を返します。結果は、この場合画面に表示されているが、正常に処理が行われた場合に何も表示しないコマンドも多い。
コマンド名に続けて文字列をスペースで区切って記述することで、コマンドに付加的な指示を渡すことができます。このような付加的な文字列を引数と呼ぶ。引数がどのように解釈されるかはコマンドによって異なるが、よくある使いかたとして、コマンドの挙動を変更するためのオプションとして使うというものがあります。オプションは、通常'-'に続けた一字のアルファベットでオプションによって追加のパラメータを取ります。
オプションの形式に --help のように -- を前置するものもありますが、これはGNU拡張で、UNIXでは使えないので、互換性のあるスクリプトを書く場合は、POSIXの範囲内で使うよう心がけましょう。
$ date -u
2020年  2月 22日 土曜日 11:30:04 UTC
$ _
この例では、'date'というコマンドに'-u’というオプションを付けています。これによりdateコマンドの動作は変更されています。この場合は、dateコマンドの仕様に従い、ローカルマシンの時刻からUTC（協定世界時）へと表示される時刻が切り替えられています。
また、コマンドには、引数として操作対象を受け取るものがあります。
例:
$ rm test.txt
この例では、'rm'というコマンドに'test.txt'というファイルを指示しています。これにより、'rm'というコマンドを通じて、'test.txt'というファイルを操作します。'rm'というコマンドはファイルを消去するので、この場合はtest.txtが消去されます。
----
多くのコマンドは、無効なオプションを渡すと、機能の一覧が表示されます。
% date -@
date: illegal option -- @
usage: date [-jnRu] [-I[date|hours|minutes|seconds]] [-f input_fmt]
            [-r filename|seconds] [-v[+|-]val[y|m|w|d|H|M|S]]
            [[[[[[cc]yy]mm]dd]HH]MM[.SS] | new_date] [+output_fmt]
% ls -@
ls: invalid option -- @
usage: ls [-ABCFGHILPRSTUWZabcdfghiklmnopqrstuwxy1,] [--color=when] [-D format] [file ...]
% cat -@
cat: illegal option -- @
usage: cat [-belnstuv] [file ...]
詳しくは man を引くべきですが、思い出すためには役立つことがあります。
シェルとは、コンピュータに対して指示を出す際に利用される対話プログラムです。コンピュータにコマンドを入力するとき、実際にはシェルに対して入力しています。シェルは入力されたコマンドを解釈し、実行します。シェルは複数開発されており、どのシェルを適用しているかによって、コマンドの表現方法が違ったり、同じ意味でもコマンド自体が違ったりする場合もあります。
Bシェル( /bin/sh )、ash、dash、ksh、bash、zsh、csh、tcshなどがあります。Linuxの各ディストリビューションでは、bashをデフォルトのシェルを採用してい場合が多いですが、dash を採用しているディストリビューションも見受けられます。
コマンドが実行されるとき、コマンドには必ず入出力のための三つの経路、標準入力、標準出力、標準エラー出力が割り当てられます。コマンドは必要に応じてこれらの経路から入力を受け取ったり、出力を書き出したりします。この三つの経路を総称して標準入出力といいます。
標準入力 :標準入力はコマンドへの情報の入力源です。標準入力を利用しないコマンドもあります。通常は、利用しているコンソールからのキーボード入力を標準入力とします。
標準出力 :標準出力とは、コマンドが出力した結果を返すところです。通常は、利用しているコンソールが出力先となります。
標準エラー出力 :標準エラー出力とは、プログラム上エラーとして指示された出力で、通常は利用しているコンソールが出力先となります。
例えば、上記のdateの例で、dateコマンドの出力内容が画面に表示されたが、実はこの時の出力は標準出力に送られています。上記では標準出力の行き先が画面だったため、結果として画面に表示された。
標準入出力の行き先は必要に応じて変更することができます。
例:
$ date > date.txt
コマンドとして入力する文字は date > date.txt の部分です。
このコマンドの内容として、>以降は標準出力の行き先をdate.txtというファイルに切り替える指示です。このようにすると、dateコマンドの結果は画面に表示される代わりにdate.txtというファイルに出力されるので、日時を記録したdate.txtというファイルができることになります。このように標準入出力の行き先を変更することをリダイレクトと呼ぶ。なお、「> date.txt」の部分はシェルへの指示であって、コマンドに渡される引数ではないことに注意してほしい。
標準入力を使うコマンドの例も見てみましょう。wcは、標準入力から受け取ったテキストの行数・語数・バイト数を標準出力に書き出すコマンドです。
例:
$ wc
This is an example to
show how to use the extremely
useful UNIX command.
      3      14      73
この例ではwcの標準入力はキーボードなので、コマンドを実行するとコンピュータはキーボードからの入力を待つ。そこでテキストをタイプし(この例では3行のテキストを入力した)、入力を終えます(これには通常Ctrl-dを押せば良い)と、次の行にwcコマンドの出力が表示されます。
Ctrl-dとはCtrlキーを押しながらdキーを押すことです。
標準入力も標準出力と同様にリダイレクトすることができます。例えば、test.txtというテキストファイルの行数を数えるには次のようなコマンドを使えば良い。
$ wc < test.txt
  7  23 235
さらに、あるコマンドの標準出力を別のコマンドの標準入力につなげることもできます。これはパイプと呼ばれます。
例
$ date | wc
      1       6      43
この例では、パイプを使ってdateコマンドの出力の行数・単語数・バイト数を数えています。
パイプやリダイレクトを使うと、限られたコマンドで自在に多様な操作を行うことができます。
シェルはコマンドインタープリターと呼ばれるように、言語インタープリターの一種で、変数を使うことが出来ます。
Bash:
$ a=xyz
$ echo $a
xyz
$ echo a
a
変数 a に 文字列xyzを代入します。
そのまま表示します。
Csh:
% set a=xyz
% echo $a
xyz
% echo a
a
変数 a に 文字列xyzを代入します。
そのまま表示します。
csh では、プロンプトが % であること、代入に set を前置することが bash との違いです。
いま使ってシェルが何かは、環境変数SHELLにセットされているので
Bash:
$ echo $SHELL
/bin/sh
Csh:
% echo $SHELL
/bin/csh
の様に確認できます。
環境変数は、名前と結びついた動的な名前と値のペアで、プロセスの挙動・設定を変更するために用います。
環境変数は、プロセスが実行される環境の一部です。
例えば
HOME:ホームディレクトリ
LANG:ロケール
USER:ログイン名
といった情報に該当する環境変数を変えることで情報を書き換えることができます。
ただし使用しているシェルによって設定方法は異なります。
例えば、ロケール (LANG) を日本語日本国UTF-8 (ja_JP.UTF-8) としたい場合は
bsh系:
$ export LANG=ja_JP.UTF-8
csh系:
% setenv LANG ja_JP.UTF-8
と内部コマンド名と = の有無が異なります。
通常、環境変数は、全て大文字で、環境変数を設定、取消しするコマンドはシェルによって異なります。
なんらかの環境変数を確認するには、printenv(1) を使います。
たとえば、ロケール(LANG)を調べたいなら
bsh/csh系共通:
% printenv LANG
ja_JP.UTF-8
とします。
環境変数を指定して実行する方法も bsh 系と csh 系で異なります。
bsh系:
$  LANG=ja_JP.UTF-8 date
2022年 10月 20日 木曜日 02:09:43 UTC
$ LANG=C date
Thu Oct 20 02:10:08 UTC 2022
$ LANG=zh_TW.UTF-8 date
西元2022年10月20日 (週四) 02時10分30秒 UTC
csh系:
% env LANG=ja_JP.UTF-8 date
2022年 10月20日 木曜日 11時05分38秒 JST
% env LANG=C date
Thu Oct 20 11:05:49 JST 2022
% env LANG=zh_TW.UTF-8 date
2022年10月20日 星期四 11時05分59秒 JST
bsh系(dash)とcsh系(csh)で結果が異なります（例えば、中国語台湾の曜日表記が「週四」と「星期四」とちがう）のは、dash からは GNU coreutils の date が、tcsh からは FreeBSDのユーザーランドの date(1) が呼出されているためで、シェルの違いが原因ではありません。
現在のロケールとシステムで有効なロケール:
% locale
LANG=C.UTF-8
LC_CTYPE="C.UTF-8"
LC_COLLATE="C.UTF-8"
LC_TIME="C.UTF-8"
LC_NUMERIC="C.UTF-8"
LC_MONETARY="C.UTF-8"
LC_MESSAGES="C.UTF-8"
LC_ALL=
% locale -a
C
C.UTF-8
POSIX
af_ZA.ISO8859-1
af_ZA.ISO8859-15
af_ZA.UTF-8
am_ET.UTF-8
ar_AE.UTF-8
ar_EG.UTF-8
ar_JO.UTF-8
ar_MA.UTF-8
ar_QA.UTF-8
ar_SA.UTF-8
be_BY.CP1131
be_BY.CP1251
be_BY.ISO8859-5
be_BY.UTF-8
bg_BG.CP1251
bg_BG.UTF-8
ca_AD.ISO8859-1
ca_AD.ISO8859-15
ca_AD.UTF-8
ca_ES.ISO8859-1
ca_ES.ISO8859-15
ca_ES.UTF-8
ca_FR.ISO8859-1
ca_FR.ISO8859-15
ca_FR.UTF-8
ca_IT.ISO8859-1
ca_IT.ISO8859-15
ca_IT.UTF-8
cs_CZ.ISO8859-2
cs_CZ.UTF-8
da_DK.ISO8859-1
da_DK.ISO8859-15
da_DK.UTF-8
de_AT.ISO8859-1
de_AT.ISO8859-15
de_AT.UTF-8
de_CH.ISO8859-1
de_CH.ISO8859-15
de_CH.UTF-8
de_DE.ISO8859-1
de_DE.ISO8859-15
de_DE.UTF-8
el_GR.ISO8859-7
el_GR.UTF-8
en_AU.ISO8859-1
en_AU.ISO8859-15
en_AU.US-ASCII
en_AU.UTF-8
en_CA.ISO8859-1
en_CA.ISO8859-15
en_CA.US-ASCII
en_CA.UTF-8
en_GB.ISO8859-1
en_GB.ISO8859-15
en_GB.US-ASCII
en_GB.UTF-8
en_HK.ISO8859-1
en_HK.UTF-8
en_IE.ISO8859-1
en_IE.ISO8859-15
en_IE.UTF-8
en_NZ.ISO8859-1
en_NZ.ISO8859-15
en_NZ.US-ASCII
en_NZ.UTF-8
en_PH.UTF-8
en_SG.ISO8859-1
en_SG.UTF-8
en_US.ISO8859-1
en_US.ISO8859-15
en_US.US-ASCII
en_US.UTF-8
en_ZA.ISO8859-1
en_ZA.ISO8859-15
en_ZA.US-ASCII
en_ZA.UTF-8
es_AR.ISO8859-1
es_AR.UTF-8
es_CR.UTF-8
es_ES.ISO8859-1
es_ES.ISO8859-15
es_ES.UTF-8
es_MX.ISO8859-1
es_MX.UTF-8
et_EE.ISO8859-1
et_EE.ISO8859-15
et_EE.UTF-8
eu_ES.ISO8859-1
eu_ES.ISO8859-15
eu_ES.UTF-8
fi_FI.ISO8859-1
fi_FI.ISO8859-15
fi_FI.UTF-8
fr_BE.ISO8859-1
fr_BE.ISO8859-15
fr_BE.UTF-8
fr_CA.ISO8859-1
fr_CA.ISO8859-15
fr_CA.UTF-8
fr_CH.ISO8859-1
fr_CH.ISO8859-15
fr_CH.UTF-8
fr_FR.ISO8859-1
fr_FR.ISO8859-15
fr_FR.UTF-8
ga_IE.UTF-8
he_IL.UTF-8
hi_IN.ISCII-DEV
hi_IN.UTF-8
hr_HR.ISO8859-2
hr_HR.UTF-8
hu_HU.ISO8859-2
hu_HU.UTF-8
hy_AM.ARMSCII-8
hy_AM.UTF-8
is_IS.ISO8859-1
is_IS.ISO8859-15
is_IS.UTF-8
it_CH.ISO8859-1
it_CH.ISO8859-15
it_CH.UTF-8
it_IT.ISO8859-1
it_IT.ISO8859-15
it_IT.UTF-8
ja_JP.SJIS
ja_JP.UTF-8
ja_JP.eucJP
kk_KZ.UTF-8
ko_KR.CP949
ko_KR.UTF-8
ko_KR.eucKR
lt_LT.ISO8859-13
lt_LT.UTF-8
lv_LV.ISO8859-13
lv_LV.UTF-8
mn_MN.UTF-8
nb_NO.ISO8859-1
nb_NO.ISO8859-15
nb_NO.UTF-8
nl_BE.ISO8859-1
nl_BE.ISO8859-15
nl_BE.UTF-8
nl_NL.ISO8859-1
nl_NL.ISO8859-15
nl_NL.UTF-8
nn_NO.ISO8859-1
nn_NO.ISO8859-15
nn_NO.UTF-8
pl_PL.ISO8859-2
pl_PL.UTF-8
pt_BR.ISO8859-1
pt_BR.UTF-8
pt_PT.ISO8859-1
pt_PT.ISO8859-15
pt_PT.UTF-8
ro_RO.ISO8859-2
ro_RO.UTF-8
ru_RU.CP1251
ru_RU.CP866
ru_RU.ISO8859-5
ru_RU.KOI8-R
ru_RU.UTF-8
se_FI.UTF-8
se_NO.UTF-8
sk_SK.ISO8859-2
sk_SK.UTF-8
sl_SI.ISO8859-2
sl_SI.UTF-8
sr_RS.ISO8859-2
sr_RS.ISO8859-5
sr_RS.UTF-8
sr_RS.UTF-8@latin
sv_FI.ISO8859-1
sv_FI.ISO8859-15
sv_FI.UTF-8
sv_SE.ISO8859-1
sv_SE.ISO8859-15
sv_SE.UTF-8
tr_TR.ISO8859-9
tr_TR.UTF-8
uk_UA.CP1251
uk_UA.ISO8859-5
uk_UA.KOI8-U
uk_UA.UTF-8
zh_CN.GB18030
zh_CN.GB2312
zh_CN.GBK
zh_CN.UTF-8
zh_CN.eucCN
zh_HK.UTF-8
zh_TW.Big5
zh_TW.UTF-8
UNIXは、マルチユーザーシステムであり、ひとつの計算機を複数のユーザーで同時に利用することが可能です。計算機には、そのシステムを利用する権限のあるユーザそれぞれについてユーザー名とパスワードなどの認証情報を始めとするユーザー情報は登録・管理されています。計算機を利用する際は、はじめに自分のユーザー名とパスワードを入力し認証しなければなりません。これをログインといいますWindowsではログオンといいますが、概念は同じです。。ログインには、計算機に対し、あるユーザーが利用を開始したということを表明する働きがあります。同様に、利用を終了することを表明する手続きは、ログアウトと呼ばれます。自分が今どのユーザーとしてログインしているかを知るには、whoamiというコマンドを使います（whoコマンドにオプションを与えwho am iとしても類似の結果が得られますが、細部が異なります。）。
それぞれのユーザーは、私用のためのディレクトリを一個割り当てられます。これはホームディレクトリとよばれ、Filesystem Hierarchy Standard に従っていれば、 /home/${ユーザー名} ですが、root はこれの例外です。ホームディレクトリには、個人に属するデータの他、アプリケーションの個人用設定ファイルなどを置くことができます。これらのファイルは、所有権が自分に属するため、後述するパーミッションによって、他のユーザーが勝手に変更を加えることができなくできます。
特定の複数のユーザーにのみなんらかの権限を与えたいときにはグループが用いられます。たとえば、あるファイルをグループ所有にして、そのグループの一員にのみ閲覧を許す、といったことができます。BSDによる拡張がサポートされていれば、一人のユーザーが複数のグループに属することが可能です。
UNIXシステムには管理者の役割をするユーザー（スーパーユーザー）があり、名前は root で uid は 0 でグループ wheel(gid:0) に属しています。
root は、デバイス・ファイル・プロセスなど全てのコンピュータ資源に対する権限をもっています。
rootでの誤操作はシステム破壊に直結するため、自分がシステムの管理者であっても、別に一般ユーザーを作成し、root権限が必要な場合を除いて一般ユーザーで作業しなければいけません。
ファイルやディレクトリについてのアクセスの権限をパーミッションといいます。パーミッションを設定することで、例えばファイルを特定のユーザーにしか閲覧できなくしたり、あらゆるユーザーが閲覧できるようにしたりすることができます。
全てのファイルには所有者と所有グループが決まっており、これに従ってアクセス権限が分けられます。すなわち、所有者、所有グループの一員、その他のユーザー、という三区分に対して独立に権限を設定することができます。設定可能な権限は以下の三つです。
読み取り(r) :ファイルなら閲覧、ディレクトリなら内容の表示ができます。
書き込み(w) :ファイルなら書き換え、ディレクトリなら内容操作ができます。
実行(x) :ファイルならプログラムとして実行、ディレクトリならそこに移動できます。
ファイルの消去に必要な権限は、そのファイルへの書き込み権限ではなく、そのファイルの置かれているディレクトリへの書き込み権限であることに注意してほしい。
ファイルのパーミッションは、lsコマンドに'-l'というオプションを付加することで確認できます。この場合、パーミッションは次のような表記で表されます。
 rwxr-x--x
この記法は、左から三文字ずつ、所有者、所有グループの一員、その他のユーザー、に対応しています。アルファベットは対応する権限があることを示し、-は対応する権限がないことを示す。この例では、このファイルもしくはディレクトリに対して、「所有者」はrwxすなわち「閲覧、書き込み、実行可能」、「所有グループの一員」はr-xで「閲覧、実行可能」、「その他」は--xで「実行可能」ということになります。
また、三桁の八進数の数値でパーミッションを表すこともあります。この場合、三つの桁は、左から所有者、所有グループの一員、その他を表す。個々の数字は三種類の権限の有無を二進法で読んだものです。例えば、r-xは二進数に置き換えると101、八進数にすると5です。
最初の例にあるrwxr-x--xなら、計算すると751です。
ここでは、UNIXを扱う上で非常によく用いられるコマンドについてまとめます。これらのコマンドは実際にはシェルの機能ではなく、一つのアプリケーションであることに注意が必要です。しかし、これらのコマンドは通常シェルから起動されることから、これらをシェルのコマンドと呼ぶことが多い。
cdは、カレントディレクトリーを変更するコマンドです。
cdは、 change current working directory の略ですchdir(2)。
cd はファイルシステム上に実行ファイルのある外部コマンドではなく、シェルの内部コマンドです。
$ cd /
$ ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  postinst  proc  root  run  sbin  sys  tmp  usr  var
$ cd etcd
bash: cd: /etcd: No such file or directory
$ cd etc
$ pwd
/etc
$ cd
$ pwd
/home/user1
manは、UNIXで標準的に用いられるヘルプシステムです。manはターミナル上で全ての情報を表示することを条件として作られているため、色使いなどがあまり現代的ではない面があります。しかし、表示される情報には有用なものが多いため、たびたび用いることになるでしょう。特に個々のコマンドの細かいオプションを記憶することは現実的ではないため、機能だけを覚えておき、オプションはそのつどmanで調べるのが現実的でしょう。
このコマンドは、
として用いられます。manのファイルはいくつかのカテゴリーに分類されており、それらのカテゴリーには1から8の番号が付けられています。manは、対応するコマンド名が存在するかどうかを、1から順に調べていき、最初に見付かったものを表示します。そのため、同じ名前のmanが若い番号に存在するときには、後に保存されているmanは読むことができありません。このときには、見たいmanの番号を調べ、
のように書く必要があります。また、
のようにコマンドを用いると、コマンド名に対応するmanを全て順に表示するので、こちらを用いてもよい。
例:$ man man
manについて説明したmanページを読む。
lsのmanページを読む。
manがmanページを探すディレクトリは、環境変数MANPATHに記憶されています。これは、多くの場合
/usr/share/manなどであり、ここにはシステムで用意されているmanページのほとんどが保存されています。システムに興味がある場合はこれらに目を通すとよい。
whatis は、コマンド名あるいはコマンドの機能をおぼろげに覚えているときに使います。
形式:$ whatis 文字列
例:
$ whatis tty
tty(1) - return user's terminal name
IO::Tty(3) - Low-level allocate a pseudo-Tty, import constants.
IO::Tty::Constant(3) - Terminal Constants (autogenerated)
tty(4) - general terminal interface
info は、GNU で用いられるコマンドラインインタフェースで動作するハイパーテキストのヘルプビューアです。
$ info ノード名
として用います。
bash のドキュメントが読みたいのであれば
とします。
infoは、texinfoプログラムによって生成された.infoファイルを読み込み、ドキュメントをツリーとして表示し、ツリーを横断したり、クロスリファレンスをたどったりするための簡単なコマンドを提供しします。
基本操作
スペースバー -- 現在のツリーノード内を下へスクロールし、現在のノードの下にいる場合は、現在のドキュメントの次のノードへ移動します、このことで情報ファイルの内容を順次読み進めることができます。
バックスペースキー -- 反対方向に移動します。
] -- 現在の文書内の次のノードに移動します。
[ -- 現在の文書で前のノードに移動します。
n -- 現在のノードと同じレベルの次のノードに移動します。
p -- 現在のノードと同じ階層にある前のノードに移動します。
u -- 現在のノードの親ノードに行く。
l -- 最後に訪れたノードに移動します。
カーソルをリンク（アスタリスクで始まる単語）の上に移動し、Enterキーを押すと、そのリンク先に飛ぶ。
タブ -- カーソルを次の最も近いリンクに移動します。
dateは、現在の日付と時刻を返すコマンドです。dateコマンドは、日付を設定する目的でも用いることができます。
例:$ date
現在の日付時刻を返します。
システムの日付時刻を設定します。
スーパーユーザー権限が必要で、非可逆な行為です。
また、現在はネットワークで繋げないでUNIXシステムを運用するケースは稀で、ntpで時刻同期管理するので、システムのクロックに手動介入する必要はありません。
dateも、システムのロケールによって、表示を変えます。
$ LC_ALL=en date
Thu Jun  1 19:08:03 JST 2006
$ LC_ALL=ja_JP.UTF-8 date
木  6  1 19:08:07 JST 2006
ここでは、ロケールを英語にした場合と日本語にした場合を示しています。ロケールについては後述。
suは、一時的に管理者権限を手に入れたいときに使う。設定ファイルを書き換える時など管理者権限が必要なときに用いられます。
例:$ su
管理者権限を持ったシェルを起動します。
管理者権限を持ったシェルを起動すると同時に、環境変数をrootの変数で置き換えます。
sudoのあとに管理者権限で実行したいコマンドを書く
例:$ sudo apt update
まず、閲覧したいテキストファイルのある場所まで、cdコマンド（シェルのディレクトリ移動のコマンド）で移動します。
ファイルを表示する場合、
などのコマンドがあります。
これらのコマンドの内容の違いは、テキストファイルを表示するさいに、一括で出力するか、それとも段階的に出力していくかといった、違いです。
のように入力します。なお、これはファイルsample.txtの内容を表示するコマンドです。
つまり
 more ファイル名
の書式です。
moreでは、大きなテキストの場合には段階的に、冒頭から出力していく。表示しているテキストの続を見たい場合はエンターキーを押すなどすると、続きが表示されます。
大きなテキストの場合には段階的に、冒頭から出力していく。
sample.txtの内容を表示します。
表示しているテキストの続を見たい場合は
エンターキーを押すと、続きが表示されます。
マウスの中央ホイールによるスクロールでも、テキストの続きが表示されます。
また、長い標準出力を見るのにも使う
例:$ ls /etc | less
lessは他のコマンドと比べると大きいファイルで、内容も豊富です。詳細な内容は、manを参照すること。
ファイルの内容を最後まで表示します。複数のファイルが指定された場合にはそれらのファイルを続けて表示します。
sample.txtとbbbの内容を連続して標準出力に出力します。
catコマンドでは、テキスト出力はファイルの最後まで中断することなく行われます。
コンソールには表示画面が残されていますが、すでにシャルのコマンドの受付に戻っており、cat は終了しています。
trは、ファイル中の特定の文字列を置き換える働きをします。
$ grep abc /usr/share/dict/words
abcoulomb
Babcock
crabcatcher
dabchick
$ grep abc /usr/share/dict/words | tr abc xyz
xyzoulomy
Bxyzozk
zrxyzxtzher
dxyzhizk
cutはファイル内である列を取り出す。列の内容はオプションによって指定でき、-cオプションでは文字数が指定されます。一方、-fオプションでは-dオプションで指定されるデリミタによって分割されるフィールドが使われます。
$ grep ^cats /usr/share/dict/words
catskin
catstep
catstick
catstitch
catstitcher
catstone
catsup
$ grep ^cats /usr/share/dict/words | cut -c 5
k
t
t
t
t
t
$ cat sample.txt
a b c d
e f g h
$ cut -f 2 -d ' ' sample.txt
b
f
lsとだけコマンド入力した場合には、カレントディレクトリの中身を記述します。作成したファイルやディレクトリが実際にディレクトリ内に存在するかどうかを確かめるために用いることができます。
$ ls ディレクトリ名
と入力した場合、そのディレクトリが存在するならば、そのディレクトリ名の中身が表示されます。
例:
$ cd ~/p5
$ ls
defer.pl        finally.pl      hello.pl        oct.pl          pt.pl           ver.pl
例:
$ ls Go
3sieve.go               ebnf.txt                geocoord.go             hello                   prime.go                std.rb
7.go                    fib.rb                  ggg.go                  httpclient.go           prime.rb                std.txt
CVS                     fibo                    go2.go                  info.go                 recfc.go                stdlib.txt
anon.go                 fibo.arm.objdump        go3.go                  isprime                 sieve.go                stringer
clink                   fibo.go                 go4.go                  isprime.go              sieve2.go               stringer.go
conv.go                 fibo.o                  go5.go                  lifegame.go             sieveX.go               ticker.go
create.go               fibo.objdump            gogo.go                 lifegame.go.000         sig.go                  vro.go
dac                     ftes.txt                goroutine.go            ois3.go                 spec                    vro.json
digestauth              generics.go             gxx.go                  osos.go                 spec-ebnf.rb            websv.go
$ ls NoExist
ls: NoExist: No such file or directory
ファイルがあれば、その名前を表示します。
ディレクトリがあれば、その中のファイルの一覧を表示します。
ファイルもディレクトリも存在しない場合は、その旨が標準エラー出力に出力されます。
lsにはいくつものオプションがあるが、よく用いるものをまとめます。-lは、ファイルやディレクトリについてより詳細な情報を与えます。情報は、パーミッション、ファイルサイズ、作成者、作成された時間、最後に変更された時間などです。実用上は、-lだけではなく、-hもつけるとファイルサイズが人間にとって読みやすい形でかかれるため、使いやすくなります。
-a は、ディレクトリ内にある全てのファイルを表示します。通常のlsでは、最初が.から始まるファイルやディレクトリは表示されありません。これは、設定ファイルやアプリケーションが内部的に用いるファイルが毎回表示されると場所塞ぎだからです。これらが存在するかどうかを調べるためには、明示的に-aオプションを用いる必要があります。
-Rオプションは、ディレクトリを再帰的に降下してファイルを表示します。再帰的とは、ファイルが存在すればそれを表示し、ディレクトリが存在すればそのディレクトリに移動し、再びls -Rと同じ作業を行うという意味です。結局カレントディレクトリ以下に置かれているファイルが全て表示されます。大きなディレクトリ内でこれを実行すると結果を得るのに時間がかかるため、控えた方がよいでしょう。しかし、探したいファイルがあるときにはこれを使うのがよいでしょう。
例:$ ls
カレントディレクトリ内のファイルとディレクトリを表示します。
/binにあるファイルを表示します。/binには、重要なコマンドが保存されています。
ls、後に述べるcp、mkdirなども通常ここに含まれています。一方、manや通常のアプリケーションは/usr/binに含まれています。
このようなファイルシステムの階層は、Filesystem Hierarchy Standardで標準規格化されており、 man hier で参照できます。
/usr/include内に含まれるファイルを再帰的に全て表示します。
/usr/include内にはC言語などを用いる際に必要になるヘッダファイルが含まれています。
システムに必要なヘッダファイルが存在するかを調べるために、このディレクトリを調べることが多い。
cpは、ファイルをコピーするコマンドです。cpの使い方は、
となります。
cpもいくつかのオプションを持つ。-iは、コピー先のファイルが存在するときにそのファイルを上書きするかどうか尋ねるようにするオプションです。このオプションが無いときには、cpはコピー先のファイルを勝手に消去し、その上に指定されたファイルを上書きします。この振舞いはしばしば重大な失敗をひき起こすため、-iオプションはできる限り常に用いるようにした方がよいでしょう。システムによっては、エイリアスなどの機能を駆使して、これらの振舞いが通常となるように設定している場合もあります。
しかし、システムを過信せず、自分で気をつける方が望ましい。-fオプションはこの反対で、-iオプションが付けられていたとしても上書きの前に注意を促さないよう動作させます。これは多くのファイルを上書きする際に、通常の振舞いが-iオプションありであったときには非常に不便であることから用いられます。-Rオプションは、指定されたディレクトリを再帰的にコピーします。この機能はよく用いられるが、似た振舞いを持つコマンドとしてtarがあり、また新しいファイルの多くがtarファイルで供給されることを考えると、それほど使わずに済むかも知れありません。
例:$ cp -i sample.txt documents/
カレントディレクトリ内にあるsample.txtというファイルを、documentsディレクトリ内にコピーします。-iオプションがあるため既にdocuments内に同名のファイルがあったときには警告が表示されます。
mvは、cpと違い指定されたファイルを指定された場所に移動するコマンドです。移動された元のファイルは消去されます。mvは次のように用いられます。
mvにも-iと-fのオプションがあります。これらの動作は、cpの対応物と同じです。mvはファイル名を変更する場合にも用いられます。すなわち、AというファイルをBという名に変更するときは、AをBに移動すると考えmv A Bを使用します。
rmは、指定したファイルを消去するコマンドです。GUIの'ゴミ箱'と違い一度消去したファイルは取り戻せないので、注意が必要です。不測の事態を避けるために、作成したファイルはこまめにバックアップを行うことが望ましい。バックアップにはtarコマンドなどが多く用いられるが、この使い方は後述します。rmコマンドは
として用います。
rmもcpやmvとおなじ-iと-fコマンドを持つ。不測の事態を避けるため、-iは常に用いることを推奨します。rmコマンドは再帰的に消去を行う-Rオプションを持つ（-rオプションも同じ意味であります）。大きなディレクトリを消去するときには、このオプションは事実上必須であるが、強い効果を持つコマンドなので、使用時には細心の注意が必要です。
rmのよくある失敗例は、.から始まるファイルを全て消去しようとして、
とすることです。.*は、..(親ディレクトリ)も含むため、これは親ディレクトリ以下に含まれるファイルを全て消去するコマンドになってしまう。そのため、このようなコマンドを行うことは絶対に避けねばなりません。このときにも-iオプションをつければ消去を行う前に警告が出るので、危険が少なくなります。
mkdirは、、ディレクトリを作成するコマンドです。
形式:$ mkdir 作成するディレクトリ名
rmdirは、、ディレクトリを消去するコマンドです。
形式:$ rmdir 消去するディレクトリ名
rmdirは、指定されたディレクトリが空であるときのみディレクトリを消去します。
を用います。
pwd(1)はカレントディレクトリの絶対パスを表示します。
例:
$ pwd
/home/user1/work
touchは、、指定されたファイルの更新日時を変更します。指定されたファイルが存在しないとき、touchは、ファイルを作成します。ファイルが存在した場合はタイムスタンプを更新します。一度に複数のファイルを作成することもできます。
sample.txt sample2.txt sample3.txtそれぞれに、「存在しなければ0バイトのファイルを作り、存在したら内容は変えずタイムスタンプだけ更新」という処理を行います。
ファイルのハードリンクあるいはシンボリックリンクを作ります。
リンクは、Unixのファイルシステムに固有の機能で、ファイルにはパスと内容（データとメタデータの総体）がある、複数のパスが同じ内容を示すことができます。
例:
$ mkdir ln.d
$ cd ln.d/
$ echo abc > file.txt
$ cat file.txt 
abc
$ ln file.txt linked.txt
$ echo uvw >> file.txt 
$ cat linked.txt 
abc
uvw
$ echo xyz >> linked.txt 
$ cat file.txt 
abc
uvw
xyz
$ ls -i
2654371 file.txt        2654371 linked.txt
正規表現はあるルールで指定される文字列の集合のことを指す。正規表現を用いて複数のファイルを指定したり、文書中から当てはまる文字列を検索することができます。正規表現自体はあらゆるOS上で利用される技術ですが、特にUNIXのシェルには正規表現を用いる技術が多くあるのでここでまとめます。
正規表現は複数の文字列が当てはまる'性質'を示す事ができます。例えば、a,aa,aaa,aaaa,... などの文字列はaが連続的に並ぶという性質を持っています。このような名前のファイルを同時に消去したいときには、aが連続的に並ぶという性質を指定できると便利です。egrepやPerl等の正規表現を扱えるソフトでは、この集合を^a+$と指定することができます。ここでは正規表現について詳しくは触れないので、詳しい情報は、'詳説 正規表現(オライリージャパン)'などを参照して欲しい。
grepは、ある正規表現とファイルを指定して、その正規表現に当てはまる行をファイル中から取り出す。
のように用います。(文中にaaaという文字列を含む)f.txtの内容が
 aaabbbcccddd
 eeefffggghhh
なら、
 aaabbbcccddd
が出力されます。正規表現が^ddd(行がdddで始まます)だったときには、当てはまる行が無いので何も出力されません。ddd$(行がdddで終ます)では、
 aaabbbcccddd
が出力されます。
findは、ディレクトリを再帰的に降下し、条件に当てはまるファイルを見付けるコマンドです。findの書式は非常に複雑になるので、詳細についてはここでは触れありません。対応するmanなどを参照。
条件無しにカレントディレクトリ以下のファイルを表示します。
カレントディレクトリ以下のファイルで名前がf.txtのファイルを表示します。nameオプションには glob を用いることができます。例えば、
は、fではじまり.txtで終わるファイル(file.txt, ffff.txt, ...などがあてはまます)を探す。
シングルクォーテーション（'）で囲んでいるのは、カレントディレクトリにある f*.txt とのマッチングを行わせないため。
上のコマンドの例では、コマンドは全て1つずつ入力され、
それぞれのコマンド実行に対してそれぞれの結果が返ってきた。
このように上記の例ではすべてシェルを対話的に扱ってきたが、
あらかじめシェルに実行させたいコマンドをファイルに書いておき、
これをまとめてシェルに実行させることも可能です。
このコマンドを書いたファイルをシェルスクリプトと呼ぶ。
シェルスクリプトの書き方はシェルの種類によって異なるので、
以下ではLinuxやMac OS Xの標準のシェルであるbash (Bourne Again Shell)
を例にとって説明します。
シェルスクリプトとは言っても、基本的にはコマンドを書き並べたものです。
/bin/echo
/usr/bin/uname
たとえば、テキストエディタの新規ファイルに上記をコピーペーストして、これをたとえば「test.sh」という名前でカレントディレクトリに保存します。
このファイルを実行可能にします。
 chmod +x test.sh
実行するには、コマンドラインで
 ./test.sh
とコマンドすればいいです。
なお、上記コードは、「はじめにhelloと表示し、次にOSの名前を表示する」シェルスクリプトです。
1行目のコメントには特殊な意味があるので後述します（Shebang!）。
UNIXでは複数のプロセスを同時に動かせます。ここでは、実際に複数のプロセスを動かす方法を述べます。プロセスは互いに独立で、通常は別のプロセスの動作にかかわり無く動く。そのため、他のプロセスの動作を制御したいときには、シグナルを利用する必要があります。シグナルは、他のプロセスに送ることができ、プロセスを中断する等の効果があります。
&は、コマンドの後につけてそれをバックグラウンドで動かす機能があります。これは複数のプロセスを起動したい時に用いられます。
例:$ xterm &
X Window Systemの起動中に新たな端末を開くときに用られます。xterm自体も1つのX Window Systemにおけるクライアントアプリケーションです。
HUP
制御端末が閉じられたときにプロセスに送信されるシグナルです。もともとは、シリアルラインドロップをプロセスを通知するように設計されていました。
INT
INTは、interrupt(割り込み)の意味を持つシグナルで、プロセスを中断させます。
TERM
TERMは、terminate(終了)の意味を持つシグナルで、プロセスを終了させます。
KILL
シグナルに対する応答は、プログラム中で書き換えることができます。次の例では、INTシグナルに対する応答を書き換えています。
sig.c:
void sigint() {
  puts("catch SIGINT");
  fflush(stdout);
  exit(1);
}
int main() {
  signal(SIGINT, sigint);
  while (1)
    sleep(5);
}
別のシェルから、
とすると、./a.out を実行していたターミナルに catch SIGINT が表示されます。
ここでは分かりやすさのためにsignal()関数を用いたが、実用的なプログラムを作る際にはsignal()関数ではなくsigaction()関数を使うべきです。
psは、現在実行されているプロセスを表示します。
現在自分が実行しているプロセスを表示します。
自分だけでなく他のユーザーが実行したプロセスも表示します。このオプションは、デーモンプロセスを見るためによく用いられます。
killは、、他のプロセスにシグナルを送るコマンドです。killはプロセスID(pid)を引数としてとるので、シグナルを送りたいプロセスがあるときには、あらかじめpsコマンドなどを用いてpidを手に入れておく必要があります。
プロセスID3456に、TERMシグナルを送ます。TERMシグナルは送るシグナルを指定しなかった時に使われるシグナルです。
プロセスID3456に、INTシグナルを送ます。送るシグナルは-(シグナル名)で指定することができます。実際に指定できるシグナルについては、$ man killを参照すること。
bashには、ビルトインコマンドの1つとしてkillがあります。このため、killが実行ファイルとして存在したとしても、実際に実行されるのはビルトインコマンドの方です。
例
はjobsで表示されるプロセスにシグナルを送ます。しかし、
は、
を返します。
これは %1 は、shell のジョブコントロール機能の管理番号で、外部コマンドである /bin/kill の預かり知らないところであるためです。
psmiscに含まれるkillallは、プロセスIDではなく、プロセスの名称を用いてシグナルを送ることができます。
a.outは、(おそらく)Cプログラムの実行ファイルです。自作したプログラムにシグナルを送るときに用います。
シェルが、複数のプロセスやプロセスグループを管理する機能を、ジョブコントロールと言います。
ジョブコントロールは、BSD Unix上の csh に実装されました。
jobsは、シェルのbuiltinコマンドで、bashを使っているなら、$ man bash内にjobsのmanも置かれています。jobsは、現在自分が動かしているプロセスを表示します。
例
topは、、動いているプロセスを指定された順序で並びかえ、一定時間毎に表示します。
例
デバイスファイルはコンピュータに接続された機器にアクセスするためのファイルです。デバイスファイルは、デバイスへのインターフェースでありデバイスそのものではないため、デバイスファイルを削除しても(通常は)問題がありません。例えば、/dev/hda1を削除しても、ハードディスクの中身が消えることはありません。
また、デバイスファイルはたいてい/dev以下に置かれるが、それ以外の場所においても同じように扱うことができます。ただし、デバイスファイルはデバイスの識別のためにメジャー番号とマイナー番号を持っているため、それらはデバイス毎に使い分ける必要があります。
デバイスファイルを作成するには、mknodコマンドを用います。mknodは作成するファイルの名称、メジャー番号、マイナー番号、デバイスの種類を指定して作られます。デバイスの種類とは、b:ブロック型、c:キャラクタ型のどちらかです。
-->
慣用的に、シェルで、テキストファイルを作成、編集するためのソフトウェアのことが、単に「エディタ」と呼ばれています。UNIXの設定ファイルはほとんどがテキストファイルであるため、エディタの重要性は大きい。
viは広く用いられるUNIXのテキストエディタです。viはほとんど全てのシステムで用意されているため、基本的な設定ファイルの記述にはこのエディタが用いられることが多い。ただし、動作が他のエディタとは異なっているため、その使用には好みがわかれるエディタでもあります。
実際に、vi とタイプして起動されるコマンドは、nvi であったり vim のような互換エディタであることが多いです。
XウィンドウシステムはUNIX上でGUIを実現するためによく用いられるプログラムです。
Linuxとは、1991年にフィンランドのプログラマ リーナス・トーバルズがヘルシンキ大学在学中にMinixより優れたMinixを作るために立ち上げたプロジェクトで開発しGPLで公開したLinuxカーネルを元にしているOSです。
公開当初は、とても貧弱であったが、すぐにハッカー達の支持を受け利用者を増やしていった。安価で手軽にUNIXと類似の環境を得られることからインターネット・サーバとして頻繁に利用されるようになってきた。
Linuxはカーネルしかなく、Linuxのみで動かすことは出来なかった。しかし、フリーなオペレーティングシステムを作ることを目的としていたGNUプロジェクトは、カーネルや、一部のデーモンなど以外をフリーなソフトウェアとして完成させてていた。GNUのglibcやBash、その他の多くのコマンドといった主要なソフトウェアとLinuxにのカーネルを組合わせることで、実際に動かして使うことのできるオペレーティングシステムを作ることが出来ました。そのため、LinuxのカーネルとBashやglibc、gcc、などといった主要なソフトウェアを合わせてGNU/Linuxと呼ぶこともあり、GNUプロジェクトなどは推奨しています。
Linuxに収められているソフトの多くは、GNUのGPLやLGPLといったライセンスで配布されています。
Linux ディストリビューション[a]（しばしばディストロと略されます）は、Linux カーネルと、多くの場合パッケージ管理システムを含むソフトウェアの集合体から作られたオペレーティング・システムです。
Linuxユーザーは通常、Linuxディストリビューションの1つをダウンロードしてOSを入手するLinux From Scratch という、すべてのコンポーネントを手動で構築して、動作する Linux システムをインストールする方法もあります。これには当然ながら、コンパイル済みのLinuxディストリビューションをインストールするよりも長いプロセスが必要です。[https://www.linuxfromscratch.org/ Linux From Scratchのサイト]によると、この方法の利点は、コンパクトで柔軟かつ安全なシステムと、Linuxベースのオペレーティングシステムの内部動作のより深い理解が獲得できることです。。
パッケージ管理システムは、後述しますが、Debian系ではDEB、RedHat系ではRPMが主に使われます。
ディストリビューションの系統として主にパッケージ管理システムの違いによって３種に分類されるが、どれにも属さないものもあります。
Red Hat 系:RPMと呼ばれるパッケージ管理システムを持っています。Red Hat Enterprise Linux、Fedora、CentOS など。
Debian 系:dpkg という RPM 形式よりも強力なパッケージ管理システムを持っています。Debian GNU/Linux や KNOPPIX、Ubuntu、Linux Mint など。
Slackware 系:Red Hat 系のような固有のパッケージ管理システムは無く、ユーザが自分でソフトウェアや、そのソースファイルを管理します。自由度が高いが、知識が必要。Slackware や Plamo Linux。
よく使用されているディストリビューションを以下に挙げます。
Red Hat Enterprise Linux:企業におけるサーバシステムの構築やクライアント利用のためのディストリビューション。RHELと略されます。
CentOS stream:Fedoraでの上流開発とRHELでの下流開発の間に位置する中流Linuxディストリビューションです。
Fedora（旧Redhat Linux）:将来のRHELに組み込まれる予定の新機能などをテストしたりするための、上流Linuxディストリビューションです。
Debian GNU/Linux [http://debian.org/ Debian Project]:非企業のコミュニティ主体のOSのひとつです。最古参のディストリビューションの一つで、現在開発されているLinuxディストリビューションの中でSlackwareの次に昔からあるLinuxディストリビューション。独自のパッケージ管理システム deb を採用しています。インストールが難しい、と言われていたが、Debian-Installer Project によって改善された。Debian LiveにあるインストーラーはCent OSなどと同じインストーラーを使っており、Debianインストーラーより更に使いやすくなっています。また、UbuntuやMint Linuxのような主要なOSのベースとなっています。
Ubuntu:Debianから派生したディストリビューションであるが、Canonicalという企業が開発を主導しています。デスクトップでの使用をメインにしており、現在では人気の高いディストリビューション。
SUSE Linux （現 openSUSE）:欧米で人気が高く、歴史が古い。先進的ではあるが安定的でないカーネルを搭載するのを避け、少し枯れてはいるが安定性の高いソフトウェアを採用しています。また、Xgl、AppArmor等の開発でも知られます（一部[https://ja.wikipedia.org/wiki/OpenSUSE openSUSE]より引用）。
Gentoo Linux [http://www.gentoo.gr.jp/ Gentoo Linux Users Group Japan]:FreeBSD の ports に似た独自のパッケージ管理システム portage を採用し、ソースコードからのビルドを基本とするため、さまざまなシステムを思った通りに構築できます。このため、メタ・ディストリビューションとも呼ばれています。Google Chrome OSは当初Ubuntuをベースに開発されていたが、2010年2月に portage を採用するため、ベースOSをUbuntuからGentooに変更した{{Cite web
|url=http://www.atmarkit.co.jp/news/201002/18/gentoo.html/
|title=Chrome OS、クロスコンパイルにGentooのPortage採用
|publisher=ITmedia
|date=2010-02-18
|accessdate=2022/06/27
|archiveurl=https://web.archive.org/web/20100220064317/http://www.atmarkit.co.jp/news/201002/18/gentoo.html
|archivedate=2010-02-20
。
UNIX上で動くGUI環境に、X Window Systemがあります。これは、サーバー / クライアント方式でグラフィカルな環境を提供するもので、通常はこの上に各種ツールキットを使ってGUI環境を構築します。
昔は、ツールキットや、デスクトップ環境、各種ソフトウェアが別々に配布されており、デスクトップの環境を作るのが大変でした。それを解決するものとして、ツールキット、デスクトップ環境、各種ソフトウェアなどをまとめて、統合デスクトップ環境というものが作られた。
主な統合デスクトップ環境にGNOME、KDE、LXDE、Xfce、Window Makerなどがあり、ツールキットはGNOME系では主にGtk、KDE系では主にQt、が使われ、他にもwxWidgetなどがあります。これらを使ってグラフィカルなアプリケーションを作成出来ます。
特にGNOME、KDEは、テキストエディタやファイルマネージャー、オフィスアプリケーションなどの周辺アプリケーションもあわせて提供されており、まとめて導入することによって、WindowsやMac OSなどといった先行するオペレーティングシステムに負けない程度の環境を作ることが出来ます。現在はGNOMEが優勢で、他にもとても軽量なLXDEなどを使う人も増えています。