UP | HOME

UNIX/Linux勉強会資料

初出
2007-11-17

1. はじめに

1.1. 本日の講師

  • UNIX歴は約13年。
  • ふだんはJavaプログラマ

1.2. 本日のゴール

  • UNIXを使うときの基本的な考え方を知り、楽しく便利にUNIXを活用できるようになる。
  • UNIXって便利で面白いもんだな、暮らしに役立つな、と思ってもらう
  • Windowsとは違う世界を体験してもらうことで、新たな視点を導入する。

2. UNIXとLinux

2.1. UNIX

  • 代表的なオペレーティングシステム(OS)の1つ。
  • 多くのコンピュータ技術の方向性に多大な影響を与えた
  • 「UNIX」が何を指すかはその時々で違う。
    • UNIX風のシステム
    • 規格/商標の名前。現在は The Open Group はUNIXの商標を保持
    • 最近はPOSIXという規格がほぼUNIXを指しているという説あり

2.1.1. 特徴

  • マルチユーザー、マルチタスク(いまはわりと当たり前)
    • 管理者(root)とユーザーが分かれている
  • 高級言語(C言語)で記述されていることによる高い移植性
  • 長い歴史にもまれ、安定動作する
  • ソフトウェア開発環境として優秀
  • 科学技術計算や各種エンジニアリング分野で活躍
    • UNIXワークステーション、PC-UNIX
  • インターネットの技術の多くはUNIXで生まれ育った
    • TCP/IP, email, ftp, WWW

2.1.2. 歴史

  • 1969年ごろに誕生
  • AT&Tベル研究所のケン・トンプソン、デニス・リッチーが開発
  • 数年後にC言語で書き直される
  • その後、数々の亜種が生まれ、分裂や統合を繰り返して現在に至る http://www.levenez.com/unix/history.html
  • 大きくわけるとAT&T系のSystem VとUCB系のBSDがある
    • 種類が違うとコマンドのオプションとか挙動が微妙に違う
  • ちなみにC言語はUNIXの開発に際して作られた言語といって良い
    • デニス・リッチー(K&RのR)作。K&RのKはawkのK。

2.1.3. UNIXでの考え方の一例

  • テキストファイルが大切
    • 設定変更にはテキストファイルを編集
    • データを空白で区切ったテキストファイルの処理に長ける
  • 単純なものを自由に組み合わせる
  • 20の努力で80の成果
  • ないものは作る
  • いろいろと省略する
  • 互助の精神

2.2. Linux

  • UNIX系OSの1つ
  • "Linux"は、OSの核(カーネル)の名前であり、単体では利用できない
  • 利用できるようパッケージした数々の「ディストリビューション」がある
    • Debian, Ubuntu, KNOPPIX, Gentoo, TurboLinux
  • オープンソースであり、フリーソフトウェア。GNU GPLで配付。
  • フィンランドの学生、リーナス・トーバルズが開発し、多数のプログラマを巻き込んで進化を続け、現在に至る

2.3. GNU

  • フリーソフトウェアとしてUNIXに似たOSを作るプロジェクト
    • リチャード・M・ストールマンが開始
    • GNU's Not Unix
      • 「私の名前は私の名前です」みたいなもん。
    • 「フリーソフトウェア」は「無料」ではなく「自由」なソフトウェア。
      • 誰でも「自由」に開発、利用、コピー、改変できる。
  • 各種ユーティリティ、Cコンパイラ、ライブラリなどを開発
    • GCC, glibc, GNU Emacs、bashなど
  • カーネル(GNU Hurd)は開発初期段階
    • Linuxをカーネルとして用いたものをGNU/Linuxと呼ぶ
      • 実際はGNUツール類も含めて「Linux」と呼ばれることが多い

2.4. Linux以外のUNIX系OS

  • Solaris, AIX, HP-UX, Mac OS X(Darwin), FreeBSD, OpenBSD, NetBSDなど。

2.5. X Window System

  • UNIX系OSで広く使われているウィンドウシステム。80年代にMITが開発。
  • 「X Windows」や「X Window」ではないことに注意。略すなら「X」または「X11」。
  • ネットワーク透過、クライアント・サーバ方式
  • PC-UNIXではXFree86が一般的だったが、ここで数年X.Orgに移行。
  • Xが管理しているのはウィンドウの中身だけで、UIの多くはウィンドウマネージャが担当。

2.6. KNOPPIX

  • 本日利用するディストリビューション
  • ハードディスクにインストールせずとも、CDで起動して使えるLinuxディストリビューション。
  • 産総研が日本向けにカスタマイズしたものをリリースしている

2.7. UNIXと日本語

2.7.1. 文字コード

  • JIS、シフトJIS、EUC-JP、UTF-8
  • UNIXではEUC-JPが一般的だったが、最近はUTF-8に移行している。

2.7.2. 日本語入力

  • Kinput2, Anthy, uim, SKK, PRIME
  • たくさんあってわかりにくい

2.7.3. フォント

  • 自由に利用できる日本語フォントは貴重。まだまだ不足している。
  • フォントはお金を出して購入すれば利用できる。

3. UNIX操作の基礎

3.1. CUIとGUI

  • UNIXはもともとコマンドラインで利用する
  • CUIは不便かというとそうでもない
  • 向き不向きがあるが、我々の作業の多くは文字ベース
  • CUIも進化している。何から何までタイプしなくてもよい

3.2. シェル

  • システムとのやりとりをする際の主となるプログラム。WindowsならExplorerあたりが該当。
  • シェルにもいろいろある。おすすめはzsh。今日は主にbashを用いる。
  • sh(系)
    • オリジナルの/bin/sh(Borneシェル、Bシェル)とその子孫たち。
    • ksh, bash, zsh
  • csh(系)
    • ビル・ジョイによるCに似た構文のシェルとその子孫たち。
    • tcsh

3.3. ファイル

  • ファイル
    • UNIXではいろんなものがファイル扱い。デバイスファイルなど。
  • カレントディレクトリ
  • フォルダとディレクトリ
    • フォルダはMacやWindowsでディレクトリを指す言葉。
    • ディレクトリの区切り文字は'/'。/usr/bin/ls など。URLと同じ。
  • 基本コマンド ls, cd, pwd
  • 相対パスと絶対パス
    • 絶対パスはルートディレクトリ(/)から記述。/bin/shなど。
    • 相対パスはカレントディレクトリを起点にパスを記述。
      • カレントディレクトリが違えば意味が違う。
      • 1つ上のディレクトリは「..」と表わす ../bin/ls など
  • 代表的なディレクトリ構成(種類によって異なる)
    • / ルート。単一の根となるディレクトリがある Windowsではドライブに分かれており単一の根はない。
    • /bin 実行可能プログラムが入っている。ごく基本的なもののみ。
    • /lib ライブラリ。
    • /usr/bin ユーザー向け実行可能プログラム。
    • /usr/lib ユーザープログラム向けライブラリ
    • /usr/local そのサイトでインストールしたものを置く /usr/local/bin など
    • /home ホームディレクトリを置く /home/kaneuchi など。
    • /mnt ハードディスクなどをマウントする領域

3.4. 基本機能

  • ヒストリ。前に入れたコマンドを再現可能。
  • 補完。入力候補(コマンド、ファイル、ディレクトリ)を自動入力。
  • ワイルドカードの展開(*, ?)。名前の条件でファイルを指定。
  • バックグラウンド実行(&)
  • 連続実行(;, &&)
  • エイリアス。長いコマンドを別名で定義

3.5. とりあえずやってみよう

  • ls ファイルの一覧
  • echo 引数を表示
  • more ファイルの内容を表示
  • less ファイルの内容を表示
  • wc 単語を数える
  • grep 条件に合う行を抽出
  • bc 計算する
  • mv ファイルの名前変更
  • rm ファイルを消す
  • find 検索 find . -name "*.dat" -print find . -type d -print
  • date 日付表示
    • date -d '2 weeks'
    • date -d '2006-11-22 100 days'
    • date -d '2006-11-22 -100 days'
  • cal カレンダー表示
    • cal 1975

3.6. 複数コマンドを組み合わせる

  • リダイレクション。出力先の切り替え。 ls -l > ls-l.txt bc < input.dat
  • パイプ。あるコマンドの出力を他のコマンドの入力とする ls -l | less
  • バッククオート。コマンドの出力を引数にする
    • xargsというのもある

3.7. シェルスクリプト

  • 一連の定型作業をあらかじめ書いておいて、自動的に実行できるようにする。
  • 基本的にはコマンドを並べたテキストファイル。
  • sh filename で内容を自動的に実行できる
  • filenameだけで実行できるようにするには
    • 先頭に#!/bin/shとつける(/bin/sh用の場合)
    • ファイルに実行権限をつける chmod u+x filename
  • 引数、変数
  • 制御構造
    • 単純フロー
    • 繰り返し for/while
    • 条件分岐 if/case
    • 関数

3.7.1.

#!/bin/sh
# rename foo bar
# カレントディレクトリにある*.fooについて、bar-1.foo, bar-2.foo という名前に変える
index=1
for file in *.$1
do
    basename=`basename $file $1`
    name=$2-$index.$1
    mv "$file" "$name"
    index=`expr  $index + 1`
done

3.7.2. 例題

カレント以下の各ディレクトリにおいて、その名前とファイル、ディレクトリ数を出す

3.7.3. コツ

  • 部分的に試しながら作る
    • 途中段階で思ったとおりの出力になっているか、など
  • いまの自分のニーズを満たす、最低限度のもので良い。
    • 使い捨てるつもりでサクっと作る
    • 将来の自分や、他人が使うときのことはとりあえず考えない
      • そのためにはエラーチェックとかいろいろ考えなくちゃいけない
  • ぜんぶ覚える必要はない
    • だいたいどんなことができるのか
    • どんなことならできそうか
    • どのへんをどうやって調べればいいのか
    • やりたいことをできることの列に落とし込む
  • コンピュータにもわかりそうなことはコンピュータに判断させる
    • いくつあるか?
      • 行、単語、文字など
    • どんなパターンか?
    • ソート
    • 計算
    • 今日の日付
    • わからないこと
      • 文章の意味
      • ユーザーの意図
      • 善悪
      • 今日の天気(ウェブサービスを使えばわかるかも)

4. テキスト編集

4.1. テキスト編集は重要

たくさんの作業がテキスト編集で成り立っている

  • コマンド
  • メール
  • シェルスクリプト
  • ソースコード
  • ドキュメント

4.2. viとvim

4.2.1. これは何?

  • くせがあるけど、たくさんのファンがいる優秀なエディタ
  • 使いこなせば超強力に
  • UNIXと名乗るものならまず入っている
  • Windowsとかでも使える
  • 大事なのは、いかに手を動かさずに目的を達成できるか
    • カーソルキーとかマウスは遠い

4.2.2. 基本機能

  • モードの切り替え
  • 終了方法(重要)
    • :q
  • 保存
  • カーソル移動
    • 50行移動とか
  • 検索、置換機能
    • /foobarしてnで次を探す
  • コピーペースト

4.2.3. 効率的なテキスト編集のための7つの習慣

  • 7 habits of effective text editingという文書がある
  • 7 habits for effective text editing 2.0というビデオがある(Google Tech Talk)
  • 目的の場所まで素早くカーソルを動かすこと、同じことを繰り返さないこと、など
  • 基本
    1. 非効率な部分に気付く
    2. もっといい方法を知る
    3. その方法を習慣にする

4.3. フィルタ

  • cat 中身の表示、ファイルの連結
  • sort ソートする
  • uniq 重複行を取り除く(要事前ソート) -c で数えてくれる
  • sed 置換する sed -e 's/foo/bar/g'
  • paste
    • 列をたしあわせる
    • 行と列を入れ替える
  • grep 条件にあった行を抽出
  • awk 行単位の各種テキスト処理
    • 表の列の入れかえ awk '{print $2, $1}' data.dat
    • ヒストリの解析 history | awk '{print $2}' | sort | uniq -c | sort -r

4.4. 正規表現(Regular Expression: regexp)

  • 特定の文字列ではなく、「パターン」を表現する
  • grepやsedなど、多くのツールがサポート
    • UNIX以外のツールでもサポートされている
  • 検索や置換に使う。マッチしたパターンの一部だけ置換できる
    • 利用例
      • すべてのメールアドレスのユーザ名を「xxxx」にする
      • すべてのURLを<a href=…>を使ってHTMLのリンクにする
  • マスターすればテキスト処理が超強力に
  • 正規表現の例
    • Subject: で始まる行
      • ^Subject:
    • 4桁の数字
      • [0-9][0-9][0-9][0-9]
    • アルファベットの単語
      • [A-Za-z]+

4.5. diffとpatch

  • diffは2つのテキストファイルの差分を検出
  • patchはa.txtとb.txtのdiffの結果をもとに、a.txtの内容をb.txtに変換する

4.6. Emacs

  • viと双璧をなす歴史と伝統とファンを持つエディタ
  • 何でもできる(ファイル操作、メール、計算、ゲーム、ウェブなどなど)
  • WindowsではMeadowというEmacsの派生バージョンが使える
  • MacではCarbon Emacs Pakcageがある
  • あとでデモします

4.7. 例題

  • あるディレクトリ内のtxtファイルのうち、行数の多いもの順に並べて表示しよう
  • あるディレクトリ以下のtxtファイルの行数の総計は?

5. 情報の調べかた

5.1. 基本

  • man 標準的なマニュアル参照コマンド
  • info GNU系のものはinfo形式になっているものが多い
  • コマンドに-hとか–helpつけてみる
  • とりあえず動かしてみる

5.2. ウェブで検索

  • Google
    • googleコマンドの自作なんてどうでしょう。
    • シェルスクリプトで、いくつかの単語についてgoogleで何件あるか抽出してみよう
  • Wikipedia
  • ただしどれも鵜呑みにしてはいけない

5.3. その他

  • Cheatsheetを手近に置いておく
  • 達人が使っている様子を眺める
    • スクリーンキャスト(操作している様子をビデオにして公開しているもの)を探す
  • ソースコードを読む
  • 勉強会にいく(関西Debian勉強会とか)

6. UNIXでの暮らし

6.1. データ処理

  • アドレスDBがあって、その中にある名前のリストが別にある。個々の名前に対応するアドレスとともに出力せよ。
  • 金額の合計は?
  • データファイルにある名前の頻度ランキングを出そう

6.2. ソフトウェアのインストール

  • バイナリパッケージ
    • Linuxディストリビューションの多くがパッケージ管理システム(apt, RPMなど)を備える
      • 依存関係なども管理してくれて便利
      • 誰かがパッケージを作ってくれないと使えない
  • ソースから
    • めんどくさい
    • 正式対応してなくても何とかなることがある
    • 基本は ./configure; make; make install

6.3. アーカイブ

  • tar ひとつのファイルにまとめる。無圧縮。
  • gzip 拡張子gz。 1つのファイルを圧縮する。一般的。
  • bzip2 拡張子bz2。gzipよりも高圧縮率。
  • zip Windowsと同じ
  • tar.gz (tgz) tarでまとめたものをgzで圧縮
    • tar xvfz foo.tar.gz で展開
    • tar cfvz foo.tar.gz foo で作成

6.4. デスクトップ環境

  • GNOME、KDEが有名
  • だんだんWindowsみたいになってきた

6.5. 書類を作る

  • LaTeX
    • キレイにフォーマット
    • WYSIWYGとは対極
    • コメントアウトとかできて便利
  • SmartDoc
  • Emacs Org Mode

6.6. 絵を描く

  • Tgif/GIMP/Diaあたりは有名。
  • OpenOffice.org
  • gnuplot
  • GNU plotutils

6.7. メモをとる

  • シェルスクリプトで作る
#!/bin/sh

memodir=$HOME/memos

if [ ! -d $memodir ]; then
    mkdir $memodir
fi

datestr=`date +%Y-%m-%d-%H%M%S`
memo=$memodir/memo-$datestr.txt
echo $memo

vi $memo
  • Emacsを利用
    • ChangeLogメモ/howm/org-modeなど

6.8. メールを読む

  • mutt
  • Mew(Emacs用)
  • Wonderlust(Emacs用)
  • Sylpheed(日本製)
  • Thunderbird

6.9. ウェブを見る

  • w3m
  • Firefox
  • emacs-w3m

6.10. UNIXの達人を目指す

  • いつも使いたいエイリアスなどは.bashrcなどに書いておく。
  • 自分で作った便利なスクリプトはbinなどに入れて PATH を通しておく
  • screen たくさんのシェルプロセスを切り替えながら使う
  • zsh 最強のシェル。 `**/*.txt` でサブディレクトリすべてのtxtファイルが。
  • find 検索は強力。 今日変更したファイルの一覧。 find . -type f -mtime -1 -print

6.11. Officeの書類を見る

  • OpenOffice.org(他にもいろいろある。xlhtmlとか)

6.12. WindowsとUNIX

  • Cygwin
  • SFU

6.13. MacとUNIX

  • Mac OS XはUNIXがベース。主にFreeBSDの実装が使われている。

7. 推薦図書

本はどんどん買いましょう

UNIXプログラミング環境
歴史ある良書。ユーザーにとっても有用。
UNIXマガジンのDVD
高いけど貴重な資料
Life with UNIX
UNIX文化や歴史について濃い本
詳説 正規表現
正規表現ならこれ。各種ツールでの差異などを詳説。
フリーソフトウェアと自由な社会
GNUの思想。直接のスキルアップにはつながらないので悪しからず。

8. まとめ

  • UNIXは暮らしにも仕事にも役立ちます
  • 実はテキストだけで事足りることはたくさんあります
  • UNIXの便利なツールはWindowsでもMacでも使えます
  • ふだんからUNIXツールを使って暮らせばすぐ身に付きます
  • UNIXツールを活用して仕事を早く終わらせましょう
  • これが終わったらみんなでご飯に行きましょう
Copyright (C) 1999-2024 Tetsuya Kaneuchi. All rights reserved.