The Document of Aska

Linuxの基礎

UnixライクなOSの一群でありUbuntu/Redhat/Gentoo等数え切れない程種類がある。代表的なUnixとしてSolaris/MacOS Xがあり、UnixライクなOSとしてFreeBSD/OpenBSD/Linuxがあると覚えておけば問題ない。詳しいことはwikipediaでも見てくれ。

shell(シェル)

シェルは生活空間である

Unixを操作する際使用するプログラムで、bash等がある、Mac OS Xの場合ターミナルを起動すると利用出来る、リモートのLinuxを操作する場合、大抵sshで接続しデフォルトシェルが起動した状態から操作を行う。

この文章を読んでなんとなく「あーあの背景が黒いあの画面の事か」と思えればとりあえずそれでいい。

シェルが固まったと言えばこの操作画面が固まったという事を指す、Ctrl+Cで必死に強制終了を試みそれでも戻らない場合、別のshellからkillコマンドで落とす羽目になる。

会話例

  • 「シェル何使ってる?zsh?」
  • 「先生!シェルが応答しません!!」
  • 「しまった!!回線が切れてシェルが・・シェルがぁぁぁあああ!!」
  • 「あー、お客さんのサーバーなのにまた勝手にシェルの設定変えてるよ..」

シェルは生活空間なので人によって好みの設定が異なり、キー配置やショートカット等様々なカスタマイズが可能だ。しかし共用のアカウントのシェルの設定を勝手に変えるのはマナー違反である。

標準入力・標準出力・標準エラー出力

この説明は重要なので何度も読み返し分からなかったら聞いて下さい。

シェルでプログラムを実行した結果が画面に出力される、この時、プログラムにとっての出力先が「標準出力」である。標準出力と区別して「標準エラー出力」という出力先もあり、これはエラーを出力する為にあるが、画面で見てもどっちかわからない。この出力先というのは表現を変えるとチャンネルの様なものだ。

プログラムにとっての出力先は「ファイル」「標準出力・標準エラー出力」「通信先」位しか存在しない、また入力も同様である。

Unixではコマンドの実行結果、つまり標準出力を簡単にファイルに書き込むことが出来る。

# 日付が表示される
date
# 日付をファイルに追記する
date >> hoge.txt
# MySQLをバックアップした結果をファイルに書きこむ(上書き)
mysqldump dbname > hoge.dump

シェルでプログラムに入力を行う最も一般的な方法は「標準入力」を用いる方法である。

mysql dbname < some.sql

この様に、>は左のコマンドの

これは mysql コマンドに some.sql というファイルの内容を標準入力で与えている、mysqlコマンドからはsome.sqlというファイル名はわからず、単にテキストが流し込まれているようにしか見えない。

cat some.sql

これは cat コマンドに some.sql というファイル名を指定し、その中身を標準出力に出力してもらっている例である

cat some.sql | mysql dbname

この様にパイプを使うとあるプログラムの標準出力を別のプログラムの標準入力に流すことができる、Unixライクなシステムの便利さが分かるのはここからである。

なぜなら、コマンド単体では便利?といった感じのコマンドも、互いに組み合わせることで真価を発揮するからである。

  • 拡張子が.gitで終わるファイルの一覧を日付順でソートしてtar.gzで固める
  • 最終更新日時が1年以上昔のファイルを削除する
  • Chromeぽいアクセスログだけ監視する

など、コマンドを組み合わせることでいちいちプログラムを書かなくても大抵のオペレーションは可能である。

先程の>は特に「リダイレクト」と呼ぶ、|はパイプと呼ぶ、いずれも「標準出力」の出力先を曲げるもので「標準エラー出力」はそのまま画面に表示される。

コマンドによってデータの書き出しは標準出力、書き出し完了等のメッセージはエラーでなくても標準エラー出力に出すものがある、これはデータをリダイレクトされる前提で、メッセージが混入しない様に配慮している。

標準エラー出力をリダイレクトする場合、以下の様にする。

some 2> some.err

「標準入力・標準出力・標準エラー出力」というキーワードはコマンドの説明に頻用するのでだんだん意味が分かってくると思う。

環境変数

環境変数とはプロセスに付随するデータである、プロセスが他のプロセスを起動する時この値はコピーされ継承される。

よく使用する環境変数に「PATH」があり、これはシェルがコマンドを探す際に参照するパスを指す、コロンで複数のディレクトリを指定できる。

プログラムが他のプログラムを実行する際この値は継承される為、プロセス間通信にも用いられる。

簡単な例だと「DEBUG=1」という環境変数を設定してプログラムを起動するとデバッグモードになる、などである。

例えば日本語環境のMac OS Xで以下の様にコマンドを打つと、出力結果が異なるのが分かるだろう。

# 日本語で日付が出る
date

# 英語で日付が出る
LANG=C date

# 日本語で日付が出る
date

上記の例ではLANG環境変数Cをセットしてプログラムを起動している、しかし都度指定するのは面倒だという場合exportコマンドでシェルの環境変数を設定する

export LANG=C
# 英語で日付が出る
date
export LANG=ja_JP.utf8
# 日本語で日付が出る
date

しかしこの作業をシェルを起動する度に実行するのも面倒になる、そこで利用するのが.bashrc, .bash_profileである。

Ubuntu等大抵のLinuxのbashは.bashrc、Mac OS Xは.bash_profileをbash起動時に読み込む、ここにexportを書いておけば楽できるわけだ。

私は使い分けるのが嫌なのでMacの.bash_profileに.bashrcを読むという記述を書いている。

モードとオーナーとパーミッション

まずはターミナルでls -laを叩いてみよう。

aska-mbp% ls -la
total 608
drwxr-xr-x  13 aska  staff     442  4 22 14:55 .
drwxr-xr-x@ 16 aska  staff     544  4 24 21:13 ..
-rw-r--r--@  1 aska  staff   15364  3 14 19:28 .DS_Store
drwxr-xr-x  19 aska  staff     646  4 12 23:39 Burger
drwxr-xr-x  13 aska  staff     442  4 22 23:28 DocLife
drwxr-xr-x   5 aska  staff     170  2 26 00:14 chrome-extentions
drwxr-xr-x   3 aska  staff     102  2 26 00:14 dot-files
drwxr-xr-x   5 aska  staff     170  3 30 21:24 dropbox-sync-down
-rw-r--r--   1 aska  staff  294557 11  8 20:46 ex.zip
drwxr-xr-x  14 aska  staff     476  4 14 23:25 markdown-binder
drwxr-xr-x  11 aska  staff     374  4  2 16:22 markdown-diary
drwxr-xr-x@ 26 aska  staff     884  4 21 22:03 masterspark
drwxr-xr-x   8 aska  staff     272 11 27 00:34 mime-parser-delux

このコマンドはカレントワークディレクトリのファイル一覧を標準出力に出力するコマンドである。

-lオプションは表示形式の指定で、この例のように属性やサイズ・更新日時を伴って1行1ファイルで出力される。

-aオプションはドットから始まるファイルも表示するオプションで、手が勝手に打ってしまう為オプションを外す事はまずない。

逆にファイルの一覧のみが欲しい場合-1オプションを使う。詳しくはコマンド紹介にて。

本題に戻ると、上記の出力結果のdrwxr-xr-xがファイルのモード、askaが所有者、staffがグループを表している。

モードをさらに詳しく説明すると d がディレクトリ r が読み込み権限 w が書き込み権限 x が実行権限を表す、rwxは3ブロック存在し、先頭から所有者、グループ、その他の権限を表す。

drwxr-xr-x は 数値表現だと 0755 となり、-rw-r--r-- は数値表現だと 0644 となる、つまり -rw------- は 0600 だ。

このモードの文字列表現を見て誰にどこまでの権限があるのか解るようにならないと話にならない。

このモードを変更するコマンドがかの有名なchmodである、chmod 0644 fooでfooのモードを0644にするという意味があある。因みに、ファイルは複数指定できる。

chmod 0600 hoge foo bar

次にオーナーの話である。

オーナーはファイルの所有者という意味で、グループはファイルがどのグループに属するかという意味となる。

オーナーであるユーザもグループに属するのでグループでwebmasterとかいったグループを作り、メンテナみんな所属しファイルにグループを設定すればそのグループのメンツだけ編集できるファイルを作る事が出来る。

設定ファイル

よくいじる設定ファイル

  • /etc/hosts
  • /etc/resolve.conf
  • /etc/ntpd.conf
  • /etc/ssh/sshd_config