Extra





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 ) はこんなことしてくれます
# これらのの Interface になるのだ Shell (.) HW( CPU, Memory, HD)の制御 (.) Process のスケジュール管理
特徴
# 複数の作業を同時にできます (.) MultiTask, MultiUsr
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
(.) 作業の自動化 (.) 最初に苦労して後でずっと楽する (.) シェルスクリプトとは元々存在するプログラムを組み合わせて、 リダイレクトなどを駆使し、ある機能を組みあげていくものです (.) もしあなたが新しい標準入出力型のプログラムを作ったとしましょう my_program | sort (.) 今後シェルスクリプトを勉強していく中では、 つねにこの「すりかえ」機能を頭にいれときましょう! (.) お行儀のよいスクリプトにかならず終了ステータスを返す 他のscript に組み込んだ際に err 処理できる (.) 「標準入出力」でデータを取り扱うのがシェルスクリプトの基本です (.) device を使い回す必要がない( mouse, keyboard ) (.) 結果の再利用ができる (.) 対話的に使えること (.) データは構造を持たない単なるバイトストリームであること -> データが構造を持たないということは、処理速度の点では不利 (.) 余分な出力を行わないこと( 沈黙は金 ) (.) 単機能のツールを組み合わせること (.) 何でもかんでもファイル (.) ファイルは全部バイトデータのストリーム
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 スクリプト : コマンドの集合 == パッケージ フィルタ : 標準入力からデータを読み、標準出力へ出力するプログラム 実際 多くのフィルタはファイル名を指定することで、データを入力できるようになっている


toUpper toLower


echo aaa | sed 's/\(.*\)/\U\1/' echo AAA | sed 's/\(.*\)/\L\1/'