はじめてUNIX で仕事をする人が読む本 の備忘録 02
お世話になった本
この連載ブログを書くにあたり、お世話になった本がこちら。LPICと被っているところもありますが、実務での使い方なんかも扱っており、良書だと思います。
- 作者: 木本雅彦,松山直道,稲島大輔
- 出版社/メーカー: KADOKAWA / アスキー・メディアワークス
- 発売日: 2014/03/25
- メディア: Kindle版
- この商品を含むブログ (5件) を見る
第2章 UNIXの基本操作
シェル
ターミナルを実行した時に起動するのが「シェル」と呼ばれるプログラム
シェルにはいくつか種類がある
- Bourne Shell 系
- sh
- bash
- Bourne Shell の上位互換
- 多くのLinux の標準シェルとして搭載されている
- ksh
- zsh
- C Shell 系
全てのシェルに共通する機能
- ユーザの入力を受け取り、コマンドを実行し、結果を表示する。この処理を繰り返す。(この一連の動作を
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)
いわゆる階層構造。
UNIXのファイルシステムは木構造。
節となる箇所がディレクトリ、その先の末端がノード。
ファイルはノードの一種。
ノードの一覧
ノードは、ファイルシステム内で「iノード」というデータ構造で表現される。
ファイルシステムの管理領域に配列として格納される。
配列へのインデックスがつけられる。これを「iノード番号」という。
基本のファイル操作
代表的な、ファイル操作のためのコマンド群の列挙
- cd - Change the shell working directory.
- pwd - print name of current/working directory
- ls - list directory contents
- mkdir - make directories
- rmdir - delete a directory
- cp - copy files and directories
- mv - move (rename) files
- rm - remove files or directories
- ln - make links between files
- cat - concatenate files and print on the standard output
- echo - display a line of text
- 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
必要な主要コマンド
- chmod
- ファイルのアクセス権(パーミッション)を変更する
- chown
- ファイルのオーナーを変更する
- chgrp
- ファイルの所有グループを変更する
- umask
- ファイル作成時のパーミッションに適用されるマスク値を保存する
パーミッションの特殊な例
ディレクトリに対するパーミッションの注意事項
ディレクトリに対する実行権はディレクトリをたどれる権限
となる。なので、注意が必要。
例)
/pen/pineapple/apple/pen2.txt
というディレクトリ構造があった時、
/pen/pineapple
に、読み取りなし、実行有りの権限があり、/pen/pineapple/apple
に読み取り有り、実行有りの権限があった場合、pen2.txt
にアクセスすることはできる。
sticky ビットとset-uid ビットset-gid ビット
それぞれファイルに対して設定した場合とディレクトリに設定した場合で異なる意味を持つ。
sticky ビット
chmod
コマンドのt
フラグで設定する。
実行ファイルにsticky ビットが設定されている場合
メモリに読み込まれた実行ファイルの内容が実行終了後もメモリに保持されたままになる。しかし、ハードウェアの進化により、この動作をしないものも増えているらしい。FreeBSD とLinux では、実行ファイルの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パケッケージのアーカイブ形式や、Linux のRAMDISK イメージのアーカイブ形式など重要なところで使われているらしい。
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
lzmaはWindowsおよび、Linux で利用される圧縮ツールらしい。が、使ったことがない。gzipやbzip2より圧縮率は高いがさらに遅いようだ。
zip
zip はWindows でも広く使われている。サフィックスは.zip
。なんと、FreeBSDでは、unzipのみ標準でインストールされているらしく、zipコマンドは別途インストールする必要があるらしい。しかも、unzipは多国語対応版ではないため、多国語対応版をインストールするのがベストとのこと。Ubuntu は標準でzip,unzip ともインストールされている。今後このような対応のディストリビューションが主流になるといいな。
man page
zip(1): package/compress files - Linux man page
その他のコマンド
テキスト関連
- more
- less
- lv
ファイルの差分を取る