takashi kono's blog

コーヒーとキーボードと共に何かを記録していくブログ

はじめてUNIXで仕事をする人が読む本 の備忘録 02

はじめてUNIX で仕事をする人が読む本 の備忘録 02

お世話になった本

この連載ブログを書くにあたり、お世話になった本がこちら。LPICと被っているところもありますが、実務での使い方なんかも扱っており、良書だと思います。

第2章 UNIXの基本操作

シェル

ターミナルを実行した時に起動するのが「シェル」と呼ばれるプログラム

シェルにはいくつか種類がある

  1. Bourne Shell
    1. sh
    2. bash
      1. Bourne Shell の上位互換
      2. 多くのLinux の標準シェルとして搭載されている
    3. ksh
    4. zsh
  2. C Shell 系
    1. csh
    2. tcsh

全てのシェルに共通する機能

  • ユーザの入力を受け取り、コマンドを実行し、結果を表示する。この処理を繰り返す。(この一連の動作をRead-Evaluate-Printの頭文字を取ってREPループと呼ぶことがある)。
  • ユーザが、操作している端末を制御する。例えばCtrl + C を押した時に、プロセスに停止シグナルを送る処理などがこれに含まれる。
  • シェルは変数を持ち、コマンド実行や結果表示の方法などをカスタマイズできる。
  • コマンドの入出力のパイプラインや、ファイルへのリダイレクトを制御する
  • alias やfunction という機能で、操作をマクロ化出来る。

ちなみにUNIX / Linux のシステムの挙動を決めるマクロ群は/etc/rc 等にあるが、これらはBourne Shell(/bin/sh)で書かれている。そのため、これだけでも読めるようになる方が良い。

$ head -1 /etc/rc 
#! /bin/bash
$ 

変数 シェル変数環境変数がある。 シェルが持っているのは、シェル変数のみ。環境変数はプロセスごとに割り当てられた変数空間にある。

 環境変数には、設定情報やプログラムの挙動を指定する値を代入する。例)http_proxy = http://example.jp:8080/ プログラムを実行すると、実行元の環境変数のコピーが渡される。環境変数は自分自身と自分の子供にしか影響を与えない。
 シェル変数は、シェルの中だけで使える変数。

$ LANG=C (シェル変数への代入)
$ export LANG (シェル変数を環境変数にエクスポートする)

リダイレクションとパイプ

 UNIX / Linux でコンソールへの文字表示を行うとき、printf などの関数を使う。これらは標準入力から読込、標準出力に出力している。エラーの場合は、標準エラー出力に書き込まれる。  パイプと呼ばれる入出力機構を用いると、あるコマンドの標準出力を別のコマンドの標準入力に渡せる。

$ tail -1 /etc/passwd | awk -F: '{print $6}'

 標準出力の内容をファイルに書き出す事を、リダイレクトという。

$ ls -l > foo.txt

ls -l の標準出力を、foo.txt という名前でカレントディレクトリに保存する

標準エラー出力と標準出力を合わせて書き出す場合は下記

borne shell での例
$ tail -10 foo.txt > stdout_and_err.txt 2>&1

パイプは複数連結できる。途中で値を出力しつつ、次のコマンドの標準入力にそのまま値は渡したいという時に使えるのが、teeコマンド。名前の由来があるらしい。データの流れと、「T」という文字の形を重ねあわせると想像できる。

$ command_A | tee file | command_B > file.txt

上記のように使用する。

UNIXファイルシステム

UNIXの基本がファイル操作。ほとんどのシステム資源をファイルとしてアクセスできる。

特徴

  • 可能なものはすべてファイルシステムノードで表す(名前空間)。
  • データ形式を強要せずバイトストリームとして扱う。
  • コマンドは標準入力から読んで標準出力に書き、複数のコマンドの入出力を連携したパイプが更生できる。パイプはファイル入出力と同様に扱える。

ディレクトリ構造で現在多く使われているのが、FHS(Filesystem Hierarchy Standard)
いわゆる階層構造。

参考: Linuxのディレクトリ構造(一覧)を理解する

UNIXファイルシステム木構造
節となる箇所がディレクトリ、その先の末端がノード。
ファイルはノードの一種。

ノードの一覧

ノードは、ファイルシステム内で「iノード」というデータ構造で表現される。
ファイルシステムの管理領域に配列として格納される。
配列へのインデックスがつけられる。これを「iノード番号」という。

  • ハードリンク
    • 異なるファイル名が同じiノード番号を指す。
    • 同じパーティション内で異なるファイル名を付与できる。
    • ディレクトリへのハードリンクは作成できない。
  • シンボリックリンク
    • 特殊なファイルにリンク先へのパスが記録されている。
    • パーティションをまたいだリンクも作成することができる。
    • ただし、参照時ディスクアクセスが一回増えることになる。

基本のファイル操作

代表的な、ファイル操作のためのコマンド群の列挙

  1. cd - Change the shell working directory.
  2. pwd - print name of current/working directory
  3. ls - list directory contents
  4. mkdir - make directories
  5. rmdir - delete a directory
  6. cp - copy files and directories
  7. mv - move (rename) files
  8. rm - remove files or directories
  9. ln - make links between files
  10. cat - concatenate files and print on the standard output
  11. echo - display a line of text
  12. test - check file types and compare values

パーミッション・オーナーの管理

ls -l の一番左側に出てくる10桁の文字列

  • 一番左のビット
    • スティッキービット
  • 次の3ビット
    • owner のread/write/execute
  • 次の3ビット
    • group のread/write/execute
  • 最後の3ビット
    • other のread/write/execute

必要な主要コマンド

  1. chmod
    1. ファイルのアクセス権(パーミッション)を変更する
  2. chown
    1. ファイルのオーナーを変更する
  3. chgrp
    1. ファイルの所有グループを変更する
  4. umask
    1. ファイル作成時のパーミッションに適用されるマスク値を保存する

パーミッションの特殊な例

ディレクトリに対するパーミッションの注意事項

ディレクトリに対する実行権はディレクトリをたどれる権限となる。なので、注意が必要。
例)
/pen/pineapple/apple/pen2.txt というディレクトリ構造があった時、 /pen/pineapple に、読み取りなし、実行有りの権限があり、/pen/pineapple/apple に読み取り有り、実行有りの権限があった場合、pen2.txt にアクセスすることはできる

sticky ビットとset-uid ビットset-gid ビット

それぞれファイルに対して設定した場合とディレクトリに設定した場合で異なる意味を持つ。

sticky ビット

chmod コマンドのtフラグで設定する。
実行ファイルにsticky ビットが設定されている場合
メモリに読み込まれた実行ファイルの内容が実行終了後もメモリに保持されたままになる。しかし、ハードウェアの進化により、この動作をしないものも増えているらしい。FreeBSDLinux では、実行ファイルのsticky ビットは無視される。

ディレクトリにsticky ビットが設定されている場合
そのディレクトリ配下のファイルの削除や名前変更は、ファイルの所有者、ディレクトリの所有者、rootしかできなくなる。
/tmpなどで用いられるらしい。

/tmpはすべてのユーザへの書き込み権限がついているため、作成したものを他者が削除できる。これを回避するために、一般ユーザが他者のユーザのファイルを削除できないようにしている。

set-uid ビットとset-gid ビット

chmod コマンドのsフラグで設定する。

実行ファイルにset-uid ビットが設定されている場合
そのプログラムは、ファイルのオーナー権限(実効UID) で実行される。
実効ファイルにset-gid ビットが設定されている場合 そのプログラムは、ファイルのグループ権限(実効GID) で実行される。

ディレクトリにset-gid ビットが設定されている場合
配下に作成されたファイルはディレクトリのグループを引き継ぐ。
グループ内でファイルを共有する時に有効らしい。Git など複数のユーザで開発作業を行う場合に使われる。

ディレクトリにset-uid ビットが設定されている場合 Linux では無視され、FreeBSD では、set-gid ビットと同じ動作をする。

正規表現

正直、ここで扱える範囲を超えていると思うので紹介くらいにしておく。

正規表現(Regular Expression) とは、文字の種類や出現順序の規則によるテキストの表現方法のこと。文字列の検索や編集で使われる。

正規表現で使用する記号
先駆者がまとめてくれていますので、そちらをみた方が良いでしょう。というのも、正規表現は標準と拡張の2種類存在し、ほぼ互換はあるが、一部使えないものがあります。幾つか参考ページを紹介します。
基本正規表現 (BRE) と拡張正規表現 (ERE) - 気ままなブログ
どのUNIXコマンドでも使える正規表現

また以下のようなWebサービスのように正規表現の確認ができるサービスや、テキストエディタプラグインもある。
RegExr: Learn, Build, & Test RegEx

grep

grep コマンドの基本的な機能は、指定された入力(ファイル、標準入力)から、指定されたパターンにマッチする文字列を含む行を選択すること。

基本的な使い方

$ grep <pattern> <file name>
$ grep user /etc/passwd  <- /etc/passwd にある、user が含まれる行のみを表示

これも、解説しだしたら深いので、紹介だけにしておく。 Man page of GREP
grep コマンド | コマンドの使い方(Linux) | hydroculのメモ

sed

sedコマンドは、stream editor という意味を持つらしい。(知らなかった)
ファイルや標準入力から読み取ったデータを、指定されたコマンドに基づいて編集して出力する。パターンマッチだけでなく、文字列の置換や並べ替えといった、より複雑な編集を行うことができる。

基本的な使い方

$ sed 'script' <file name>
$ sed 's/linux/LINUX/g' file.txt <- file.txt に存在する全てのlinux という文字列をLINUXに置換

このコマンドも紹介だけしておく
Man page of SED
sedコマンドで覚えておきたい使い方12個(+1個) | 俺的備忘録 〜なんかいろいろ〜

awk

awk は、指定された入力を1行ずつ読み込み、パターンにマッチした行に対してある処理を行う。

基本的な使い方

$ awk 'program' <file name>
$ awk '{print $1} file.txt <- file.txt の各行の空白で区切られた一番左側のカラム?だけを表示する

このコマンドも紹介だけしておく
AWK(1) - 汎用コマンド - YOS OPENSONAR
Man page of GAWK

アーカイバ

複数のファイルを1つにまとめ、さらに圧縮することでデータの保存や交換を便利に行うことができる。
ここでは、私が使っているコマンドを紐解き、紹介したい。

tar

UNIXに古くからあるアーカイブツールらしい。tape archiver の略称のようだ。tarでまとめられたアーカイブファイルをtarファイルと呼ぶこともある。伝統的にサフィックスとして.tarがつけられる。
tar にも種類があり、形式が異なるtarファイルは解釈できないことがある。注意が必要。

tar の代表的なオプション

man page
Man page of TAR

上記オプションを踏まえて使用例

# archive.tar.gz ファイルをHOMEディレクトリに展開
$ tar zxvf archive.tar.gz ~/

# /foo/bar をまとめてgzip 圧縮して、archive.tar.gz という名前で保存
$ tar czvf archive.tar.gz /foo/bar

その他の使用例
Linuxコマンド【 tar 】アーカイブの作成・展開 - Linux入門 - Webkaru

cpio

正直使ったことない。
UNIXの標準アーカイブツールとして用意されたもの。copy in and outの略称らしい。
RPMパケッケージのアーカイブ形式や、LinuxRAMDISK イメージのアーカイブ形式など重要なところで使われているらしい。

man page は存在した
Man page of CPIO

compress

UNIXで古くから使われている圧縮ツール。
compress で圧縮されたファイルのサフィックス.z

man page
compress(1): compress/expand data - Linux man page
日本語版は無かった。

gzip

GNUプロジェクトで開発された圧縮ツール。現在最も広く使われている。サフィックス.gz。また、tarでアーカイブされたものをさらにgzipで圧縮したファイルをtarballと呼ぶこともある。このときのサフィックス.tar.gzまたは.tgzとなる。

man page
Man page of GZIP

bzip2

bzip2 は圧縮率はgzipより良いが、処理速度が若干劣るらしい。サフィックス.bz2。tarと合わせたときのサフィックス.tar.bz2となる。

man page
Man page of bzip2

lzma

lzmaWindowsおよび、Linux で利用される圧縮ツールらしい。が、使ったことがない。gzipやbzip2より圧縮率は高いがさらに遅いようだ。

zip

zip はWindows でも広く使われている。サフィックス.zip。なんと、FreeBSDでは、unzipのみ標準でインストールされているらしく、zipコマンドは別途インストールする必要があるらしい。しかも、unzipは多国語対応版ではないため、多国語対応版をインストールするのがベストとのこと。Ubuntu は標準でzip,unzip ともインストールされている。今後このような対応のディストリビューションが主流になるといいな。

man page
zip(1): package/compress files - Linux man page

その他のコマンド

テキスト関連

  1. more
  2. less
  3. lv
    1. テキストファイルの内容を1画面ごとに表示する。more,less と同等の機能を持つ。更に、UTF-8を含む多彩な文字コード変換機能も持つ。FreeBSDUbuntu共に、lvは標準ではインストールされていない。使ったことない。

ファイルの差分を取る

  1. diff
    1. 2つのファイル又はディレクトリ(サブディレクトリも含む)を比較できる
  2. diff3
    1. 3つのファイルの比較が出来る