わたしの名はフレイ 作家・デザイナー見習い
神々とともに生きる詩人 一等星シリウスの導きを信じて

シェル

ユーザーとカレントディレクトリ・ホームディレクト

UNIXにはユーザーやパーミッションという考え方があり、シェルにログインしプログラムを実行するユーザーによってプログラムが実行される「権限」が決められる。

また、UNIXコマンドラインシェルには「カレントディレクトリ」という考え方がある。これは、今の作業ディレクトリを意味しており、シェルには常にカレントディレクトリがどこであるか、という情報とともに、プログラムを「環境として」実行することができる。

また、各ユーザーには「ホームディレクトリ」というディレクトリが与えられる。これは/home/usernameに存在する。この中で、ユーザーは自由なデータやファイルを保管し、自由に作業することが出来る。

また、システムには管理権限を持つrootユーザーが一人存在し、システムを変更・破壊する権限を持つ。パッケージ管理システムなどでシステムをアップデートする場合は、root権限が必要な場合がある。シェルでrootユーザーになるためには、

$ su -
(rootユーザーのパスワードを入力)
#

と実行する。一般的に、通常ユーザーのシェルは$から、rootユーザーのシェルは#から始まる。コマンド入力例などでこの例があった時、$や#を入力する必要はない。(上の例では、通常ユーザーのシェルにsu -と入力すれば良い。$を入力する必要はない。)

sudoというコマンドを使うことで、いちいちrootユーザーにならなくても、特定のコマンドをrootユーザーで実行することが出来る。Ubuntuなどの一部の初心者向けディストリビューションではこちらのスタイルがとられる場合もある。

パイプとリダイレクト

あるコマンドを実行した結果の出力を、他のコマンドの入力として渡せる「パイプ」と、入出力とファイルを変換できる「リダイレクト」。

たとえば

find ~ | grep "2012"

とすることで、ホームディレクトリにある、「2012」を名前とパスに含むファイルを列挙出来る。

findで~の中を「サブディレクトリまで含めて」列挙し、そこからgrepで名前を検索する。

パイプは、使うとやみつきになる。UNIXは、こうした多数のコマンドプログラムに分けながら、ユーザーが自分の力で環境を操作することを哲学としている。

シェルスクリプト

基本的に、コマンドをそのまま列挙したファイルを作って、実行すればシェルスクリプト

だが、引数や関数定義が使えたり、if文なども出来るなど、応用範囲は多い。

UNIXでは、何でもかんでも再利用することで、応用性のあるシステム設計を行っている。

シェル変数と環境変数

コマンドライン環境の中で利用できる、変数のようなもの。

シェル変数と環境変数がある。シェル変数はシェルの中だけで保たれ、起動したプロセスには引き継がれない。シェル変数は、

$ FOO=foo

と設定する。

一度シェル変数を設定した上でexportすることで、環境変数を設定できる。

$ export FOO

コマンドのバイナリファイルを探すPATHやユーザーのホームディレクトリを探すHOMEなどが有名である。

コマンドの詳細

コマンドの詳細は、manと言うコマンドで見ることが出来る。

man ls

コマンドラインオプションは、例えば、詳細表示をしたい時は、以下のように使う。

ls -al

それ以上のコマンドの詳しいことは、manを参照のこと。manは、設定ファイルについても調べることが出来る。

PATHを通す

PATHを通すことで、新しいバイナリをインストールしたフォルダを追加することが出来ます。

エイリアス

エイリアスとは、コマンドの別名。

$ alias rm='rm -i'

このようにすると、rmコマンドを入力して実行した際、rm -iコマンドとして扱ってくれる。引数を指定せずにaliasを実行するとエイリアス一覧が見れる。

後日注記:面倒な長いシェルコマンドは、エイリアスにするのが楽。

ログイン・ネットワーク・セキュリティ

UNIXではマルチユーザーという仕組みを採用している。これによって、端末にログインし、その中のリソースにどのようにアクセスするかを、パーミッションという仕組みで管理することができる。

Windowsなどに慣れたユーザーからは考えづらいかもしれないが、Linuxはユーザーにログインして作業する、ということが一般的である。

ログインはローカル資源だけではなく、ネットワーク資源についても言える。SSHなどを使ってネットワークログインし、ネットワーク上で作業することもある。また、Apache httpdなどでは、外部ユーザーにネットワークからプロセス実行要求することもある。

ログインとパーミッションでは、コマンドを実行するユーザーに対して、そのファイルにどれだけアクセスできるのか、という考え方をする。一般ユーザーは/usr/binなどのシステムディレクトリは「破壊」することはできないが、自分の作業ディレクトリの中で自分のファイルを操作・処理するために「利用」することはできる。

ユーザーにはホームディレクトリが与えられ、この中にデータを保存して作業する。だが、大切な顧客のデータをホームディレクトリに保存することはできるだけ避けたい。SQL関係データベース管理システムを用いて、バックアップも定期的にとることが勧められる。ホームディレクトリを簡単な作業のために使うか、あるいは大事なデータの置き場所にも使うかは議論の分かれるところであるが、SQLサーバーなどを使うこともできるし、専用のユーザーを作って普段そのユーザーを使わないようにしても良いだろう。ApacheはホームページデータをDocumentRootで指定するが、/var/www/htmlなどを指定することが多い。

このほか、システムを「破壊」できるrootユーザーに制限をかけたり、HTTPなどのプロセス単位で制限をすることのできる、SELinuxというセキュアなLinuxも利用することができる。

UNIX系のOSでは、ログイン端末とユーザーの使うコンピュータを分けるなど、「コンピュータの分業化」が比較的やりやすいと言われる。ネットワーク透過なX端末のような発想はここから生まれている。だが、現代的な「パーソナルユーザー」が使うパソコン用OSとしては、少し古びて見えるかもしれない。だが、今日のGNOME/KDEなどは、Windowsの統合などを大きく超えている。GmailGoogle Driveのようなネットワーク上のサービスにログインしてファイルマネージャからアクセスしたりすることは容易である。だが、伝統的な仕組みも今なお提供されており、NFSなどを用いてネットワーク上にファイルサーバーを作ることも簡単にできる。