UNIXという考え方 - UNIX哲学を読んで。 以下は自分向けのメモ。

UNIXOSである。現在普及しているLiluxはUNIX likeなOSであり、その基本的な思想や機能を受け継いでる。

ファイル

UNIXシステムにおいてファイルは最も重要なものとなる。 ファイルには任意の情報を収めることができるため、様々な種類のファイルが存在するが、次の3種類はなかでも重要である。

  • 通常ファイル
  • 実行可能ファイル
  • ディレクトリ

通常ファイル

テキストファイルとも呼ばれ、判読可能な文字が収められている。

実行可能ファイル

プログラムとも呼ばれ、コマンドとして呼び出される。 判読不可能なファイルであったり、シェルスクリプトのように特別な形式のテキストファイルがある。 例えばシェルは、判読不可能なbash実行可能ファイルであったりする。

ディレクトリ

ファイルを収めるフォルダのようなもの。 他のディレクトリに収めることができ、ディレクトリに収められたディレクトリはサブディレクトリと呼ばれる。

ディレクトリ

ディレクトリは他のディレクトリを格納できる。 これはUNIXシステムが全てのファイルに対してツリー構造を成すように導いている。 ツリーの先頭は、システム上で名前を持たないrootと呼ばれるディレクトリとなる。 これによりどのファイルにもシステムのルートからの相対位置を表す名前をつけることができる。 それらの名前は/で区切られた全てのディレクトリ名のリストとそれに続くファイル名で構成される。

このようなファイル名は、完全パス名または絶対パス名と呼ばれる。

作業ディレクトリ

ファイルを指定するのに完全パス名を使用しなければならないわけではない。 /をつけずにパス名を指定するとそのパスは、作業ディレクトリからの相対パスとみなされる。

ホームディレクトリ

ユーザのログイン時には、作業ディレクトはホームディレクトリと呼ばれる。特別なディレクトリに指定される。

ファイル名とワイルドカード

UNIXにおいてファイル名は重要のため、パターンで指定できる機能が組み込まれている。 ファイル名とパターンの照合には、ワイルドカードと呼ばれる記号が利用できる。

  • ?: 任意の1文字
  • *: 任意の文字列

ワイルドカード展開

シェルがコマンドラインを読み込んで処理する際には、ファイル名に対するワイルドカードが含まれた式を照合処理する。 これをワイルドカード展開またはグロビングと呼ぶ。 なお、コマンドはこの結果しか利用しない。

パス名展開

ワイルドカードはパス名の一部としても利用できる。 これはパス名展開と呼ばれる。 例えば/usr/と/usr2両方のディレクトリの全てのファイルを表示したい場合、コマンドラインls /usr\*を使うことができる。

標準入出力

UNIXの標準入出力は以下の2つの特徴を持つ。

  • ファイルの入出力は任意の長さの文字列(バイト)として扱われる。
  • データを生成する、あるいは受け取るものは全てファイルとして扱われる。

各UNIXプログラムは、以下の共通する3つの機能を持つ。

  • 標準入力の受付
  • 標準出力の生成
  • 標準エラー出力の生成

UNIXユーティリティ

UNIXのユーティリティは、日常の作業や大きなプログラムを構築する材料として利用できる。

例えばは以下はファイル名を引数として受け取り、標準出力に出力するUNIXユーティリティ群。

  • cat
  • sort
  • cut
  • sed
  • tr

シェル

シェルはUNIXのユーザインターフェースである。 通常はログインセッションを張って、対話形式でシェルを利用する。 ログインセッションは、exitまたはlogoutを入力した時、CTRL+Dキーを押した時に切断される。

コマンドライン

シェルのコマンドラインは、1つ以上のワードで構成され、ワードはそれぞれ空白またはタブによって区切られる。 ワードは以下に細分される。

  • コマンド
  • 引数(パラメータ)
  • オプション

コマンドラインの1つ目のワードはコマンドである。

それ以降はコマンドに対する引数またはオプションであり、コマンドの処理を定義する。

オプションは、あらかじめ用意されたコマンド固有の動作を指定するための特殊な引数である。 慣例として、-とそれに続く1文字として指定される。

リダイレクト

標準入力をファイルにリダイレクト

シェルでは標準入力をファイルにリダイレクトすることができる。 そのための構文は、command < fileになる。 これでcommandが端末ではなくfileから標準入力を受け取るようになる。

これはママが、子供に、「パパにあーんしてもらいなさい」というようなもの。 ユーザがママだとしたら、子供 < パパという構文になる。 ちなみにその場合パパはファイルであり、子供はコマンドである。

標準出力をファイルへリダイレクト

標準出力をファイルにリダイレクトすることもできる。 その場合の構文は、command > fileになる。 こちらは比較的イメージしやすい。 今まで画面に出ていたものを、ファイルに吐き出すようにするということ。

パイプライン

コマンドの出力を、別のコマンドの標準出力にすることもできる。 その場合には、|と表記されるパイプを使う。 これによって2つ以上のコマンドをつなげたコマンドラインのことをパイプラインという。 パイプラインの構文はcommand | commandとなる。

バックグラウンドジョブ

パイプは、一度に複数の作業を実行するという一般的な機能の特例である。 コマンドをバックグラウンドで走らせたい場合は、コマンドの後に&をつければ良い。 このように起動されたコマンドをバックグラウンドジョブと呼び、対照的に通常の方法で起動された処理をフォアグラウンドジョブという。 バックグラウンドジョブを開始すると、シェルプロンプトがすぐに戻ってくるため、別のコマンドを入力できるようになる。