■ Locale
DESC
言語, 単位など国ごとに異なる単位の総称
Program からすると, ENV として参照して, 出力などをきりかえる
-> 年月なども Format が決まっている.
■ その他
DESC
cygwin CommandLine から .bat 起動可能
■ network
■ 他の user と mesg を交換する( realtime に交換 )
write user001
mesg ...
c-d
// write cmd の受信を拒否する
mesg n;
■ Network 管理と internet ( Network 同士をつなぐことを Inter Network -> Internet )
Internet の通信規約では TCP/IP が利用される.
Internet を利用する App としては WWW が代表. ( RemoteFile 転送, Remote 端末もそう )
■ host 情報の表示. ( DomainNameServer から情報をとるよ )
host www.yahoo.co.jp // Name から情報を取得.
host www.yahoo.co.jp Has Address 210.249.71.235
■ Network. Interface の表示. 設定
LocalMachine が TCP/IP network につながらないときにつかってね.
次のものを表示
Network Interface
起動 | 停止
IPAddress | netmask
ipconfig /a // すべての Interface 表示.
ipconfig eth0 inet 192.199.199.10 netmask 255.255.255.0 // IPAddress , Netmask を表示.
■ UNIX.とは
■ Boot
DESC
起動順
ON -> BIOS -> MBR( HD ) -> boot loader -> kernel
kernel -> init dev -> init 起動 -> boot 処理 -> rc script
init dev
device driver が設定する
serial port : 通信速度
monitor : モニタの表示モード
init Program 起動
unix で最初に起動されるプロセス, PID = 1
init -> 各process, ie proces root
各daemon 起動
キャッシュマネージャ
swap 制御
hard disk 処理
init の処理内容
conf file : /etc/inittab の記述通りに動作
/etc/inittabの内容
id:rullevel:action:process
id : 識別子
runlevel : 実行level
action : どのタイミングでprocessが実行されるか
process : 起動するprocess
flow
1. boot process script 実行
2. run level に応じた process の実行
3. 端末制御
boot process
ネットワークの初期化 ...
起動後の initの仕事
親process をなくした process の処理
端末制御
標準入出力の切り替え
■ 設計思想
DESC
UNIX のシステムコール( Windows API を利用して )再現する cygwin.dll
cygwin 環境では, シェルとしてbash, コンパイラとしてGCC
マシンの処理能力の低く、大きなProgram が実行できなかった
-> 結果的には成功だった
ソフトウェアツールの開発理念
1. ひとつのことをしっかりやる
-> ある目的に特化した小さなツールをたくさんつくる
2. バイナリデータではなく文字列を扱う
-> 文字列からなるデータはどんなプログラムからも処理が容易
3. 正規表現を使う
-> スクリプトの作成を大幅に削減できる
4. 特に指定がなければ、標準入力と標準出力を使用する
-> 標準入力からデータを受け取り、標準出力へデータを出力するべき
-> エラーメッセージは標準エラー出力に出力するべき
-> プログラムをデータのフィルタとして使用できる
5. 余計な出力はしない
-> rm somefile としたら[ ユーザーは自分が何をしようとしているか理解している ]という前提
6. 入力データと同じ形式で処理結果を出力する
ex1: データの前にヘッダがあり、空白を区切り文字としているファイルはそのように出力する
ex2: 画像データは同じ形式で出力する
-> 結果として回転して、縮小という処理ができるパイプで実現できる
7. 1つのプログラムですべてをこなそうと思わない
-> 9割りの仕事は既存のツールでできる
毎回1からプログラミングするのと比べると、労力を大幅に削減できる
8. ツールをどんどんつくる
望む処理がない場合は、自分でつくる
あるいはさらに一般的な問題の解決例にならないかチェック
* FREE
* OpenSource
Program の中身がわかる( 問題があれば修正ができる )
* Volunteer
OS ( 基本 soft の一種 )
-> Solaris, AIX,
-> FreeBSD Linux
OS( Kernel ) はこんなことしてくれます
特徴
Shell
usr cmd を解釈して, Kernel に対して, 実行依頼をする
WindowSystem
X : 複数の window ひ表示や図形の表示が可能
UNIX は C 言語で記述されてます ( 最初は Assembler だった )
Linux は UNIX OS の一種
こうなふうに使います
# MultiUsr なので, Login する ( 検問のようなもの )
login
#
passwd で passwd 変更可能
# stty で 端末 Terminal の内容にあわせて, Key 操作を変更
stty erase ^H kill ^U
Manual
POINT
すべてを覚える必要もないし, することもできない
必要なこと
高速に調べる仕組みをつくること
覚えなくてもいいようにすること
man -k editor // editor という Keyword で検索
logout するのは 第三者に操作をさせないため
c-d | logout
■ FileSystem
DESC
data の集合を file という単位で管理する
/dev で入出力 を扱う
-> HD , display を file 同様の扱いにする.
file名が長くなるのを ふせぐため, / で区切りようにした.
-> 毎度 fullpath では メンドイので
shell は PWD をみるようになった
同一目的の file をまとめた [file] を directory といいます
■ 入出力を.File.として一元化
DESC
http://www.linux.or.jp/JF/JFdocs/Bash-Prog-Intro-HOWTO-3.html
Disk 上の file だけではなく, display , Keyboard も file 扱いにする.
cmd の入出力を一元化した.
でも毎度設定するのはメンドイ.
STDIN STDOUT ができた. -> Kb, DP に Bind されている.
次のような感じ
KB --> (STDIN)[ cmd ](STDOUT)---> DP
■ Redirect
[>] STDOUT への出力を変更する
[< ] STDIN へ流す.
[2>] STDERR を REDIRECT
[1>] STDOUT を REDIRECT
[2>&1] STDERR を STDOUT と同じ FILE DESCRIPTOR にする
# Error も log にのこす
bsi.sh 2>&1 | tee /dust/log
■ Pipe
DESC
ある Program の結果を 他の Program の入力にする
( これが どれだけ 柔軟なことか 知るべし )
[|] STDOUT を 次の cmd の STDIN につなげる
次のような cmdline OK
# 連続実行
# 前から順に実行
echo foo; echo bar;
# 並列実行
#
find -name "foo" &
# pipeline
cmd1 | cmd2 | cmd3
# Group
(cmd1;cmd2;cmd3;)
# 条件実行 :
# cmdA が成功したら cmdB を実行
cmdA && cmdB
# configure が成功したら make
./configure && make && make install
# build が成功したら 実行
gcc main && ./a
# cmdA が失敗したら cmdB を実行
cmdA || cmdB
# make が失敗したら 出力したmake.logをひらく
make >& make.log || cat make.log
# 2 つの STDOUT をまとめて out.txt へ Redirect
(ps;date) > out.txt
# 先頭に日付をつける
( date; cat a.htm ) > merge.txt
■ Process.の制御
DESC
usr 入力を解釈して実行する
複数の job も制御可能
CmdLine == [ 1 Job ] -> JobID , PSID がふられる.
-> JobID は shell ごとのとおし番号
[1] からはじまっていたな -
-> PSID は System 全体のとおし番号
ps で確認してね.
c-z : JobFG を一時停止
kill JOBID : Job を完全に終了
find . -name "foo" > file & // JobFG
jobs
->
[1] Running
kill -STOP [%1] // JOBID 1 を一時停止.
c-c : JobFG を停止. ( 割り込み Signal を発生させる )
■ なぜUNIX
DESC
POSIX
OSの規格のひとつ実装面でななく、APIを規格化したもの
-> 互換性を確保したため
キャラクタベースのインターフェイスは慣れないと使い
逆に慣れるとネットワーク経由でどこからでも操作できるという恩恵にあずかれます
経験的にはまずメモリを増やし、次にHDを高速なものにした方が、体感的な速度は向上します
■ Interpreter.の仕組み
DESC
ここを理解すると CommandLine をかきやすい
■ [quot]はそのままねを意味
DESC
quot[ " ] で囲まれた部分は Interpreter にそのままの文字であることを伝える
# foo\nbar はそのままだな
echo "foo\nbar"
# \ の次を escape しよう
echo foo\nbar
WARNING
# 変数置換された後に space があっても問題ないように
i="aaa bbb"
BAD
echo $i > sed "s/aaa/bbb/"
# こう処理される
echo aaa bbb > sed "s/aaa/bbb/"
OK
echo "$i" > sed "s/aaa/bbb/"
echo "aaa bbb" > sed "s/aaa/bbb/"
■ Program 開発
gcc : C 言語の処理系( system )
ld : linkedit ( gcc から自動でよばれる )
■ Printer 出力 ( lpr )
print job として 複数の user からの要求を格納.
print job は Spooler が管理する
lpr [OP] file
# -g で Symbol Table 作成
gcc -g -o foo foo.c
■ GUIDELINE
DESC
環境変数は最後に / をつけない
DEV=c:/foo/bar
cd $DEV/tmp
directory 移動のalias名 は cd[directory名]とする
alias cdwork="cd /cygdrive/c/work";
alias cdlog="cd $WORK/log";
■ 設計
■ Filter.Script
DESC
コマンド : program
スクリプト : コマンドの集合 == パッケージ
フィルタ : 標準入力からデータを読み、標準出力へ出力するプログラム
実際 多くのフィルタはファイル名を指定することで、データを入力できるようになっている