トップページ
ひらく | たたむ | ページトップ
↓マウスで反転選択した文字を検索
Cygwin
   
ページ内検索 ページ外検索
検索したい文字を入力して
ENTERを押すと移動します。
\n
[ トップページ ]
[ ____CommandPrompt ] [ ____JScript ] [ ____MySQL ] [ ____Cygwin ] [ ____Java ] [ ____Emacs ] [ ____Make ] [ ____Perl ] [ ____Python ] [ ____OpenGL ] [ ____C# ] [ ____StyleSheet ] [ ____C++ ] [ ____Winsock ] [ ____Thread ] [ ____VisualStudio ] [ ____C ] [ ____Win32API ] [ ____Lua ] [ ____PhotoShop ]
ヘッダ検索
___

■ 制御構文




___

■ if

if 終了コード then cmd # 条件文(処理)の結果 == 0 の処理 elif 終了コード cmd # 条件文(処理)の結果 != 0 の処理 else cmd fi 条件によって処理を分岐したいときは test コマンドを使う。 test は式が真ならば終了コードの 0, 偽ならば 1 を返す。

    v=1
    if test $v = 1 
    then
      echo "true"
    fi


    # ファイルの有無をテスト    
    if test -f ~/.emacs
    then
      echo "true"
    fi

test の省略形として [] を使うこともできる。 ただし [] 内の前後は スペースを空ける必要がある。

    if [ -f ~/.emacs ]
    then
      echo "true"
    fi

変数の値と比較するときは空がきた場合の対策で "" をつけておく if [ = "aaa" ] と解釈されて構文エラーになる。
    if [ "$1" == "a" ]
    then
      echo "true"
    fi
POINT # if(0) if [ ]; then # if(1) if [ nandemo ]; then WARNING BAD if 0; then ## ERR, invalid cmd OK if test.sh; then ## ## test.sh exit 0
    条件文はひとつの式なので [ ; then ] と記述

    すべてに TOKEN にスペースを空ける
    空の 式 はできない.
   BAD
     if 条件文; then fi
   BAD
     if [ "$1"="str" ];
   OK
     if [ "$1" = "str" ];  
___

■ OR.AND


  # AND
  if [ -f a.txt -a -f b.txt ]

  # OR
  if [ -f a.txt -o -f b.txt ]

  i=10
  j=1
  if [ $i == 10 -a $j == 7 ]; then
      echo "true"
  else
      echo "false"
  fi

___

■ for

SYNTAX for $v in list do ... done スペース区切りの文字列 list 内の要素を変数 v に代入しながら繰り返す
    list="a b c"

    for $v in list
    do
      echo $v
    done
シェルのファイル展開と併用する。

    # すべての .txt を処理する
    for v in *.txt
    do
        echo $v
    done

引数をイテレートする
    for v in $*; do
        echo $v
    done
コマンドの結果をイテレートする

    for v in `find -iname "*.txt"`; do
        echo $v
    done
    
    # grep で検索された結果をイテレートする。
    for v in `grep "TODO" ~/.emacs`; do
        echo $v
    done
___

■ while

SYNTAX while 条件文 do ... done
    # [ : ] 区切りのパスを出力

    list=$PATH

    while test -n "$list"
    do
      echo ${list%%:*}
      list=${list#*:}


      if [ "$list" == "${list#*:}" ]; then
          break;
      fi 

    done

    # file の各行をなめる
    while read i
    do
      echo $i
    done <  /dust/foo.txt

    # STDIN から 入力
    while read i
    do
      echo $i
    done
___

■ case

SYNTAX case 文字列 in 条件1) 処理1 ;; 条件2) 処理2 ;; 条件3) 処理3 ;; esac DESC 文字列一致した条件の処理をする。

    v=a
    case $v in
        a)
        echo "a"    ;;
        b)
        echo "b"    ;;
        *)
        echo "default"
    esac
条件の文字列には シェルのワイルドカードが使える。 "*" は任意の文字列なのでデフォルトとして機能する。
    v=a
    case $v in
        *.txt)
        echo "txt"    ;;
        *.exe)
        echo "exe"    ;;
        *)
        echo "default"
    esac
    # ユーザーごとに処理をかえる
    case $USER in
        root)
        echo "root user"    ;;
        *)
        echo "default"
    esac
    


    while getopts a:bc var
    do

    case $var in
      a)
        echo a
        ;;     # break
      b)
        echo b
        ;;     
      *)      # Default
        echo etc
    esac

___

■ 配列(Array)




___

■ 配列の定義

SYNTAX a=(element ... )
  # 配列は () for in と誤解しないように...
  # 代入時に $ がいらないのは, 変数 と同じ
  a=(a b c);
  # 参照
  #      $a と shell が誤解しないように {} をつける
  BAD
    $a[0]  

  OK
    ${a[0]}

  # 要素を追加
  #
  a=("${a[@]}" "foo")



  # 要素数
  ${#a[@]}
  # コマンド結果を配列にいれる
  a=(`ls`) 
  echo ${a[0]}
  echo ${a[1]}
  echo ${a[2]}

  # ls の結果が置換されたのと同じ
  a=("aaa" "bbb" "ccc")


# $() は コマンドを実行した結果( STDOUT に出力される文字列 )を返す # 実は `cmd` と同じ しかも Nest できる # array=$(ls)
  # スペース区切りに展開するには @ 演算子 をつかう
  a=(1 2 3 4)
  i=0
  for i in ${a[@]};do
    echo $i
  done  

  a[0]=1;  a[1]=2;
  a=a(a b c d)

  # command 結果を 配列にセット
  a=(`ls`)

  
  a=(a b c d); echo ${#(a b c d)}

  # すべてをかえす
  ${a[@]};

  WARNING 
    space 区切りの文字を loop できない
___

■ 変数(Variable)


___

■ 変数の定義

Scope 定義したshell内で有効 export で 子shell が参照可能

    # 代入時の = にスペースは不要
    num=1; 
    
    num=`expr $num + 1`

    let ret=num*num;  // bash only, $必要なし

    # readonly にする。
    readonly  num;


    # 文字としての 1 を代入
    $debug=1;     
WARNING
    '' で quot された変数は置換されない

    # RET: aaa
    var=aaa; echo "$var"

    # RET: $var
    var=aaa; echo '$var'
コロンの使用 echo ${name:-value} // 値の判定 echo ${name:=value} // 値のset echo ${name:?value} // 値==NULL -> stderr へ
___

■ 関数(Function)


___

■ 関数の定義

    func()
    {
      # 関数の引数
      echo $1;
      
      # 変数は すべてグローバルだが local 宣言でローカルにもできる
      local l="aaa";

      # Global 変数は下で定義されていても参照できる
      echo $gVar;
      
      # 途中で処理を抜けたい時は return を使う。
      # 省略はできるが数値( 終了コード )をかえす必要がある
     return 1;
    }
    # ↑で定義した関数から , 参照できる
    gVar="test";


    # Call
    #    コールする前に定義すみでないとエラーになる
    func arg1

    # WARNING 
    #    () はいらない
    func();
___

■ include

    source common.sh
    # インクルードして
    . ~/common.sh

    # 呼び出す。
    commonFunc test;
インクルードされる側
   # 関数の定義
   add()
   {
      # 引数をうけとる
      local sum=$(( $1 + $2 ))
      
      echo $sum

       return 1;
   } 

   WARNING 
     # Global Code は Include 側に影響がでるのでよくない
     echo foobar

     # Interpreter がここで中断される
     exit $?    
インクルードする側

    # インクルードする。
    . "~/sh/common.sh"

    # CurrentDirectory 相対
    . "./common.sh"


    # コマンド置換を使って結果をとる。
    ret=`add 1 2`
    echo $ret

WARNING 子 process の関数登録は親には受け継がれない( 変数と同じ ) 関数の変更は登録して有効になる POINT export -f file : ( func を export する )
___

■ 文字列(String)


___

■ 結合

SYNTAX var=$var1$var2 DESC 文字列を連結する
    a=aaa;
    b=bbb;
    c=$a$b

    # aaabbb
    echo $a$b
    echo $c
___

■ 行間を結合

DESC
  # SPACE はいらない
  var="aaa"\
  "bbb"\
  "ccc"\
___

■ 部分文字列(Substring)

部分文字列を取得するには特殊な変数展開をつかう SYNTAX ${var:offeset:length}
    # 234567
    var=0123456789
    echo ${var:2:6}

    # length を指定しないと 2 番目から最後まで
    # 
    echo ${var:2}
___

■ 変数展開

DESC 特殊な変数展開を利用することで、文字列操作として使える。
___

■ パターンマッチ(PatternMatch)

TODO
    path=d:/foo/bar.flv

    if [[ $path = *.flv ]]; then
        echo '$path begins with "flv"'
    else
        echo "false"
    fi
___

■ 置換(replace)

POINT 変数展開を使うことで、文字列置換ができる。 SYNTAX ${var/pattern/replace} ${var//pattern/replace} DESC pattern にマッチした文字列を replace に置き換える。 pattern には * ? といったワイルドカードが利用できる。 regexp を利用するには, sed, perl を利用する。 $変数名 又は ${変数名} その値 ${var:-文字列} 変数が存在し空でなければその値、それ以外なら文字列 ${var:=文字列} 変数が存在し空でなければその値、それ以外なら変数に文字列を設定 ${var:?文字列} 変数が存在し空でなければその値、それ以外なら文字列を出力して終了 ${var:+文字列} 変数が存在し空でなければその文字列、それ以外なら空 # 部分文字列 # 指定位置〜末尾 # 指定位置〜要素数 # ${var:位置} ${var:位置:長さ} # パターンにマッチした先頭部分を削除 # 最短 ${var#パターン} # 最長 ${var##パターン}
    v=d:/foo/bar/goo.txt
    echo ${v#*/}
    echo ${v##*/}
# 後ろからマッチした部分を消す # 最短 ${var%パターン} # 最長 ${var%%パターン}
    v=d:/foo/bar/goo.txt
    echo ${v%/*}
# マッチ文字列を置換 # 最初にマッチした部分のみ ${var/パターン/文字列} # すべてのマッチ文字列 ${var//パターン/文字列}
    path="d:/test.tmp"

    # d:/test.flv
    ${path/.tmp/.flv}
    # すべてを置換するには // とする
    path=d:/foo/a.txt
    
    # d:fooa.txt
    ${path//\//}
    # 2番目から6個をえる

    var=0123456789
    echo ${var:2:6}

    WARNING
    # wildcard で指定する ( regexp ではない )

    # htm
    var="foo.htm";    
    echo ${var#*.}

    # foo
    var="foo.htm";    
    echo ${var%*.htm}


    # 途中のみは消せない
    #
    # aaabbbccc
    var=aaabbbccc
    echo ${var#bbb}

    # 頭から消す
    #
    # ccc
    var=aaabbbccc
    echo ${var#???bbb}

    # aaa_ccc
    var=aaabbbcccbbbccc
    echo ${var/bbb/_}

    # aaa_ccc_ccc
    var=aaabbbcccbbbccc
    echo ${var//bbb/_}

___

■ 算術演算(Math)


  POINT
    shell の構文を利用しない場合は bc コマンドを使う
    REFERENCE  bc


___

■ 整数の計算

SYNTAX $((expression))
    a=10
    b=10

    # 20
    c=$((a+b))

    # 2
    c=$((12%5))

    # let でも代用できる
    let sum="1+1";
___

■ Random

  # 乱数をえる
  echo $RANDOM
___

■ Shell.変数


___

■ シェル変数

DESC シェル変数とはシェルの動作をきめるパラメータのこと。
   SHELL 
   LANG
DESC 各ツールが内部で起動するシェルを指定する。
    SHELL=/usr/bin/bash

    # make は /usr/bin/bash をコマンドの実行に使用する。
    make all

  # 代入.するときはスペースは不要 ( perl と間違えないように )
  var=val 

  # 参照(変数展開)するときは [$] 
  echo $var;

  # 変数名の範囲を明示しても良い
  echo ${var}
ignoreeof : c-d | logout を防止. -> set -o ignoreeof -> c-d -> Use "logout" to leave shell 環境変数 ENV とは 全 Process が参照できる global な値( 属性 ) export してね # 次のように考える. bash も 1 Program void bash() { while( exit ) { # export した. global GWORK="c:/work"; # VarLcl なので見れない. LWORK="c:/work"; # 子 PS から GWORK が見れる mycmd(); test.sh(); } } WARNING ps 起動後に Export した ENV は追加されない 子 PS は 親 PS の環境(ENV)をうけつぐ
___

■ 種類

   組み込みシェル変数 EX : PS1,
   シェル変数
   環境変数( コマンドから参照できる変数 ) == PATH、HOME、export VAR=test;
___

■ Shell.変数 一覧

DESC tool が出力する coding system( この文字code使ってね - )
  SHELL=ja_JP.SJIS( make,gcc が文字化けを起こすので注意 )
___

■ 環境変数

シェル、任意のコマンドに値を渡すときに利用する変数。 あるプロセスで設定された環境変数は子プロセスでも利用できる。 しかし親プロセスや別プロセスは参照できない。
    # 変数を環境変数にするには export を使う。
    export testvar="test";

    # 定義されたことを確認する。
    set | grep testvar

___

■ 特殊変数

$0 シェルスクリプト名 $1 ・・・, ${10}・・・ 1番目から9番目の引数、10番目以降の引数(2桁の場合は{}で囲む) $# 引数の数 $@ 又は $* 全ての引数のリスト $$ プロセス番号 $? 直前のコマンドの実行結果(正常終了時に0が代入される) $- シェルに与えられたオプション PS1 : prompt string \w: \@ \l \u
___

■ 変数は文字列として処理

    test=1
    test=$test+1 // echo $test -> 1+1

    # 整数として宣言
    declare -i test  
    test=1

    test=$test+1

    # RET; 2
    echo $test
___

■ shellVar.とは.shell の動作を制御する属性

SYNTAX var=val unset var=val readonly var set -+o var // tgl DESC shellVar は user , tgl, shell 自動設定の 3 種類あり. set -o で一覧表示 POINT BASH_ENV : shell init file BASH_VERSION : bash version braceexpand : brace 展開 CDPATH : cd 検索 path set -o emacs : emacs 方式による cmdline 入力 EUID : UsrCur ID GROUPS : GrpCur ID IFS : cmd 区切り文字 LINENO : 現在行 PPID : prt IDPS REPLY : read で読まれた行 read; BAD read i; SECONDS : shell 起動時間 FIGNORE : 指定した file末尾 の file 展開しない これ便利 . FIGNORE=_bk GLOBIGORE : path 展開をする際の 無視する list
___

■ ShellScriptの汎用的な扱い

continue : while, foreach
___

■ History


___

■ ヒストリー

DESC 過去に入力したコマンドを実行する 繰り返すときに便利

  # ひとつ前を実行 ( 繰り返すときに便利 )
  !! 

  # 過去の履歴を Reverse Incremental Search
  c-r f と入力すると "f" に マッチするコマンドが表示される
直近のコマンドを実行する。
    # 何かのコマンドを実行
    grep "todo"  `find -iname "*.h"`

    # ! の後の任意の文字でマッチする直近のコマンドを実行する。
    !gr
履歴を移動する

  # Previous
  c-p
  [↑]

  # Next
  c-n
  [↓]

ヒストリを削除する。
    history -c

  # 履歴の最大サイズを調べる。
  echo $HISTSIZE


  # history で過去の履歴を表示
  history 

  1 echo foo
  2 echo bar
  3 find . -name "*.txt"


  # 履歴 3 番目を実行
  !3
  find . -name "*.txt"

-> !id:pos:act // id 番目の CmdLine を pos 番目の token を act する !510:0 // 0 番目( cmd )の部分へ置換 // 直前の cmd を置換. 名前を探す際に便利 find -iname ".txt" ^txt^cpp
___

■ history

SYNTAX history [OP] [n] DESC Command 履歴出力 OP n : 出力する行数 POINT !! : 直前 !n : n 番目 !-n : n 番目前 !str: str で始まる最新 !?str?: str を含む cmdline # 過去 6 番目まで history 6 # "file" を history file として扱う # Default は $HISTFILE が使用される history file # /home/usr/.bash_history echo $HISTFILE # history の entry に追加( Store ) history -s "echo foo" history 2 echo foo history
    $HISTFILE( ~/.bash_history ) に記録されている
___

■ 正規表現(Regexp)


  DESC
    data の検索、指定の表現方法を拡張化する
    pipe することで作業が効率化できる


日本語環境の対応
    mult byte tool の用意
    Local の適切な設定

  正規表現を利用できる場面
  文字を指定する箇所
    0. shell のファイル名置換
    0. unix tool での 引数指定 ( sed, grep, find, ls ... )

    editor で置換, 検索
    2. log の解析
    3. CGI, web appli の文字列チェック( JAVA, PHP, .NET, JAVASCRIPT )


  Windows wildcard 
   * : 任意の1文字以上の文字列
   ? : 任意の1文字
___

■ SYNTAX




___

■ Result

SYNTAX $? # たとえば tool の成否を調べる wget "http://ur" | grep "現在おさがしの物件はありません" # RET: 1 echo $? POINT 関数内で宣言した変数は呼び出しshellで使用できる < -> local i=1; で 関数local
___

■ 空白の扱い\spaceで対処

DESC alias cdwinbin="cd C:/Program\ Files/"
___

■ stdout出力

cygwin foo | cat POINT: program とはbit列を入力として、bit列を出力するもの fileもbit列 ゆえにfile のリダイレクトやパイプという仕組みができる
___

■ system

___

■ Shell.とは

DESC program を起動すること 存在理由
  プログラムを実行させる、データを保存する == タイヤとエンジン
  ハンドルに相当する操作する仕組みが必要それがシェル( 制御システム )
   ユーザの指令を解釈して実行するプログラムシェルとはコマンドインタープリタ
仕組み  コマンドラインをシェルのプロセスが読み取って、あるコマンドがコールされたことがわかる  2.ps のプログラムが実行されるプロセスを作成  3.ps プログラムが動き出す DESC
    # どちらも Program であることにはかわりなし
    #
      kernell == OS 機能を実装している program
      shell   == usr cmd を解釈 して kernell を call する program
usr -> os の仲介役 の種類 1. shell 2. tty driver : c-c 3. system call : c 言語を利用する際の kernell 窓口 shell の種類
   sh  : history 機能をもたない sh ( scr intp に使用 )
   bash: history , cmdline 編集をもつ sh
shell の変更できます 1. 直接 shell 起動. EX. tcsh( cld ps として起動 ) 2. ps をのっとる . exec cmdName shell が program を呼ぶ仕組み 1. PATH 検索 2. ps 作成 3. / があれば直接その path を実行
___

■ Ridirect.Pipe

DESC シェルは「キーボードから入力し,画面に出力する」ようになっている。 入力と出力の方法を変更する場合には,リダイレクトを使う 出力先、入力先の指定はファイルディスクリプタという番号を使う。 0, 1, 2 はシステム側で予約されている。 番号を指定する( NO> )ことで特定の出力先だけを変更する。

    test.sh > log.txt 2> err.txt

    # エラーを出力したくないときは /dev/null へ捨てる。
    test.sh 2> /dev/null
入力 : プログラムが外部から情報を受け取ること 出力 : プログラムが外部へ情報を出力すること チャネル : データが流れる通路 ファイルディスクリプタ : 各processがopenしているファイルをUNIXが管理する際に使用する整数値( shell では10個まで) チャンネル(通路)0:キーボード  チャンネル(通路)1:画面 チャンネル(通路)2:画面 ( エラー情報をだすためのチャンネル ) 小話 昔はタイプライタ端末といって、紙に出力していた チャンネルの合流 SYNTAX cmd [arg] > foo.txt ( ch2 は端末へ, err を知らせるため )
    test.sh > log.txt 2> err.txt
    test.sh > log.txt 2>&1
___

■ Pipe

DESC プログラムが標準入力から読み込んで、標準出力へ出力するとき、パイプができる

  //OK
 cat <  test.txt | cat | cat  

  // ERROR echo は標準入力から読まないのでエラー?
  cat <  test.text | echo 

  // 小文字を大文字に変換
  echo this is a pen | tr a-z A-Z
シェルのコマンド制御のメタキャラクタ  cmd1 ; cmd2  コマンド1 &  コマンド2 ( 平行して実行 )  ( ps ; ls ) > t1 ps, ls の結果をまとめて t1に メタキャラクタの注意点  そのまま使用したい場合は \ ( エスケープする )  ””、 ’’クォートする"$var" は変数展開される'$var' は変更されない shell parse 順序
   $xxx : 置換
   置換結果を処理 cmd arg
    echo "foo$USER"
    echo "fooXXX"
    $1 == fooXXX として echo が処理
___

■ 置換(Substitute)

DESC 置換とはあるものを、別のものでおきかえること シェルの場合の置換 特別な意味をもつ記号を別のものに変換  変数置換 EX : expr $a + $b , ("" の中では展開される ) WARNING '$foo' は置換されない : mv `find -type f -name "$word" ` POINT ${foo} // {} 範囲を明示する  コマンド置換 EX : foo='expr $a + $b' ( バッククォート )  ヒストリ置換 !99  ファイル名置換  * : 任意の文字列にマッチ ? : 任意の一文字にマッチ [...] : ... のどれか一文字にマッチ, クラス表現   [ 上記の表記を含む引数 ]があった場合、 シェルはマッチするファイルを探して、ファイル名の並びで置き換える    WARNING: シェルはすでにあるファイルにしか置き換えない cp *.c backup/*.c // BAD POINT 展開結果をみるには echo をつける、echo cp *.txt ./ ファイル置換は変換対象にマッチングしなければ、そのまま出力される mv *.sss foo.txt  (ファイル名置換後)−> mv *.sss foo.txt となる ''で置換の抑制 cmd にそのまま渡す : sed 's/foo*/bar/' tmp.txt
___

■ ヒアドキュメント(HereDocument)

DESC まとめて出力したい時に cat < < EOS
___

■ Argument

REF getopts
   #bash > ./foo.sh a b c  
   // 3
   echo $#
   
   // a b c 
   echo $*
   
   // ./foo.sh
   echo $0
   // a 
   echo $1
   // b
   echo $2
   
   // c
   echo $3
___

■ Wildcard

DESC shell が [ file をマッチング ]する時に使用 * : 任意の1文字以上の文字列 ? ? : 任意の一文字 []: {}: Brace

      # foo bar goo
      ls

      echo *  # echo foo bar goo と展開される.

      # RET: foo bar goo
WARNING regexp とは異なる [ . ] : 任意の一文字ではない POINT wildcard の置換結果は echo ですれば OK
___

■ 改行(newline)

SYNTAX $'\n' DESC 改行するには $'\n' POINT
    // RET
    //   aaa
    //   bbb
    echo $'aaa\nbbb'
___

■ Referrence

___

■ NameRule

DESC 表記

   IN      : STDIN
   OUT     : STDOUT
   NULL    : STDIN, STDOUT から入力をうけない. 
    

   IN : NULL ならば PIPE できない
___

■ Option

DESC 引数の処理にGNU getoptsを使用しているので LongFormat, ShortFormat がある 長いオプションは覚え易く便利 コマンドライン引数の後にオプションを指定したりしても OK
    # Option とその値の間の SPACE は任意
    op[ ]+VAL


    # 引数がいらない OP はまとめても OK
    cp -Rup
___

■ tar

SYNTAX tar [ op ] [ file... ] tar [ op ] [ dir... ] DESC アーカイブ(複数ファイルをひとまとめにしたもの)の作成, 展開 TARファイルの圧縮, 解凍する OP c 新規にアーカイブを作成する f アーカイブのファイル名を指定する t アーカイブの中身を表示する u 追加するファイルがアーカイブ内のファイルより新しい場合にだけ追加する v 処理したファイルを一覧表示する x アーカイブからファイルを取り出す z gzipで圧縮、解凍をする
    # menuディレクトリのファイルをひとまとめにし、圧縮
    tar -cvzf menu.tar.gz menu/
    beer.txt
    wine.txt
    sake.txt

    # menu.tar.gz を解凍しアーカイブからファイルを取り出す
    tar -zxvf menu.tar.gz
    tar -xzf menu.tar.gz

    #  -c で標準出力し「-」で標準入力(パイプラインからのデータ)
    gunzip -c menu.tar.gz | tar -xf - 
___

■ break

SYNTAX break DESC 最も近い while , foreach から再開 IN OUT OP
    while [ 1 ]; do
        echo "input i:"
        read i
        break
    done
___

■ g++

DESC C++ コンパイラ C++ library を link する設定をして gcc をよびだす option は gcc と同様 LIB /lib/gcc/i686-pc-cygwin/4.3.2/
___

■ gcc

SYNTAX gcc [OP] file... DESC GNU project C and C++ compiler IN OUT OP c : Compile only g : Gdb o : Outfile D macro W(all) : Warning Level O : optimize S : Assemble Code 出力 L LIBPATH : library のパス指定 l lib : library 指定 E : Preprocessor C : (with -E) not del Commnt プリプロセッサにコメントの削除をしないように指示 P : (with -E) プリプロセッサに `#line' コマンドを生成しないように指示 x language 入力ファイルの言語を language であると明示 ( 拡張子による判定よりも優先 ) このオプションは、 次の `-x' オプションが出てくるまで、 後続する全ての入力ファイルに適用されます
     # language 
    `c'
    `objective-c'
    `c-header'
    `c++'
    `cpp-output'
    `assembler'
    `assembler-with-cpp' 

  // PreProcess のみ
  gcc -E foo.cpp   

  POINT
  //  ShaderCode の Preprocess にも使える
  gcc -E main.cg


  // c として扱う
  $(CGC) -xc -E -P $^ > $@.tmp  #

  // Assemble のみする 
  //    RET: main.s
  //
  gcc main -S main.cpp

  // libcunit.a を LINK する
  gcc cunit.c -L/usr/local/lib -lcunit

    Optimize Option
      Compiler が code 量を減らしたり, 実行時間を減らすようにする
    
      0 が最小 
            

    # Level 0 : Optimize なし ( Default )
    gcc -o main -O0 main.cpp 

    # Level 2 : 
    gcc -o main -O2 main.cpp 

    # Level 0 : Optimize なし ( Default )
    gcc -o main -O0 main.cpp 


    # Optimize は 各種 Option のセット

     -O3 
       -O2 に追加
      -finline-functions    // 単純な関数を caller 側に埋め込む ( inline ) 
      -fweb               // 
      -frename-registers

    # gprof と併用すると, 関数の呼び出し が変更されるのがわかる 
    gcc -O3 main.c -pg -o ./main
    .main
    gprof ./main



    # -O3
    index % time    self  children    called     name
                                                     < spontaneous>
    [1]    100.0    0.68    0.00                 main [1]
    -----------------------------------------------

    # -O0
    index % time    self  children    called     name
                                                     < spontaneous>
    [1]    100.0    0.00    1.86                 main [1]
                    1.48    0.00     500/500         b [2]
                    0.38    0.00     500/500         a [3]
    -----------------------------------------------

    WARNING 
    # C++ の関数を使用するときは libstdc++.a を LINK しないとだめ

    int main () {
      char *p = new char[128];
      return 0;
    }

    # ERROR    
    #    undefined reference to `operator new[](unsigned int)'
    gcc main.cpp

    # OK
    gcc main.cpp -lstdc++

    # g++ なら, gcc に必要な option をつけて build してくれる
    g++ main.cpp
    
C++ 固有 Option

  -fpermissive

    DESC
      template 化された 基底クラス method の宣言をなどがなくても Compile をとおす
      ( もちろん 非推奨 )

      // ルールに従わない code のエラーチェックのレベルをさげる
       Downgrade some diagnostics about nonconformant code from errors to warnings.  
      // さらに Compile も通るようにする
      Thus, using -fpermissive will allow some nonconforming code to compile.

    4 段階で処理

     前処理(preprocess)
     コンパイル
     アセンブル
     リンク

    # Preprocess のみ
    gcc -E hello.c | sed '/^[ ]*$/d' | less

    # Compile のみ
    gcc -S hello.c

    # Assemble まで
    gcc -c hello.c

    # 実行 file まで
    gcc hello.c


    // Object の構造
    
  ELF ファイルヘッダー 
  プログラムヘッダーテーブル 
  (複数の)セクション 
  セクションヘッダーテーブル    
  
  /usr/include/elf.h

  
ELF ヘッダー
.text :機械語に翻訳されたコード
.data :空
.bss :空
.note :
.rodata :プログラムで使用する文字列定数
.comment :コメント
.shstrtab :セクション名の文字列のテーブル。セクションヘッダで使用
セクションヘッダ:各セクションの情報を保持する構造体の配列になっています。

.symtab :シンボルテーブル
.strtab :関数名などプログラムで使用する文字列
.rel.text :



___

■ groups

SYNTAX groups [OP] [usr...] DESC usr の所属する group を出力 usr は 複数のグループに所属できます ( クラブ活動と考えるとわかりやすいでしょう ) id -G IN OUT OP g : /etc/group だけを参照 l : /etc/logingroup だけを参照 p : /etc/passwd だけを参照 // Administrators とは PC に対してすべてのアクセス権があること // usr と group を間違えないこと
    # usr を指定しないと Current Process の結果がかえる
    #
    # RET: なし root Administrators Users
    groups

    

WARNING 15 までしか登録できない ( OS 全体で. ) Project が終わったら解除すること
___

■ rehash

SYNTAX rehash DESC HashTbl を再構築する shell は PATH を毎度検索してない hashTbl に 実行可能 cmd を再登録する bash は PATH を必ず検索するので, rehash はなし 絶対 PATH ならばもちろん検索しない IN OUT OP
___

■ finger

SYNTAX finger [OP] name DESC login 中の user, name, tty, time, dir, shell を表示. IN OUT OP l : longlist s : simple f : no header m : only user
___

■ fold

SYNTAX fold [OP] file... DESC file を指定行でおりかえす space で token できるよ IN OUT STDOUT OP s :
  fold -3 foo.txt
___

■ ftp

SYNTAX ftp [OP] [host] DESC c:/windows/system32/ftp.exe もあります ftp サーバへファイルを転送します。 anonymousFTP server を利用して, account なしで DL できる FTPserver 上に Acount がある場合は, Password 認証がいります POINT 定期的なファイル転送をするなら ftpコマンドをスクリプトファイルにまとめておくこと。 インタラクティブなコマンドを利用するなら あらかじめプロンプトを無効にします IN OUT OP d : debug g : glob i : ignore prompt n : .netrc ( autologin を利用しない ) d : P port ( port 指定 ) t : v : verpose
    # Remote host にアクセス
    ftp cpz9.actnw.jp

    # UserName 
    > Name    

    # Password
    > Name    

    ftp> status       // 現在の状況説明. 
    ftp> pwd          // pwd きりかえ
    ftp> bye          // session 終了. 
    ftp> ftphost
   # ftp.ring.gr.jp に接続
   shell> ftp ftp.ring.gr.jp
     
     # dir へ移動
     cd dir 

     # ファイルのリストを取得する
     ls

     # リモート上にディレクトリを作成する
     mkdir tmp
     
     # binary に変換
     binary

     # foo.tgz をもらう
     get  foo.tgz 

     # FTPサーバから切断して終了
     bye
# 自動実行のためなどに script から読ませるには次のようにする。
    cat scriptfile  |  ftp -n
    open  ftphost

    user   username   password
    
    passive

    send  d:/test.txt   /test.txt
    
    bye
# script(file) から読ませる
    ftp.exe -s:update.txt
___

■ ed

SYNTAX ed [OP] [file] DESC LineEditor IN OUT OP s : silent こう使います

  
  ed file

  # n 行目表示
  1p

  # 追加
  $a
  comment
  .  // 終了
  w  // file 書き出し.
  1d // i 行目を削除.
  
  c-d // 終了
___

EX >■ EX

SYNTAX [OP] file... DESC IN OUT OP file :1 // 1 行目に移動 :4d a // buf a に格納 :put a // :wq // かきだし
___

■ bg

SYNTAX bg [%job] DESC background job 実行 IN OUT OP

  find . -iname "foo"

  # 中断する
  c-z

  [1] find . -iname "foo"
  bg
___

■ while

SYNTAX while exp do cmd done DESC IN OUT OP
___

■ wait

SYNTAX wait [id] DESC JobBg の終了まち 洗濯完了待ちにドーゾ IN OUT OP
  find /cygdrive/d > /dust/foo
  [1] 1849
  wait %1   // 処理まち
  ls -l     
  [1]+ Done 
  ls- l
___

■ unalias

SYNTAX unalias [OP] [name] DESC alias 解除 IN OUT OP a : all
  # すべて解除
  unalias -a
___

■ umask

SYNTAX umask [OP...] [mode] DESC User Mask を指定する File の保護モードの MASK を指定する POINT UNIX では Default の保護モードがある
    実行形式でない File
    110 110 110

    実行形式 File
    111 111 111
IN OUT OP
    # 現在の Mask を確認
    #  RET
    #    0022
    umask

        
    110 110 110   元の値
    000 010 010   MASK 022
    -----------
    110 100 100   


    # 他人に すべてを見せない
    umask 077

    110 110 110   元の値
    000 111 111   MASK 077
    -----------
    110 000 000   

    # 実行はだれでも許す
    umask 066

___

■ ulimit

___

■ limit

SYNTAX ulimit [OP...] [limit] DESC 各 Process が利用する資源 ( Memory, CPU 時間, File サイズ )に制限をかける 設定する値には 2 種類 HardLimit : 本当の上限値 ( su 以外は変更できない ) SoftLimit : User の指定する上限値 IN OUT OP v : VMem s : stack n : nrFile ID c : Corefile サイズ d : sz DataSegment p : sz Pipe

    # CPU 上限時間を 600 sec
    ulimit -S -t 600
    ulimit -S -t unlimited


    # HardLimit
    ulimit -H -t 600

  POINT
    # Core File サイズを 0 にする
    ulimit -S -c 0

    # VirtualMemory を 256 K
    ulimit -v 256 



  

___

■ type

SYNTAX type [OP...] cmd... DESC cmd の種類, dir を表示. IN OUT OP a : allocate p : Print hash Val // 索引 t : Type
  # RET: echo is a shell builtin
  type echo

  # RET: echo is /usr/bin/echo
  type -a echo

___

■ trap

SYNTAX trap [OP] [cmd...] [sigid] DESC shell が sigid をうけたあとに cmd を実行する IN OUT OP
    trap "you send signal SIGINT  : Intererapt Signal c-c" 2
  SIGHUP 1
  SIGINT 2
  SIGQUIT 3
  SIGTERM 15
___

■ time

SYNTAX time DESC Process 処理時間の user, system, real 時間を計測する POINT gprof は user 時間のみを計測するため, 最初に time で測定しておく

    # main.exe の時間を計測する
    time ./main.exe

    real   xxx
    user   xxx
    system xxx

    
    time sleep 2

    # RET:
    real  0m2.251s     # 実時間
    user  0m0.030s
    sys  0m0.061s


    # 任意の場所に記述する
    cat test.txt | /usr/bin/time main.exe

    



___

■ times

SYNTAX times DESC Process 処理時間の usr , sys , の合計時間を計測
   # 自作 Program の時間を計測する
   times converter.exe
___

■ diff

SYNTAX diff [OP...] file1 file2 diff [OP...] dir1 dir2 DESC file 同士を比較して, その差分と同一にするための情報を出力 text なら 行単位で比較する IN OUT OP i : insensitive w : ignore WhiteSpace l : long fmt s : 相違がない場合も報告 B : 空行のみの違いを無視 ignore Blank lines y : side-by-side 形式 ( 横にならべて比較 ) c : Context 形式 r : Recursive POINT emacs dired = でもできる [+] : 増えた [-] : 減った [!] : かわった
  // -w をつけるのは オススメ    
  diff -w ori.txt ret.txt    

  [< ] [>] [-] が差分の違い.
  # c: "Change" 
  # Line69 - Line71 が次のように変更された


  69,71c69,71     
  <  ======= aaa =======
  ---
  > ======= bbb =======
POINT text OR binary は diff が自動判定してくれる
   
   ファイルの最初の数バイトを調べて, テキストかバイナリかを決める

   正確なバイト数はシステムに依存しますがそれは通常数千になります

   ファイルの1部のすべてのバイトが `null' ではない場合
   テキストだと判定
        Text は \0 が ない ( UTF16 以外のとき )

   それ以外はバイナリと判定 ( binary は 0 がまざる )
明示したいときは( cygwin の環境ではあまり からないような... ) Text ですると, binary で比較してくれないような ... diff --binary a b --binary データをバイナリモードで読み書きする (Linux やその他の POSIX ホストでは意味なし) -a, --text ファイルがテキストには見えないような場合でも、 全てのファイルをテキストとみなして 1 行ずつ比較をする これすると, binary の比較もできる POINT binary のように扱うように命令できる diffが比較している2つのファイルのうちのがバイナリと考えるとき 通常ファイルの組を概要の出力書式が選択 されているように バイナリファイルが異なっていること だけを報告 行単位での比較がバイナリファイルにて普通は 意味が無いため ファイルがテキストファイルに扱いにしたいとき `null'文字が含まれているテキストファイルを比較する可能性があります diffは誤って これらをテキストファイル ではないと決定する `null'文字を特殊なフォーマットを示すために使用する ワープロで使用されている フォーマットのファイルを比較する可能性もあります 強制もできます
    -a, --text
  ファイルがテキストファイルであると考えさせ行ごとに比較できます
WARNING このオプション を使用して比較しているファイルが 実際はテキストを含んでいないとき おそらくファイルには数個の改行文字しかなく diffの出力は ファイ ルに含まれているすべての文字からなる長い行の差異を表示する hunk になる ( 見れたもんではないということ ) OP q --brief すべてのファイルをバイナリファイルだとdiffに強制的に考えさせ ファイルが(どのように異なっているかではなく) 異なっているかどうかのみを報告させることも可能 バイナリファイルの差は diff の出力結果がすべての差を取り切れないので 問題がおきる ( diff はステータス2で終了) この問題は`--a'や`--text'オプションを用いたり `-q'や`--brief'オプションを用いり発生しないので これらどちらのオプションでも diffはバイナリファイ ルをテキストファイルのように扱う テキスト と バイナリ で差がある OS では diff は通常すべてのデータをテキストとして読み書きする 代わりにバイナリデータとしてdiffに読み書きさせるために `--binary'オプションを使用 このオプションは GNUや伝統的なUnixシステムのようなPOSIX-準拠のシステムでは効果なし 多くの PCOS では 行末の改行の後にキャリッジリターン[ \r ]があります そのようなシス テムでは diffは通常入力されるこれらのキャリッジリターンを無視し それぞれの出力の行末にキャリッジリターンを生成しますが --binary diffはそれぞれの[ \r ]をそのまま入力文字として扱い 出力の行末にキャリッジ リターンを生成しない POSIX-準拠のシステムで変換する予定のテキストではないファイルを扱うとき, これは役に立つはず
  # このファイルは binary なので, \r を SKIP しないでよんでくれよ ! こと

`--strip-trailing-cr' diffは行末の改行にキャリッジリターンが続いている入力行を普通の改行として扱う 多くの PC OS から インポートされた不完全なテキストを 比較するとき役立つ このオプションは行が読み込まれる方 法に影響があり それは順次, 比較される方法と出力の方法に影響していきます. 2つのファイルをバイト単位で比較したいとき 2つのファイルのバイトごとの 差の値を表示するために `-l'オプションを用いてcmpプログ ラムを使用することが可能です cmpを用いると これらの バイトのASCII表現を表示するために`-b'オプションを使用するこ とも可能です 比較しているファイルのいずれかをdiff3がバイナリと考えるとき そのような比較は普通意味が無いので ふつうはエラー を報告します.diff3は ファイルがバイナリかどうかを diffが決定するテストと同じテストを使用します.diffを 用いるときと同様に 入力ファイルにテキストでないバイトが含まれているが それ以外はテキストファイルに似ているとき `-a'や`--text'オ プションを使用すり diff3にすべてのファイルをテキストファ イルと考えさせ 行単位での比較を強制できます
___

■ deroff

SYNTAX deroff [OP...] [file...] DESC file の中に記述された roff 構文をすべて削除して残りを STDOUT IN OUT OP
___

■ dd

SYNTAX dd [OP] DESC file format 変換 && 出力 upcase, downcase にドーゾ IN OUT OP
    dd if=foo of=bar conv=ucase | swab | block | unblock
___

■ dbx

SYNTAX dbx [OP] [obj...[corefile]] DESC debugger corefile : ERR 発生時の状態を出力 IN OUT OP
  cc -g foo.c -o out
  
  dbx out

  // 1-21 行目表示
  list 1,21 

  // breakpoint
  stop at 9 

  // 変数( symbol ) c を表示
  // 名前から address をひくことができるのね 
  print c   
  cont  
  quit 
___

■ suspend

SYNTAX suspend [OP] DESC shell の一時停止 c-z と同じ SIG_CONT ( job 再開 signal ) をうけたら再開. S mark をつけるよ IN OUT OP suspend
___

■ set

SYNTAX set [OP] [arg...] DESC IN OUT OP HISTSIZE=100 // shellscript と同様の SYNTAX SHELLVAR PPID : prt ps id // windows は 1 OSTYPE : OS TYPE HOSTNAME GROUPS : 現 user が属する Group list OLDPWD : 前の PWD RANDOM : RANDOM な値 自由につかってね SHELLOPTS : 現在の SHELLOPTS
___

■ cut

SYNTAX cut [OP...] [file...] DESC file から field 削除 awk でも代用できる OP c(Character) f(Field) s(Skip) : dlm を含まない行を出力しない IN : STDIN OUT: STDOUT 区切り文字の指定は 1 文字だけ Field の番号は 1 から指定する。
    # スペース区切りで 2 番目のカラムを取得する
    cut -f 2 -d " " test.txt

    # dlm が連続する場合は 空トークンとしてカウントされる
    #
    # BAD
    echo "  aaa  bbb" | cut -d " " -f 1

    # そこで tr でまとめる
    #  OK
    echo "  aaa  bbb" | tr -s " " " " | cut -d " " -f 2


    # [\n] は指定できない
    # BAD
    echo `echo $tmp | cut -f 2 -d "\n"`
    
    # STDIN から
    cat ~/foo.txt | cut -f 2 -d " "

    # 削除もできる
    cut -f2 -d: foo.c  // 第 2 field 削除. dlm [:]
範囲を指定するには N N- N-M -M といった指定をする
    cut -f 5-7 -d: foo.c

    # RET: c d e
    echo "a b c d e" | cut -f 3- -d " "

    # RET: a b c
    echo "a b c d e" | cut -f -3 -d " "

    # [,] で複数を指定
    cut -f 5,7 -d: foo.c 

    # 重複したときは, まとめてくれる
    cut -f 5,7,5 -d: foo.c 

    echo "c:/test.txt" | cut -f 1 -d "."

    # Field が Token より多いときは "" をかえす
    #  RET
    #    ""
    echo "c:/foo/bar/test.txt" | cut -f 6 -d "."

    # 分割できないなら そのまま返る
    # RET    c:/foo/bar/
    echo "c:/foo/bar/" | cut -f 6 -d "."

    # 2 byte 目を出力
    # RET
    #    b
    echo abc | cut -b 2


    # 表示する文字数の範囲を指定する
    cut -c 5 foo.txt
___

■ csh

SYNTAX csh [OP...] [arg...] DESC shell with c link SYNTAX IN OUT OP i : Interactive mode f : fast ( not read .cshrc )
    # csh で実行
    csh foo.sh
___

■ comm

SYNTAX comm [OP...] file1 file2 DESC 2 つの sort すみ file を比較して 片方にだけある行と, 両方にある行を分類する IN OUT OP 1 suppress lines unique to FILE1 2 suppress lines unique to FILE2 3 suppress lines that appear in both files
  comm foo.c bar.c
  
  foo
      bar
    common


  # B のみにある Line を出力
  comm -13 A B  

  # stdin と 比較
  #
  echo aaa | comm - B



___

■ colrm

SYNTAX colrm [scol [ecol]] DESC Start - End Column を削除 IN STDIN OUT OP
    # 1 から start 
  colrm 1 3 <  foo.c
___

■ cmp

SYNTAX cmp [OP] file1 file2 DESC file 内容を 1 byte ごとに比較 相違があるかどうかのみチェック 詳細は diff で POINT 回帰テストとして利用できる IN OUT OP
    # RET: test.txt b differ: char 4, line 1
    cmp a.txt b.txt

    # Silent 異なるかどうか表示
    cmp -s a.txt b.txt

    # STDIN と比較する
    echo aaa | cmp a.txt -

    # 2 Byte 目までを比較
    cmp -n 2 a b

    # 指定した Byte 位置まで Ignore する
    cmp -i 2 a b
___

■ chsh

SYNTAX chsh name [shell] DESC IN OUT OP
___

■ chown

SYNTAX chown [OP...] owner file... DESC Change Owner IN OUT OP R : Recursive
    # "test" という usr にかえる
    chown test foo.c

    
    # windows の local usr でないとダメ
    #      chown: invalid user: `foobar'
    chown  foobar   foo.c


    # Owner を変更すると  Permission にも影響がでる
    chmod  700  foo.c
  

    # 自分のものでは ないため , Permission ERROR
    chown  otherusr  foo.c
    echo foo >> foo.c


# Command Prompt でも確認できる
    dir /Q
    2010/06/29  07:19    60 Hostname\test         usr_test.txt



___

■ chmod

SYNTAX chmod [OP] mode file... DESC file の Permission( 許可 ) mode 変更 POINT Windows( Explorer の表記と比較してみた ) Windows で 読み取り専用 ON < -> r--r--r-- ( Read ) OFF < -> rw-rw-rw- ( RW ) Cygwin 経由で変更 POINT Windows の Service に連動しているだけ chmod 111 foo.txt < -> 読み取り専用 ON chmod 333 foo.txt < -> 読み取り専用 ON chmod 777 foo.txt < -> x はつかない ( 中身を解析してる ? ) どうも emacs の dired の表記はあてにならない ( 拡張子によって 表記がかわる ) IN OUT OP
    # group add Write Permission


    # Directory に Write 権限を消すと, ディレクトリの編集ができない
    # ( Directory というファイルの編集ができない )
    chmod u-w dirfoo


    変更を対処をきめる
       A  combination of the letters "ugoa" controls 
       which users' access to the file will be changed: the user who

       owns it (u), 
       other users in the file's group (g), 
       other users not in the file's group (o), or  all  users  (a).   

       If  none  of these are given, the effect is as if a were given, but bits that are set in the umask
       are not affected.


The first digit selects 


自分
the set user ID (4) and
       set group ID (2) 
       and restricted deletion or sticky (1) attributes.  

同一グループ
The second digit selects  permissions
       for  the  user who owns the file: read (4), write (2), and execute (1); 

その他のグループ
the third selects permissions for
       other users in the file's group, with the same values; 

and the fourth for other users not in  the  file's
       group, with the same values.


    # u : 自分 ( User )
    # g : 同じ仲間 ( Group )
    # o : 他人 ( Other )
    # a : みんな ( All )


    # 全員に read の権限を与える
    chmod a+r foo.txt
    
    # all usr に実行権限
    chmod a+x file    

    # group add Write Permission
    chmod g+w foo.c  

    # group add Write Permission
    chmod g-(e | w | x) foo.c  

    # Directory 以下をまとめて指定( Recursive )
    chmod -R 777 dirname
    # ls -l での表記
    User  Group  Other

    # bit mask
    Read Write eXecute
    4    2     1

    
    # Group に Write 権限
    chmod   020   filename

    # "6" とあれば Read + Write
    chmod   060   filename

    
まとめ

     Windows の usr account を変更したら反映するには mkpasswd -l
     Windows 上の usr account を変更して 作成した file は
  

Windows 上の User を確認
    net user

    \\hostname のユーザー アカウント

    -------------------------------------------------------------------------------
    Administrator            ASPNET                   Guest                    
    HelpAssistant            sshd                     


    # 他の usr ( test ) が作成した file 

    ls -l
    -rw-r--r--   1 test           なし           0 Jun 29 06:42 usr_test.txt


    # Explorer 上でつくると 777 になる
    -rwxrwxrwx   1 test           なし           0 Jun 29 06:42 usr_test.txt

    
    # 自分 usr ( my ) では変更できない
    echo foo >> usr_test.txt
    bash: usr_test.txt: Permission denied


    # usr( my )から 変更してみる
    chmod 777  usr_test.txt


    # 管理者権限があるから変更できる。
    ls -l
    -rwxrwxrwx   1 test           なし          30 Jun 29 07:09 usr_XXX.txt
    echo foo >> usr_test.txt

    
    # 再度変更すると Permission ERROR
    chmod    700       usr_test.txt
    echo foo >> usr_test.txt
    bash: usr_test.txt: Permission denied

    Directory にも Permission を設定できる

    mkdir foo
    # 
    chmod 600 foo

    # 
    cd foo

    pwd


    実行権限 の TEST

    # これだと実行できる
    chmod 600 test.sh

    # "r" を消すと だめ
    chmod 100 test.sh
    bash: ./test.sh: Permission denied
    
___

■ df

SYNTAX df DESC Filesystem 全体の空きスペースの取得 OP

  # Current sub tree の空きスペース取得
  df .

  # C Drive の空き
  df c:/

  # 
  df -k

  # Human-readable
  df -h .

___

■ tar

key c : new archive create x : restore archive OP v : 処理したfile出力 f : 指定する記録媒体名 tar cf foo_arc ~/work // archive作成 tar xvf foo_arc
___

■ chgrp

SYNTAX chgrp [OP...] group file... DESC IN OUT OP R : Recursive v : verpose f : err 発生時に出力しない
    # 適当な grp 名ではだめ
    chgrp newgrp foo.c
___

■ cb

SYNTAX cb [OP] [file...] DESC c program beatifier IN D:STDIN OUT OP s : Kernihan & Richie の標準形式.
___

■ cancel

SYNTAX cancel [OP...] [id...] [prt...] DESC line printer の出力要求 cancel IN OUT OP a : rm all e : Empty Q
___

■ biff

SYNTAX biff [OP] DESC mail が着信した時点での msg 出力. IN OUT OP
  # 着信状態をチェック
  biff
___

■ lpq

SYNTAX lpq [OP] [job...] [usr...] DESC Line Printer Queue 指定 job, 指定 usr の spool queue 状況を出力 ENV:PRINTER で printer 指定 ( 指定がないようだ ) IN OUT OP + : 空になるまで 報告 l : 詳細情報 Pptr : printer 指定
___

■ lpr

SYNTAX lpr [OP...] [file...] DESC printer( spool )に job を出力 IN OUT OP r : 印刷完了後に file 削除 lpr -Plp foo.c // spooler に転送 RANK OWNER JOB FILE TOTAL SIZE active usr_hoge 31 foo.c 1024byte lprm 31 lpq // 待ち行列表示 no entries
___

■ lprm

SYNTAX lprm [OP] [job...] [usr...] DESC spool q から 指定 job 削除 IN OUT OP - : all job remove
___

■ lpstat

SYNTAX lpstat [OP] DESC printer 状態の出力 IN OUT OP t : all o : Output req info
  # RET: printer epson111 is idle 
  lpstat -t
___

■ mail

SYNTAX mail [OP...] [usr...] DESC 指定 usr に mail 発信 IN OUT OP
  mail usr001
  Subject: Meeting
    tell your sch
  
  login usr001
  
  mail // mail を読む
  
  & 2 // 指定
  & d // 削除
  & q // quit 
// mail をかく mail user_foo Subject: appointment // 表題. Message ... c-d Cc : carbon cp # mail を読む mail 2. list から選ぶ. d : del s : save q : quit
___

■ lint

SYNTAX DESC IN OUT OP a : long 変数への不正な値の代入 b : 実行されない break c : 移植性のない cast u : undefined variable funtion v : not use variable function x : not use extern variable z : 未定義の構造体
___

■ ln

SYNTAX ln [OP] file [file2] DESC SymbolicLink は 別名のこと 消しても OK Windows における Shortcut IN OUT OP s : SymbolicLink
  
  # foo.cpp の SymbolicLink( Alias) を bar.cpp という名前で作成
  ln -s  /pro/bar/foo.cpp /data/bar.cpp

  # Directory の Link
  ln -s  /usr/bin  ~/bin

  # src の HardLink を dst という名前で作成
  ln src dst
___

■ lock

SYNTAX lock [OP] DESC 端末の Lock IN OUT OP
    # 15 分 lock 
    lock -15
___

■ login

SYNTAX login [OP] [name] login [OP] [name [env]] // ENV 指定で DESC session 開始 IN OUT OP p : Preserve cur ENV r : login remote host login xxx Password: POINT Login とは これから入る Computer に対して, 認証をうけること
___

■ logname

SYNTAX logname DESC system に login したときの名前 Windows に login している Accout 名がかえります IN OUT OP
  logname -> xxx
___

■ lp

SYNTAX lp [OP] [file...] DESC 指定 file を line printer への出力要求 Job Q とかは Printer をメタファーにするとわかりやすいかも. IN file D:STDIN OUT OP c : file の cp を作成して出力 dDest : printer 指定 m : mail 送信 nNum : 枚数指定 s : Silent t : add Title qPri : Job の優先度 Ppage : page 指定して出力 E : Server に接続する場合は Encode
  # 1-3, 5 page 目を出力
  lp -P 1-3 5 foo.c
___

■ leave

SYNTAX leave [hhmm] DESC 指定した時間に alarm これないかも IN OUT OP
  leave 1630
___

■ route

SYNTAX route [OP] cmd [-net|host] tgt [nm] [gw] [arg] route [OP] 操作 [-net|host] あて先 [nm] [gw] [arg] DESC RoutingTable の操作 IN OUT OP cmd add : 経路追加 del : 削除 flush : 全削除 change : 属性変更 get : あて先に対する 経路表示. tgt -net network -host hostname nm : netmask 手動設定. gw : gateway 指定 arg cloning 経路をひとつ生成. xresolve 使用中の msg 発行. iface あて先が直接到達可能. static 手動で追加経路を指定 rtt n : 往復時間を指定 rttvar n : 往復時間の差異 n を指定. senddpipe n : 送信 wnd size 指定 hopcount n : gateway を n にする OP f : 全 gateway entry 削除. n : host | network を数値で表現. v : Verpose q : Quit C : Routing Chashe を表示
    route add -net 192.165.0.4 -netmask 255.255.255.0

    # Table へ追加
    route add default gw 192.168.1.1

___

■ scp

SYNTAX scp src dst DESC SSH によって暗号化した安全な Copy する POINT password なしで転送するには remote 側に公開鍵をわたしておく

    // local host の d:/foo を remote host の usr の ~ ( home Directory ) に移動する
    scp /cygdrive/d/foo  usr@localhost:
    usr@localhost's password: XXX

    //  Remote の / に copy 
    scp /cygdrive/d/foo  usr@localhost:/

    // Remote から Local にもできる

___

■ rsh(ssh)

SYNTAX rsh [OP] hostname [cmd] ssh [OP] hostname [cmd] DESC Remote Shell localnetwork 上の machine に指定 Command で実行させる network 経由で remote machine に login して command を実行する 通信データの暗号化と 公開鍵暗号をつかって安全な認証をする。 SSH という Protocol を使って通信する。 ssh ではいるのは login Account がばれないようにするため Server 側は Daemon( sshd )を起動しておく Server の設定をする
    # "-y" で All Yes
    ssh-host-config -y


    次のファイルができる
    
    // HostKey のペア
    /etc/ssh_host_key
    /etc/ssh_host_key.pub

    // Hostの RSA Key のペア ( SSH2 で使用 )
    /etc/ssh_host_rsa_key
    /etc/ssh_host_rsa_key.pub

    // Hostの DSA Key のペア ( SSH2 で使用 )
    /etc/ssh_host_rsa_key
    /etc/ssh_host_rsa_key.pub

    // OpenSSH の Server 用の設定ファイル
    /etc/sshd_config

    
    Permission == 許可

Server の設定ファイルを修正 /etc/sshd_config

    # 22 番 port で開始
    Port 22
    
    # Permission のチェックをしない
    StrictModes no

    # 実行権限を分離する
    UsePrivilegeSeparation yes

    # 安全な転送のため, sftp を利用する( SubSystem として ftp を利用する )
    Subsystem  sftp  /usr/sbin/sftp-server

sshでパスワード認証を禁止するには Server を起動する
    # Start する
    cygrunsrv -S sshd

    cygrunsrv -E sshd ;     cygrunsrv -S sshd

    cygrunsrv -Q sshd

    # service を削除する
    cygrunsrv -R sshd


    WARNING 
      inetd が起動時は sshd は起動できない

    # 動作チェック
    netstat -an

    Active Connections

      Proto  Local Address          Foreign Address        State
      TCP    0.0.0.0:23             0.0.0.0:0              LISTENING
___

■ サーバへのログイン。( 鍵無し )

ssh -l userName hostname # local にはいる ssh -l xxx localhost 以下のように聞かれるので、[ yes ]を入力する。( 表示されるのは、初回のみ ) The authenticity of host 'serverName ( ipAddress )' can't be established. RSA key fingerprint is 18:7e:00:d6:e0:70:05:e2:53:d3:53:d1:2e:50:91:9b. Are you sure you want to continue connecting (yes/no)? 以下のように聞かれるので、パスワードを入力 ( password は windows login の account, password ) Warning: Permanently added 'serverName,ipAddress' (RSA) to the list of known hosts. userName@serverName's password: 以下のように表示されればログイン成功 Last login: Fri Dec 9 21:58:08 2005 [userName@serverName userName]$ [ exit ]を入力して、ログアウトする。 $ exit Connection to severName closed.
___

■ 鍵の作成と登録

鍵の作成。 # クライアント側で、鍵の作成 $ ssh-keygen -t rsa ※ [ rsa ]は、RSA暗号方式の鍵を作成するオプション 他には以下の指定が有りますが、 rsa が主流 dsa DSA暗号 rsa1 SSH1のRSA暗号 以下のように聞かれたら、[ Enter ]を押す Generating public/private rsa key pair. Enter file in which to save the key (/home/userName/.ssh/id_rsa): 以下のように聞かれたら、パスワードを入力( 空にする ) Created directory '/home/userName/.ssh'. Enter passphrase (empty for no passphrase): 次に以下のように聞かれるので、再度パスワードを入力 Enter same passphrase again: 以下のように表示されて、 Your identification has been saved in /home/userName/.ssh/id_rsa. Your public key has been saved in /home/userName/.ssh/id_rsa.pub. The key fingerprint is: 29:d7:6a:d6:60:cb:83:b3:c0:d3:1b:fd:48:b5:42:45 userName@serverName [ ~/.ssh ]に、以下の鍵が作成 秘密鍵 : id_rsa 公開鍵 : id_rsa.pub ※ FDを使用するなどして、公開鍵をサーバへ移動 公開鍵を、サーバへ登録します。 サーバにログイン # ディレクトリを移動 $ cd $ cd .ssh # 無ければ作成 $ cd $ mkdir .ssh $ cd .ssh # クライアントで作成した公開鍵を、ファイル[ authorized_keys ]に追加登録 $ cat id_rsa.pub >> authorized_keys # [ authorized_keys ]には複数の鍵の登録が可能 # パーミッションを変更 # rw- --- --- $ chmod 600 authorized_keys The authenticity(信頼性) of host 'localhost (127.0.0.1)' can't be established localhost は安全でないよ ? それでも接続する ? RSA暗号は インターネットでも広く利用されている話題の暗号 フィンガープリントとは 日本語に直すと「拇印」や「指紋」意味 電子メールの内容やデジタル証明書などが改ざんされていないことを証明するデータ 接続を続けますか ? WARNING: Permanently added 'localhost' (RSA) to the list of known hosts. Write failed: Software caused connection abort * 公開鍵の作成 * PASSWORD usrname *** WARNING: group and other have been revoked write permission to your home *** WARNING: directory /home/usrname. *** WARNING: This is required by OpenSSH to allow public key authentication using *** WARNING: the key files stored in your .ssh subdirectory. *** WARNING: Revert this change ONLY if you know what you are doing! *** Query: Shall I create an SSH1 RSA identity file for you? (yes/no) yes *** Info: Generating /home/usrname/.ssh/identity Enter passphrase (empty for no passphrase): Enter same passphrase again: *** Query: Do you want to use this identity to login to this machine? (yes/no) yes *** Info: Adding to /home/usrname/.ssh/authorized_keys *** Query: Shall I create an SSH2 RSA identity file for you? (yes/no) no *** Query: Shall I create an SSH2 DSA identity file for you? (yes/no) no *** Info: Configuration finished. Have fun!
___

■ ACCESS 許可の設定

Linuxサーバでアクセス制限する方法 ftp のアクセスを許可するが 192.168.0.* zdnet-n.pub.softbank.co.jp のアクセスのみを許可 in.ftpd: 192.168.0. zdnet-n.pub.softbank.co.jp // sshコマンドのログイン要求で「Permission denied」と表示される // /etc/hosts.deny SYNTAX デーモン名: (ホスト名|IPアドレス) DESC Reboot しなくても OK Linux系 OSでは このファイルを使ってリモートホストからのアクセス制限できる
  # comment

    sshd: 
    # すべてを拒否する
    # ssh_exchange_identification: Connection closed by remote host

    # 身分証明が切られた
    # Remote Host によって 接続が切られた
    ALL: ALL
    # localhost のみ許可する
    sshd: localhost

  # ssh Daemon の設定ファイル
    # Listen する Port を変更する
    Port 23
    # 
    # 

  



# TCP/IP telnet の説明 IN OUT OP luser : 他 user で cmd 実行 n : STDIN を /dev/null に redirect する. d : socket debug 有効 x : Data 暗号化 ssh g : remotehost が localforwarding に接続することを許可する f : background 実行 i file : RSA 認証に使用される file 指定. I name : login する user 名指定. p port : port 指定. q : Quit s : subSystem 起動 v : Verpose l : Login User ssh linux02 gcc exfile.c
  // Tera Term の代わりに利用する
  // ふだん Windows ではいっている System なら login できる

  # この usr のみアクセスを許しますよってこと
  ssh  -l usr hostname
  

  # 後はいつもの Shell の操作
  mkdir test

  # おわり
  exit
# netstat -n で IP を調べてアクセス # 外から自分の Machine を指定してみる # RET: 接続が拒否されました. # remote desktop ってそういうことか ! rsh xx.xxx.xxx.xx port 22 == SSH # RET: connection refused # 自分へはだめ ssh localhost Client から接続します SSH Protocol が組み込まれている Client が必要です TTSSH を利用します TeraTerm の拡張 SSH2 には非対応

    // Install します
    

    // 解凍したファイルを TeraTerm ディレクトリに コピー
    
    
    // Program > から実行します


    // TeraTerm からは, 



    // ちなみに windows の Account ではいれた( ここはそういうものか? )
    //
     Use Plain Password to login
     username
     PassPhrase
WARNING /etc/sshd_config で Version を変更して再起動すると動作した
      #Protocol 2

      # こっちを使う
      Protocol 1.2
安全ではないため 公開鍵 を Login に使う POINT password 認証なら, 以下の操作は不要 // PublicKey, PrivateKey のペアをつくる // PublicKey を Server の user home におく 次の方法でやります
    // Client で Key をつくり, scp で server に転送

    // server でつくり, フロッピーなどで, Client に Private Key を送る
// 鍵をつくります # このコマンドで作成 ssh_user_config # ~/.ssh 以下に作成 # すべて Yes で "xxx" をパスワードにする ssh-user-config -y -p xxx /etc/hosts.allow /etc/hosts.deny
    sshd へ access するには設定ファイルを変更しておく


___

■ ruptime

SYNTAX ruptime [OP] DESC LocalNetwork 上の Machine 稼動状況を出力 どの Machine( Host ) が稼動しているか 調べてね. 現在ないかも IN OUT OP a : all( idle user 含む ) l : LoadAverage で sort r : Reverse t : uptime で sort u : user 数で sort
___

■ ident

SYNTAX ident file DESC identify RCS keyword strings in files 実行 File がどの Rivision で build されたか確認する Binary に RCS keyword があることが前提
    cc foo.c

    # src, obj から RCS keyword を確認する
    ident  foo.c a.out

___

■ rwho

SYNTAX rwho [OP] DESC LocalNetwork 上の Login している user 状況報告. IN OUT OP a : all
  rwho -a
___

■ script

SYNTAX script [OP] [file] DESC STDOUT に出力される情報を指定 file へ出力 IN OUT OP a : Append q : Queit t : TimeStamp
  script 
  echo foo;
  echo bar;
  exit;
  ls typescript 
___

■ ping

SYNTAX ping [OP] host [psize] [cnt] DESC サーバが生きているか(反応するか)調査します packet を送り, 交信可能ならば, response がかえる c-c で中止 ipconfig で LocalMachine が接続してたら 相手を ping で確認 host : DomainName | IPAddress で指定 DomainName と IPAddress は意味は同じ psize : packet size cnt : 送信回数 IN OUT OP c cnt : d : 使用する socket に SO_DEBUG をつける i sec : I sec : interval n : IPAddress 表示 q : quit ( 要約 ) R : Record s sz : v : Verpose
    ping `hostname`
    ping www.yahoo.co.jp

    # 以下でも OK ( Domain == IP == hostname ) みたいなもんだね 
    ping www.google.co.jp 


    # www はいらない
    ping yahoo.co.jp


    # 自分自身にもできる
    # 64 Bytes from 192.168.0.2 
    ping 192.168.0.2 


    # IPAddress を調べるのにも使う
    #    PING hostname (127.0.0.1): 56 data bytes
    ping localhost


    # 生きてる ? 
    ping hostname

    # IP を調べることにも使える
    ping hostname
WARNING ping も DNS Server を利用するため, 設定が正しくないと失敗する ICMP Protocol を Block するルータでも失敗します
___

■ rcp

SYNTAX rcp [OP] file1 file2 rcp [OP] file... dir ecp [OP] [user@host1:] file1 [user@host2:] file2 DESC リモートマシン間でのファイルをコピーする IN OUT OP r : Recursive p : Preserve TimeStamp 変更なし x : data を DES 暗号化 c : cipher : 使用する 暗号化指定 i : file : RSA 認証の識別 file を指定 P : port : Port を指定
    scp file.c linux01:/tmp/
___

■ rlogin

SYNTAX rlogin [OP] hostname DESC remote machine に login IN OUT OP ec : 接続をきる chara 指定 l user : 他の user 名で login 8 : 8 bit code を透過させる 7 : pality bit を除去 E : d : Socket debug ON x : session を DES 暗号化
___

■ printenv

SYNTAX printenv [var] DESC print ENV IN OUT OP
  HOSTNAME=YOUR-CE4EAF55BB
  HOME=/home/usrname
  TERM=cygwin  # terminal type 
  SHELL=d:/meadow/bin/cmdproxy.exe   # login 時の shell 
___

■ pr

SYNTAX pr [OP] [file...] DESC printer 出力に適した Format に変換して STDOUT へ. printer 用の filter IN file D:STDIN OUT STDOUT OP f : 改 page に Formfeed character h str : header に文字列使用. l n : 行数指定. t : header hooter なし w : width +n : n page
    pr file | lp
    pr file -h title | lp

    pr -T -w 80 -4
___

■ telnet

SYNTAX telnet [OP] [host [port]] DESC TELNET Protocol で通信をする hostName IPAddress で指定する port : TCP port 番号 Windows、MacosX、Linux、その他UNIX系OSで大抵ある Default 23 番 Port で Listen( 待受 )する telnet client は server と接続をして 文字列をもらうのが仕事 WARNING 通信する文字列 が 平文のため , PacketCapture されるとすべての情報が見られる HTTP Server にも接続できる login できるけど, 任意の Program は起動できない bat は起動できた stdout の結果をかえす * Expect || TeraTerm 使えばいけるはず 代用として RemoteDesktop がある telnet Server の機能は 受け取った文字列 を shell cmd として実行すること 遠隔操作ができる win32, cygwin 共にある どちらも共通の流れとして Server 側を立ち上げる必要がある Windows の場合
    // Server をたちあげておく
    Service > Telnet > 起動

    // client をたちあげて 遠隔操作をする
      w-r : telnet
      > telnet
      // つなげる
      //    Server が止まっていると, 次のように言われる
      //    Telnet サービスは停止しています....
      open hostname


    # Port 番号を指定して 接続
    telnet> open localhost 23

    // 名前で 直接指定してみる
    // %WINDIR%\system32\drivers\etc\services


      open localhost telnet
      // Login Account と Password をいれる. Windows の Account 
      // Password なし の Account ははいれない
      // 
      dir ...

      // 終わる
      exit
* どうやら telnet Server 以外とも やりとりできる * telnet client とは 本質的に Server 側に TCP で command という文字列を送るだけの Program POINT RemoteLogin の他に HTTP, SMTP などに Access できる RemoteLogin してみる telnet localhost 23 * 実際にやってみた( ただし画面の表記がおかしい ) 以下の方法以外はうまくいかない

    # Local HttpServer へ接続
    #
    cmd > telnet
    telnet > open localhost 80
    GET / HTTP/1.0
    ----------------

* mail も送信できる IN OUT OP 8 : 8 bit data path 使用. E : Escape 文字禁止 L : 出力に対して 8 bit data path 使用 c : .telnetrc file を使用しない. d : Socket debug ON e Char : Escape 文字有効. l user : 環境変数の値を現在の user として送信 n file : trace 記録 file open r : rlogin cmd と似た interface を提供. a : 自動 login 有効. x : data stream を暗号化する. Telnet への cmd --- status : cur stat // RET No Connection display: disp var set var val // set erase T close | logout : session 終了 quit open host [-l user] [[-] port] port D:23/tcp telnet 192.199.0.5 # RemoteMachine 111.111.111.11 にアクセス telnet 111.111.111.11 telnet // 引数なしで prompt mode ? : help quit : end どういうときに使うか ? RemoteMachine の MailServer の接続確認がとれない( ping ) ときに telnet で Host , Port を指定すれば状況確認可能
___

■ tee

SYNTAX tee [OP] [file...] DESC read from STDIN and write to standard output and files 2 つにわける [ T ]なのか IN OUT OP
  # log をとりながら STDOUT の結果をみるときに便利です
  echo ls | tee outfile | grep "emacs"
  
  bsi.sh tee /dust/log.txt
  # redirect もできる ( 地味だけど便利なやつだ  )
  getnewmusic.sh | tee /dust/mus_`date "+%F"` >> /work/log/htm/web/index.html
___

■ sh

SYNTAX sh [OP] [arg] DESC B Shell 起動 IN OUT OP i : interactive # 普段はこれ使っている s : Stdin から cmd 読み込み c str : str を cmd として読み込む r : Ristricted ( 限定版 ) sh foo.sh sh -c "echo foobar" echo "echo foobar" | sh -s (755)
___

■ spline

SYNTAX spline [OP] DESC spline 補間値の登録 STDIN から x, y を取得 IN OUT OP n : n 分割 p : 周期的な出力 x : 下限値の設定 k : 境界値の設定
___

■ split

SYNTAX split [OP] [file [prefix]] DESC 指定 file を指定行数に分割して file 出力をする IN file D:STDIN OUT name : file prefix v : verpose n : nrLine C : 分割数上限値 b : byte 単位
  # 2 行ずつ に分割して, [out] という PREFIX をつける
  # file が大量にできるので注意
  split -2 foo.txt out
___

■ stty

SYNTAX stty [OP] DESC 端末の設定 現在の STDOUT になっている Terminal の option 設定. IN OUT OP a : 現在の設定を表示 # 指定文字がそれぞれの機能 erase C : 1 文字消去 kill C : 1 行消去 weraseC : 1 単語 intr C : 強制わりこみ stop C : 出力の停止. start C : 出力の再開 eof C : file の終わり. - tabs : tab を space に展開しない - echo : すべての文字を echo back する - parodd: 奇数 パリティに設定する - icrnl : 復帰文字を改行文字に変換
___

■ su

SYNTAX su [OP] [name] DESC 一時的な superUser , 他の user へのきりかえ 再ログインすることなく シェルのユーザを切り替えるために利用される Unixにおいて マシンの管理作業をするとき root 権限を得るために使う IN OUT OP - : 指定 user の login の環境が設定される. c cmd : cmd 実行 m : ENV を reset しない --shell=shell 指定 shell を実行する.
  
    su usrname

    # build して Install するとき
    ./configure
    make
    su
    make install


    # windows Default の管理者になる 
    su Administrator

    
___

■ tail

SYNTAX tail [OP] [file] DESC ファイルの指定された位置から末尾まで出力 OP +num : file 先頭からの位置 -num : file 末尾からの位置 l : 行数 c : byte 数指定 b : block指定 r : reverse
  # 後ろから 2 行目
  tail -2 foo.txt
  tail -2c foo.txt
  tail -2b foo.txt

  # 先頭10行目 から最後まで
  tail -n +10 foo.txt  

  # 最後の2行
  ls | tail -n 2
  
___

■ head

SYNTAX head [OP...] [file...] DESC Print the first 10 lines of each FILE to STDOUT IN OUT OP +num : file 先頭からの位置 -num : file 末尾からの位置 n : NrLine c : byte 数指定 b : block指定 r : reverse
  # 先頭 〜 2 行目まで
  head -n 2 foo.htm

  # 先頭 〜 後ろから2行目の一つ前 ( 後ろ 2 行を除去 )
  head -n -2 foo.htm

  # 先頭 1 Byte
  tail -c 1 foo.htm
___

■ sort

SYNTAX sort [OP] [file...] DESC 指定 file を行単位に sort して STDOUT へ IN STDIN ( file ) OUT STDOUT OP c : Check only ( sort されていれば出力なし ) m : merge o file : file へ結果を出力 Tdir : 一時file dir 指定 u : 同一行の削除 これ便利 y kMem : sort で利用する memory 容量を指定. b : sortKey Field を指定する際に SPC TAB を無視. d : Dictionary 辞書順 f : Fold insensitive i : Ignore 非印字可能文字 r : reverse tC: 区切り文字を C M : 月順で sort ( JAN < FEB < ... ) g : 数値で sort なし 行全体をキーフィールドとして、ASCIIコードの昇順(0<9<A<Z<a<Z)に並べ替える -r 降順にソートする -n 数値フィールドのソートをする +n n番目のフィールド以降をキーとしてソートするフィールドは左から0、1、2・・・と指定) -m m番目のフィールドまでをキーとしてソートする(フィールドは左から1、2、3・・・と指定) -b フィールドの開始位置を決定する際、先行する余分なブランクは無視する(デフォルトでは ひとつの空白またはタブがフィールドの区切りとみなされる) -tx 文字(記号)xをフィールド分離記号として定義する o file    結果をoutfileに出力する入力filenameと同一でもよい
    # 行全体を Key に使用する   
    sort foo.txt            

    # file 指定をしない場合は STDIN から
    cat foo.txt | sort 

    # 7 番目の Field から基準に sort する
    sort +7 foo.txt

    # 単語単位は できない ? 
    echo "bbb aaa ccc" | sort -t " " 
    
    # しかたないので sed で置換する
    echo "a c e d b" | sed "s/ /\n/g" | sort

    # これは OK
    echo $'aaa\ncccc\nbbb' | sort -r

    # Fold Insentive
    echo -e "aaa\nBBB" | sort -f  
    echo -e "aaa\nBBB" | sort
    

    sort -t: +5 /etc/passwd
// Uniq にまとめるには sort -u log.txt; text file の行単位の並び替え OP r : 反転 f : fold (大文字小文字の区別なし) n : 数値としてsort
___

■ size

SYNTAX size [OP] [file...] DESC ObjectFile(.o) の各セクション ( TEXT , DATA , BSS ) のサイズ出力 POINT TEXT : code 領域 DATA : 初期化済み extern , static data 領域 BSS : 未初期化 extern , static data 領域 IN foo.out D:a.out OUT OP n : NLOAD section サイズを出力. f : section 名も出力 x | d | o : radix = 16 | 10 | 8 A : SystemV 形式で出力する. B : Berkeley 形式で出力する t : total
   text     data      bss      dec      hex  filename
 272668     2116    19296   294080    47cc0  main.out
size -A main.out
main.out  :
section     size      addr
.text    262808   4198400
.data       352   4464640        
.rdata     9860   4468736       # ReadOnly
.bss      19296   4481024
.idata     1764   4501504
Total    294080
___

■ passwd

SYNTAX passwd [OP] [user] DESC password の設定, 変更 CP > userAcount に反映される cygwin は WIN32 のラッパー IN user D: curUser OUT OP s : login Shell 変更 f : finger cmd の出力情報を変更 F file : 指定 file を passwd とする l : Lock account ( su only ) u : UnLock account ( su only ) d : 指定した account が passwd なしで利用可能にする S : State 出力.
    # user001 の password を変更
    passwd user001
___

■ mkpasswd

# Windows のローカルアカウントを passwd と group に反映させる mkpasswd と mkgroup を使って /etc に passwd ファイルと group ファイルをつくる mkpasswd -l > /etc/passwd WARNING cygwin を install 後に Windows の local account を変更, 追加すると cygwin 上では反映されない cygrunsrv のように account を扱う Program では ERROR になるケースがある ls -la drwxrwxrwx+ 3 ???????? ???????? 0 Sep 3 2006 packages 更新する mkpasswd -l /etc/passwd ls -la drwxrwxrwx+ 3 newusr 0 Sep 3 2006 packages # -l : Local Group mkgroup -l > /etc/group ドメインアカウントを passwd と group に追加する。 ドメインコントローラを利用している場合は以下の手順でドメインのアカウントを利用できるようにします。 mkpasswd -d >> /etc/passwd mkgroup -d >> /etc/group
___

■ mkgroup

___

■ paste

SYNTAX paste [OP] file1 [file2] DESC file を同じ行で連結 IN OUT OP s : 連続行を連結 d char: CRLF を指定文字に置換
___

■ pg

SYNTAX pg [OP] [file...] DESC 指定 file | STDIN を画面ごとに出力 page をめくるのを想像しよう q : quit IN file D:STDIN OUT OP n : NrLine p str : Prompt string c : Clear e : End of File で停止しない f : 行の分割をしない. s : Prompt を反転 +n : 開始行を指定. +/ptn/ : 指定 ptn を含む行を最初から出力.
___

■ od

SYNTAX od [OP] [file] [[+]offset [b][label]] DESC 指定した file を dump ( 8 10 16 ASCII )にする IN file D:STDIN OUT OP o : 2byte ごとに 8 進数 s : 2byte ごとに signed 10進数 x : 2byte ごとに 16進数
    # binary を Dump
    od  -x  main.o

    # Default 8(10) 進数
    od  main.o

    # dump と表示が反転するかも  というより 本来の並びはこうなっている ?
    cat test.txt
    aaa\n
    
    od test.txt
    0000000 6161 0a61
    0000004    

    dump test.txt
    test.txt:
    00000000  6161 610a                               aaa.



___

■ netstat

SYNTAX netstat [OP] DESC 接続状況を表示する UDP Local Address ForeignAdress 手段 自分 相手 1. net につながない環境でも, -a とすると表示される. local machine の network 情報の出力. win32 にしかない ? Host 名も取得できるようだ. ( HostName == IPAddress から自動生成される名前. xxx.yyy ) 接続状態

    LISTENING   : Listen 中のポート
    ESTABLISHED : 接続 完了
    TIME_WAIT   : 接続終了の待ち状態
    CLOSING     : 接続を閉じる

POINT


    Proto  Local Address          Foreign Address        State
    TCP    YOUR-CE4EAF55BB:3556   192.168.2.253:8080     CLOSE_WAIT
    TCP    YOUR-CE4EAF55BB:3625   192.168.2.253:8080     CLOSE_WAIT
    TCP    YOUR-CE4EAF55BB:3637   192.168.2.253:8080     CLOSE_WAIT
    TCP    YOUR-CE4EAF55BB:3646   192.168.2.253:8080     ESTABLISHED    
Proto Local Address Foreign Address State TCP YOUR-CE4EAF55BB:5152 localhost:3020 CLOSE_WAIT TCP YOUR-CE4EAF55BB:3033 www.google.co.jp:http ESTABLISHED # 自分の PC に Http Server をいれ, Opera からアクセスすると 次のように表示される TCP tesusrname:http tesusrname:0 LISTENING TCP tesusrname:http tesusrname:2658 ESTABLISHED TCP tesusrname:2658 tesusrname:http ESTABLISHED # 相互接続 の関係になる ESTABLISHED とは ShakeHand をしている状態 IN : OUT: OP a : all Socket r : RoutingTable n : network adress を数値で表現 ( http < -> 80. ) p : pro : protocol に限定した 統計情報. Proto : Socket に使用される Protocol LocalAddress : ForeignAdress: State : Socket 状態
    # -all なら, 
    netstat -a;

    # port 80 が利用されていないかチェック
    netstat -an

    # LocalMachine の NetworkInterface を調べる
    netstat -I 

    # RoutingTable 表示
    netstat -r 

  # http 以外の接続も表示
  netstat -a 

Active Connections

  Proto  Local Address          Foreign Address        State

  # Http Server との接続

  # ここから http 以外


  # Number 数値表記
  netstat -n

Active Connections

  Proto  Local Address          Foreign Address        State
  TCP    127.0.0.1:5152         127.0.0.1:3949         CLOSE_WAIT
  TCP    192.168.0.2:4202       64.233.183.101:80      TIME_WAIT
  TCP    192.168.0.2:4205       64.233.183.101:80      ESTABLISHED

  # host, port は数値で表示
  TCP    192.168.0.2:4206       72.14.203.118:80       ESTABLISHED

___

■ nroff

SYNTAX nroff [OP] [file...] DESC nontypesetting runoff NROFF 形式の text を清書して出力 HTML , TEX みたいなものとして考えよう IN OUT OP olist : 指定 list のみ出力 nNUM : 指定 page sNUM : ran : register a に n を設定する. i : q :
___

■ make

SYNTAX make [OP] [file...] DESC IN OUT OP f makfile d : debug info e : ENV 優先 i : ignore ERR k : CMD ERR に依存した処理をしない n : only trace print p : print MACRO TGT q : query TGT r : no use Embeded Rule s : silent t : TGT time stamp only C dir : change dir I dir : makefile 探索 dir j jobs: 同時に実行できる数 w : print working dir
___

■ man

SYNTAX man [OP] [Chapter] [cmd...] DESC 次のような構成 1章 : Command 2章 : SystemCall 3章 : Library 4章 : Device 5章 : ファイル 6章 : ゲーム 7章 : その他 8章 : 管理者向けコマンド IN OUT OP - : 出力を pipe に渡す t : troff sytle a : all page M path : manual 検索 PATH w : Where( Manual の場所 ) d : debug only P pager : set Pager K : すべての man page から 指定文字列を検索 man -k editor // editor が keyword の manual を Listup man -w ls # Where ( どこにある ? ) RET: /usr/share/man/man1/ls.1.gz これが nroff 整形対象の file POINT man の文書形式


    NAME : cmd name
    SYNOPSIS : 書式

    DESC
    FILES
    SEEALSO : 関連事項
    DIAGNOSTIC : message 終了stat 説明
    BUGS

おき場所
    echo $MANPATH

___

■ info

SYNTAX info DESC
___

■ mesg

SYNTAX mesg [OP] DESC message 受付の可否の設定 write cmd による 他user からの message うけつけ, 拒否 IN OUT OP n : 受付拒否
___

■ who

SYNTAX who [OP] [file] DESC 現在 login 中の user 名の出力 他の user の使用状況がわかります who is on the system file : 情報を入手する file /etc/utmp /var/adm/utmp /var/run/utmp /var/log/utmp
    who 

    # 2 人いる
    user001 
    root 
だれも login してない IN OUT OP u : login user T : Terminal 状態 l : login 待ち回線 H : Header q : user 数 p : init で生成され , 使用中の ps d : 終了済み && init で再生成されない ps b : 直前の reboot r : init ps の現在の実行 level t : root による system clk の最終変更. s : name, line, time field のみ A : utmp file 全体を count して報告
___

■ more

SYNTAX more [OP] [file...] DESC 指定 file , STDIN の内容を 1画面表示 IN file D:STDIN OUT OP n : 行数指定 d : Display message s : Space concat +n : 指定行番号 +/ptn : 指定 ptn 前2行から p : Preclear
  man -2d foo.sh
___

■ at

SYNTAX at [OP] [time] [date] [+inc] DESC 指定時刻に 指定 file の cmd 実行 IN OUT OP time : 945[am|pm] : 1 | 2 | 4 桁 10 進数 date : inc : 指定日時の増分. r job... : job 番号を schedule をとりだす. l [job...] : job に関する情報出力. c : C Shell を実行 s : B Shell k : K Shell m : mail 発信 f file : file から cmd 読み込み d job : delete job c : cmd 列 job を STDOUT へ出力 q : 指定 queue を利用 v : job 実行時間
  at -f foo.sh 6pm jul 6
  at -l
  at -d 16
___

■ awk

SYNTAX awk [OP] [prog] [prm] [file...] DESC Pattern 検索処理言語 POINT 言語構文 は 入力を指定 -> Program を実行 -> 結果をチェック IN 処理対象 file : NULL|-: STDIN OUT OP prm : cmd で利用する 変数初期値 var = val; f file : 指定 file を処理 Fc : 文字 c を dlm 扱い v var=val: 変数設定

  BEGIN { cmd } { cmd } END{ cmd } 

  ls -l | awk '{print $9, $5}'   # , 忘れないこと
  awk '/char/ {print $0}' foo.c  # char という文字を含む行のみ表示.
  ---
  prog == { ptn1 {cmd...} ptn2 { cmd...} ...}

  



___

■ write

SYNTAX write user [tty] DESC STDIN の msg を user Terminal へ出力 tty : 特定の Terminal 指定 IN OUT OP
   # remote machine に msg 送信
   write usrname@remote
___

■ batch

SYNTAX batch [OP] DESC system に余裕があるときのお仕事を指定してね. ないかも IN OUT OP f : file から batch job 読み込み. m : mail 起動 batch at > sort < infile > outfile c-d # 終了.
___

■ bc

SYNTAX bc [OP] [file...] DESC interactive 計算言語 * こいつでないと 少数の計算できない # 2 echo 1 + 1 | bc # 6 echo "3 * 2" | bc echo "3.0 / 2.0" | bc IN OUT OP c : compile only l : use library i : interactive w : WARNING q : quit bc -l 5+7 12 x=10 y=10 x+y 20 s(1) # c e l a j c-d # 終了
___

■ bash

SYNTAX bash [OP...] [arg...] DESC bash 起動 AT cmd を利用する際に bash を起動すれば shell で色々できる OP c string : 指定文字列実行. i : interactive # 通常.( 実はいつもこれだった ) bash --login -i として実行している. r : restricted s : STDIN から cmd 読み込み D : cmd 実行不可能 [-+]O [shopt] POINT プロセスが違えば環境はことなる 環境とは bashのオプション パラメータ,変数とその値 定義されている関数
    // bat から shell script を実行する
    d:
    cd d:\cygwin\bin

    bash --login -c "foo.sh"

    pause
    bash /work/shellscript/foo.sh

    # comamnd "/work/foo.sh" を実行のみ実行して終了
    #  
    bash --login -c /work/foo.sh


    # Command のみ実行
    bash -c "echo aaa"

    # 引数なし で interactive ( prompt )モードで起動
    bash

    # 設定ファイルを読む
    bash --login

    # 設定ファイルをよんだ環境で 実行
    bash --login -c "echo aaa"

    # Debug
    #    展開した Command を表示
    bash --login -xc "echo $PATH"


    # 変数のセット
    a=b
    echo $a  
  
    # 子 Process として起動
    bash
    
    # 環境はうけつがれない
    echo $a

    # Shell Script を実行すると 1 行目で指定した interpreter が 子 process として起動する
    test.sh
  
    # 自分自身が 実行したいときは
    source  test.sh
    
    # これも同じ
    . test.sh

___

■ export

DESC 別shプロセスへの環境のわたす sourceコマンドはイメージ的には子スクリプトの環境定義を親プロセスに渡すものであった (実際は子スクリプトのプロセスは作成されず子スクリプトが実行するコマンドを親スクリプトが実行する). 親スクリプトの環境を 子プロセスに変数の定義をわたすには export をつかう
___

■ time

SYNTAX time cmd DESC cmd の実行時間を計測 IN OUT OP
    cmd find .

    # RET
    real 0m4.151s    # 実際の実行時間  
    user 0m0.151s    # user 使用の CPU 時間
    sys  0m0.121s    # system 使用の CPU 時間
___

■ troff

SYNTAX troff [OP] [file...] DESC typesetting runoff : file を整形して printer へ IN OUT OP
___

■ tty

SYNTAX tty [OP] DESC terminal : 端末名の出力 IN OUT OP s : silent : path 名を出力しない. 終了 status の判定が必要な場合のみ $? == 0 : STDIN が 端末. $? != 0 : STDIN が 端末以外. l : 回線名を出力.
  tty # RET: /dev/console
___

■ uname

SYNTAX uname [OP] DESC 現在使用中の system 名を出力 print system information IN OUT OP s : system CYGWIN_NT-5.1 n : node in network ( hostname ) YOUR_XXX r : release v : version m : machine i686 ( intel ? ) a : all p : processor i : platform o : OS
    # RET
    #    CYGWIN_NT-5.1 host 1.5.25(0.156/4/2) 2008-06-12 19:34 i686 Cygwin
    uname -a

    # i686
    uname -m

    # CYGWIN_NT 5.1 i686 Cygwin
    uname -smo


    i386  i386, その互換CPU
    i486  i486, その互換CPU
    i586  Pentium、MMX Pentiumおよびその互換CPU
    i686  Pentium Pro、Pentium II、Pentium III、Pentium4、Celeron ... 
    k6  K6、K6-2、K6-III。
    athlon  Athlon、Athlon MP、Athlon XP。
    x86_64  Opteron、Athlon64、Xeon(EM64T)。
    src  ソースパッケージ。自分で rpm パッケージを作ったりする際(rebuild)に必要。
    noarch  機種(CPU)に依存しないパッケージ。
    ppc  Power PC。
    alpha  alphaチップ搭載コンピュータ。
    sparc  SUN SPARC。


___

■ tset

SYNTAX tset [OP] DESC terminal set : login shell の各種設定 IN OUT OP ec : 消去文字セット kc : 行消去文字セット ic : 割り込み文字セット ^C == 割り込み - : 端末名 r : 端末名 n : 新しい tty driver を指定する必要性. Q : Erase set to , Kill set to の 出力を抑制.
___

■ case

SYNTAX case string in ptr1) cmd1 ;; ptr1) cmd1 ;; *) cmd1 esac DESC 条件分岐による cmd 実行. IN OUT OP
___

■ bg

SYNTAX bg [ %job ] DESC 指定 job 番号の background で実行する. ( 省略: current job ) IN OUT OP find . c-z # 中止 bg
___

■ alias

SYNTAX alias [OP] [name=[val]] DESC cmd に別名をつける IN OUT OP p: print # alias -p
___

■ source

SYNTAX source [OP] file DESC file 中の cmd を実行 IN OUT OP h : cmd を実行せずに history list に追加するだけ.
___

■ suspend

SYNTAX suspend DESC 現在の shell を停止する IN OUT OP POINT login shell は停止できない. ps cmd の結果に [ S ] がつく.
___

■ set

SYNTAX set [OP] DESC [ shell 変数 ]の値の設定 | 出力 IN OUT OP set # 現在の shell 変数をすべて出力. set var # var=null set var=foo # var を foo にセット POINT 定義済み shell Var
___

■ x

SYNTAX x DESC x Window をたちあげる IN : OUT: OP
___

■ arch

SYNTAX arch DESC マシンの architecture を表示 IN : OUT:
    # LetsNote は i686
    arch
___

■ rev

SYNTAX rev [file] DESC 入力した各行を反対にする IN : OUT: OP // 文字化けをしているかも ... echo "たけやぶやけた" | rev
___

■ pstree

SYNTAX pstree [OP] [usr|IDPS] DESC 実行中の Process を Tree 状に表示する IN : OUT: OP

?-+-bash-+-Opera
  |      `-meadow
  |-cygrunsrv---cron
  |-cygrunsrv---sshd
  `-pstree

  # background 実行した bash のコマンドは 別途 Interpreter が起動する
  
  find / -iname "*.exe" &
  
?-+-bash-+-Opera
  |      |-meadow
  |      `-pstree
  |-bash
  |-cygrunsrv---cron
  `-inetd---inetd



___

■ factor

SYNTAX factor [num] DESC * 素因数分解をする ( 使い道ある ? ) IN : arg がないときは STDIN から OUT: OP
    # RET: 12: 2 2 3
    echo 12 | factor
___

■ shutdown

SYNTAX shutdown [OP] time [msg] DESC * System を終了する IN : OUT: OP // 5 分後に終了 shutdown -h +5 // 即死 shutdown -h now
___

■ convert

SYNTAX convert [OP] src dst DESC 画像を変換 ( Type は拡張子で自動で判断 ) IN : OUT: OP
    convert -geometry "50%" foo.jpg foo.bmp
___

■ fuser

SYNTAX fuser [OP] DESC File | Socket を使用している Process を特定する IN OUT OP // 利用できる すべての Signal を特定する // HUP INT QUIT ILL TRAP ABRT EMT FPE KILL BUS SEGV SYS PIPE ALRM TERM URG STOP // TSTP CONT CHLD CLD TTIN TTOU IO XCPU XFSZ VTALRM PROF WINCH LOST USR1 USR2 RTMIN fuser -l
___

■ colrm

SYNTAX colrm [colS [colE]] DESC * 指定した column を削除する * dlm とか関係なし IN : OUT: OP
    # 2 番目の column から後ろを削除
    # RET: a
    echo abcedef | colrm 2
___

■ watch

SYNTAX watch cmd DESC * 指定した 間隔ごとに cmd を実行 ? Check する ? IN : OUT: OP
___

■ djpeg

SYNTAX djpeg [OP] [file...] DESC file を jpeg に変換して stdout へ出力する IN : OUT: OP
    # jpg から bmp へ変換  本当にできた 
    djpeg -bmp foo.jpg > foo.bmp
___

■ whoami

SYNTAX whoami DESC 現在の userName( windows login Accont ) を表示する
___

■ autoconf

SYNTAX configure という sh スクリプトを自動作成する これを配布したいパッケージの中に含めておく DEP m4, perl, DESC configure という sh スクリプトを作成することができる これを配布したいパッケージの中に含めておく POINT make で build の自動化ができる しかし 環境依存 の部分がのこる そこで Autoconf で configure を作成 環境に match した make を作成するようにした
    // Build 方法
    configure; make;

POINT もし configure がないと makefile を README をみながら 手作業で変更していた

    @xxx@ の部分が 環境 にあったものに置換される

    # makefile を記述 ( 自動生成の元 )

    
    autoscan

    # configure.scan が作成される
    ls
    configure.scan


    # 生成先 -> autoscan が自動判定してくれている
    AC_OUTPUT( [makfile] )


    # autoconf は configure.in という名前を元にするため Rename
    mv configure.scan configure.in


    # configure.in を元にして makefile を生成
    autoconf    


    # configure script が生成される    
    ls
    configure

    
    # configure は AC_OUTPUT() で指定された file を生成する元として file.in を必要
    # とりあえず base の makefile を Rename しておく
    #  必要に応じて, 動的に設定する


    # とりあえず実行する
    ./configure
    ...

    # AC_OUTPUT() で指定したものが作成される
    config.status: creating makefile

    # 元がないと, 怒られれる
    config.status: error: cannot find input file: config.h.in

        


    
    


    # 環境に応じて変更するなら @ でくくる
    CC:=@CC@
    

    # 変更後
    CC=gcc

    


    AC_OUTPUT 生成時に 参照可能な値

    
    # Debug と 最適化用の C コンパイラフラグ
    CFLAGS   

    # C preprocessor フラグ
    CPPFLAGS 

    # アーキテクチャに依存しない install 先の prefix
    prefix 

    # 実行ファイルの Install 先
    bindir
    

    # system を調べて 適切な makefile を生成
    # これがないときは 自前で makefile を修正する必要があった
    ./configure

    # option を指定する
    ./configure --enable-hoge
    ./configure --prefix=/foo/bar

___

■ config.h の自動生成

DESC 環境に応じた build をするために makefile の動的な設定だけではなく header も自動生成する

  # header 自動生成をする
  #    config.h.in が元になる
  AC_CONFIG_HEADERS([config.h])

  configure
  ...
  config.status: creating config.h


  # 必要に応じて, 検出項目を configure.in に追加する
  

    # 基本的な流れ

    configure.in が autoconf によって m4 のマクロが展開されて configure になる

    configure.in に必要な処理をかけば configure に反映される

___

■ 出力変数

共通のながれ あり -> 置換される #define XXX 1 なし comment out される /* #undef XXX */ @変数@ を出力変数という autoconf で組み込みで用意されているもの意外に 自前で定義できる AC_SUBST(出力変数) AC_SUBST_FILE(出力変数)
___

■ プリプロセッサをえる

AC_DEFINE( SYMBOL, VALUE, DESC ) AC_DEFINE( XX2, 10 ) #undef XX2 #define XX2 10
___

■ Program.をチェックする

AC_CHECK_PROG( VAR, COMMAND, VALUE-IF-FOUND, VALUE-IF-NOTFOUND, REJECT ) AC_CHECK_PROG( TAKO, grep, 777, 0 ) # Full-Path を設定をする AC_PATH_PROG( VAR, COMMAND, VALUE-IF-FOUND, PATH ) # file の存在をチェック AC_CHECK_FILE( VAR, COMMAND, VALUE-IF-FOUND, VALUE-IF-NOTFOUND )
___

■ C Compiler の特性検出

# TYPE の size を調べる # 文字列結合 のサポート AC_C_STRINGIZE #undef HAVE_STRINGIZE
___

■ 型をチェック

SYNTAX AC_CHECK_TYPE( TYPE, DEFAULT_TYPE ) TYPE を sys/types.h, stdlib.h, stddef.h からさがす なければ DEFAULT_TYPE で指定した型にする
___

■ 関数をチェック

AC_CHECK_FUNC( FUNC, VALUE-IF-FOUND, VALUE-IF-NOTFOUND ) AC_CHECK_FUNC( lrand48, AC_DEFINE( HAVE_LRAND48 ) ) #undef HAVE_LRAND48 # 見つかった #define HAVE_LRAND48 1 # なし /* #undef HAVE_LRAND48 */ # library に関数が見つからないときに, 代替の関数を用意して link する AC_REPLACE_FUNCS( 関数名リスト ) 見つからない場合 出力変数 LIBOBJS に FUNC.o が追記される makefile.in は次のようにする LIBOBJS=@LIBOBJS@ # 標準ライブラリ関数 AC_FUNC_ALLOCA #undef HAVE_ALLOCA
___

■ ライブラリを検出

AC_CHECK_LIB( LIB, FUNC, ACTION-IF-FOUND, ACTION-IF-NOTFOUND, 依存ライブラリ ) # 特定のライブラリが存在するかどうかチェック AC_HAVE_LIBRARY( LIB, ACTION-IF-FOUND, ACTION-IF-NOTFOUND, 依存ライブラリ ) # 特定の関数が 複数のライブラリ候補のどこにあるかチェック # LIBS に追加 # AC_SEARCH_LIBS( FUNC, LIBLIST, ACTION-IF-FOUND, ACTION-IF-NOTFOUND )
___

■ ヘッダの検出

AC_HEADER_STDC : stdlib.h stdarg.h string.h float.h STDC_HEADERS
___

■ 高度な検出

SYNTAX AC_EGREP_CPP( PATTERN, # egrep による PATTERN PROGRAM, # [] 内の部分を cpp にわたす. 結果が PATTERN に一致すれば FOUND ACTION-IF-FOUND, ACTION-IF-NOT-FOUND )

    AC_MSG_CHECKING( for RAND_MAX )
    AC_EGREP_CPP( yes, 
    [#include < stdlib.h>
    #ifdef RAND_MAX
    yes
    #endif
    ],AC_DEFINE( HAVE_RAND_MAX))


    #undef  HAVE_RAND_MAX

SYNTAX AC_EGREP_HEADER( PATTERN, # egrep による PATTERN HEADER, # header を cpp にわたした結果が PATTERN に一致すれば FOUND ACTION-IF-FOUND, ACTION-IF-NOT-FOUND )

    AC_MSG_CHECKING( for wchar_t )
    AC_EGREP_HEADER( wchar_t, stdlib.h, AC_DEFINE( HAVE_WCHAR_T) ) 

___

■ Program.を実行して検出

SYNTAX AC_TRY_RUN( PROGRAM, ACTION-IF-FOUND, ACTION-IF-NOT-FOUND, ACTION-IF-CROSS_COMPILING)

    







___

■ help.を見る

./configure --help
___

■ 自分で Option を追加する

SYNTAX AC_ARG_WITH( PACKAGE, HELP, ACTION, ACTION-DEFAULT ) DESC configure に独自 Option を追加する


AC_SUBST(FOOINC)

# ./configure  --with-foo-include=XXX で FOOINC に値を設定
AC_ARG_WITH( foo-include, [ 自分で調べろ! ], [ FOOINC="$withval"] )


# makefile.in などにかいておく
  echo @FOOINC@


___

■ configure

SYNTAX ./configure DESC 環境から makefile, などを自動で設定する bash script 実行すると "checking..." などと表示される

    // install 場所を指定する ( DEFAULT: /usr/local  )
    ./configure --prefix XXX

    
    # 環境にあった makefile 生成
    ./configure

    # build
    make

    # install
    make install
    

___

■ print

SYNTAX print file DESC file を printer で出力
___

■ install

SYNTAX install DESC copy files and set attributes System に必要なファイルを備え付ける
___

■ cpp

SYNTAX cpp DESC C macro Preprocessor C Compiler から自動でよばれる

    # stdin からとる
    # RET: 3 4
    echo __GCC__ __GCC_MINOR__ | cpp

    
    # 自分の環境での MACRO をチェックする
    echo FOO | cpp

    echo  "#include \"config.h\"  NAME_SIZE" | cpp -I /pro/include
___

■ cygcheck

SYNTAX DESC * Cygwin プログラムの診断をするユーティリティ # package を調べる # RET: less-382-1 cygcheck.exe -f /usr/bin/less # package に含まれる 内容を表示 cygcheck.exe -l /usr/bin/less /usr/bin/less.exe /usr/bin/lessecho.exe /usr/bin/lesskey.exe /usr/share/man/man1/less.1.gz /usr/share/man/man1/lesskey.1.gz # cygcheck -r less # 依存関係を見るのか ? Found: D:\cygwin\bin\less.exe D:\cygwin\bin\less.exe D:\cygwin\bin\cygwin1.dll C:\WINDOWS\system32\ADVAPI32.DLL C:\WINDOWS\system32\ntdll.dll C:\WINDOWS\system32\KERNEL32.dll C:\WINDOWS\system32\RPCRT4.dll C:\WINDOWS\system32\Secur32.dll IN : OUT: OP
___

■ strings

SYNTAX strings [OP] file ... DESC file から文字列をえる * binary file から symbol をえる * RPM などの PACKAGE file を展開することに使う といったことにつかう text file でも OK ただし Default は 4 文字以上なので -n 3 とか指定すること IN : UT: OP
    # 2 文字以上を検知する
    strings -n 2 foo.exe

    # 先頭に file 名を付加する
    strings -f foo.exe
___

■ ldd(cygcheck)

DESC コマンドやアプリケーションが ダイナミックリンクしているライブラリを調べる Linux ではあるが Cygwin では cygcheck で代用する cygcheck a.exe
    .\a.exe
      D:\cygwin\bin\cygwin1.dll             # cygwin 依存部分
        C:\WINDOWS\system32\ADVAPI32.DLL   # windows library の部分
          C:\WINDOWS\system32\ntdll.dll
          C:\WINDOWS\system32\KERNEL32.dll
          C:\WINDOWS\system32\RPCRT4.dll
            C:\WINDOWS\system32\Secur32.dll
___

■ nm

SYNTAX nm [op] objfile... DESC Object の Symbol をリストする strings と違い Symbol のみをはく Literal は含まれない ( const char *p = "foobar"; ) オブジェクトファイルやライブラリ、実行可能プログラムに含まれる関数を調べる Header に記述されてない Symbol も調べることができる

  # File 名も出力
  nm -A main.obj


  # Extern only
  nm -g main.obj

  # library にどんな関数があるか調べる
  nm /lib/libc.a

  # cunit の symbol を調べる
  nm d:/cygwin/usr/local/lib/libcunit.a


  # OpenGL ImportLibrary をみる
  #    glActiveTexture は含まれない
  nm Microsoft Platform SDK/Lib/opengl32.lib

# Library の中身はこうなっている
  
# object の集合
CUError.o:
00000000 b .bss
00000000 d .data
00000000 r .rdata
00000000 t .text
00000000 d ErrorDescription.0
00000061 T _CU_get_error
0000008d T _CU_get_error_action
0000006b T _CU_get_error_msg
00000000 T _CU_set_error
...


TestDB.o:
00000000 b .bss
00000000 d .data
00000000 r .rdata
00000000 t .text
00000129 T _CU_add_suite
000001f4 T _CU_add_test
00000089 T _CU_cleanup_registry
         U _CU_clear_previous_results




    cl で compile したものは見れない? 

    cl main.cpp /D "_DEBUG"
    nm ./main.exe

    # RET  
    nm: ./main.exe: no symbols



    {
      // nm では 見えない
      printf("hello world");
    }

___

■ objcopy

SYNTAX objcopy [op] src [dst] DESC copy and translate object files
___

■ disown

SYNTAX disown [op] [job] DESC Active Job Table から削除

    # background で実行
    loop.sh &
    [1]  2460

    # HungUp シグナルを送る
    kill -HUP %1

    # Job Table から削除
    disown %1


    loop.sh &

    kill -HUP %1
    kill %1: no such job
    
___

■ uuencode

SYNTAX uuencode [-m] [ file ] name DESC == Unix to Unix ENCODE 、電子メールに画像などのバイナリデータを添付するとき 中身を文字列(テキスト)データに置換(エンコード)する方式の一つ メールにはテキストデータしか載せられないため 画像や音声、ワープロ文書などのバイナリファイルは そのままでは送受信できない 送信時に一定のルールでデータを文字に置換し 受信後に元のデータに復元(デコード)するという手法が取られるようになった この置換ルールの一つがuuencode WindowsやMS-DOS、UNIXなどの環境で一般的につかいます IN : UT: OP uuencode binary.tar.gz Binary > encodefile # test という名前を header に格納して STDOUT へ uuencode foo.gif test > encodefile
___

■ iconv

SYNTAX iconv [OP] -f xxx -t xxx [file...] DESC 文字コードを変換する IN : STDIN OUT: STDOUT
    # urlencode をかけるまえに
  iconv -f SJIS -t UTF-8

    # curl した web page を SJIS に
    curl "" iconv -f EUC-JP

    # 文字 code の指定は慎重に
    # BAD
    curl "" iconv -f EUC
    
自動判定はできないらしい
    BAD

    OK

WARNING たまに ERROR になる ( そのときの 対処方法 ) ひっかかる 原因になりそうな 文字を 早期に grep で Filter してやる

  curl -s "http://www.yahoo.co.jp" | grep "< td>.*< /td>" | iconv -t SJIS
  # 変換元 にあって, 変換先に ない Code があったときは 中断しない
  cat china.txt | iconv -c -f UTF-8 -t SJIS 

___

■ unzip

SYNTAX unzip [OP] file... DESC file を解凍 IN : OUT: OP q : Quiet o : Overwrite without Prompt
    # foo.zip を解凍する
    unzip -qo foo.zip
___

■ touch

SYNTAX touch file... DESC 更新日時( WriteTime )を更新する IN : OUT: OP
___

■ patch

SYNTAX patch [op] [orifile [patchfile]] patch < patchfile DESC apply a diff file to an original ソースコードの[ 更.新 ]のためによく使う フリーソフトの世界では diff と patch を使って修正をやり取りする ソースを外部の者が DL, 修正をして diff 形式でチームに送る チームはそれをパッチとして適用する前にレビューでき 外部の者がアクセスできるソースではなく 開発中の最新のソースにパッチを適用することで修正を取りこめる テスト開発にむいてます POINT patch file とは diff file のこと IN : OUT: OP
    // src.cpp -> dst.cpp への patch をつくる( 順番に注意 )
    diff -u  src.cpp  dst.cpp > src2dst.diff


    // patch をあてる( あてる先のファイルは diff を見ればわかるので不要 )
    patch <  src2dst.diff


    // 元に戻すには
    patch -R <  src2dst.diff


    // cvs, svn を利用して diff 形式のファイルをつくる
    cvs svn diff がある


diff をみれば, 変更元, 先がわかる file 名を patch file に仕込むために -u ( Unified ) -c ( Context ) 形式にする ( そうしないと patch をあてるときに, file がわからないといわれる )
    bash> diff -u foo bar

    --- foo  2010-06-20 17:35:02.343750000 +0900       # 変更元
    +++ bar  2010-06-20 17:35:12.265625000 +0900       # 変更先
    @@ -1 +1 @@
    -foo
    +bar
WARNING patch をあてる場所が重要( Hunk FAILED )

    # diff の見て , 正しいパスに移動してからすること 

    # d:/foo/foo2bar.diff
    #
    # d:/foo/test/foo
    # d:/foo/test/bar
    #
    --- test/foo    
    +++ test/bar

    cd d:/foo

    # -p0  の指定は必須
    patch -p0 <  foo2bar.diff


    # -pNum の数だけ [/] を除去する
    # -p0      : そのまま
    # 指定なし : 末尾の file 名のみ
  

___

■ curl

SYNTAX curl [OP...] [URL...] DESC HTTP, FTP での Data をダウンロード,アップロードをする (HTTP, HTTPS, FTP, FTPS, SCP, SFTP, TFTP, DICT, TELNET, LDAP or FILE)
    # www.yahoo.co.jpの/aaa/bbb.gifをダウンロード
    curl -O http://www.yahoo.co.jp/aaa/bbb.gif

    # Silent 
    curl -s http://www.yahoo.co.jp/ | grep "< span>"  

    # http Header をふくめる
    curl -i google.com

    # Header のみ
    curl -I google.com

    # HTTPS も OK
    curl -k "https//www.xxx."

    k/--insecure
       (SSL) This option explicitly allows curl
       to perform "insecure" SSL connections and transfers.  
       All SSL  connections  are  attempted to be made secure
       by using the CA certificate bundle installed by default.
       This makes all connections considered "insecure" to fail unless -k/--insecure is used.
        See this online resource for further details: http://curl.haxx.se/docs/sslcerts.html
        If this option is used twice, the second time will again disable it.


    # Agent を偽る
    curl -A "Mozilla/4.0" "http://www.yahoo.co.jp" | iconv -f utf-8
    curl -A "Mozilla/4.0" -k "https://info.edinet-fsa.go.jp/E01EW/BLMainController.jsp?1265633189018"


    # https
    curl -A "Mozilla/4.0 (compatible; MSIE 6.0; Win32);" -k \
    "https://info.edinet-fsa.go.jp/E01EW/BLMainController.jsp?1265633189018"


    # Agent の判定に使わないなら, 任意の文字でもいいかも
    # 
    curl -A "tekito" "http://www.yahoo.co.jp" | iconv -f utf-8
     (HTTP)  Specify the User-Agent string to send to the HTTP server. 
    Some badly done CGIs fail if its not set to "Mozilla/4.0"  
    To encode blanks in the string, surround the string with  single  quote marks.  
     If this option is set more than once, the last one will be the one that's used.


    # Proxy 経由で
    curl --proxy "192.168.2.253:8080" "http://company.nikkei.co.jp/index.aspx?scode=7203"


    # 設定ファイルから読む
    curl --config ~/curl.cfg


    

curl の設定ファイル

    # this is a comment
     url = "google.co.jp"

    # 出力ファイルパス    
    output = "d:/google.htm"

     user-agent = "superagent/1.0"

     # and fetch another URL too
     url = "google.co.jp"

    referer = "http://google.co.jp/"

POINT IN : OUT: OP
___

■ basename(filename)

SYNTAX basename path [EXTENSION] DESC パスからディレクトリと拡張子を削除してファイル名をかえす パスから先頭のディレクトリ部分を削除して返す
    # sort
    basename /usr/bin/sort

    # foo.txt
    basename d:/foo.txt

拡張子を指定すると、拡張子部分を削除して返す。
    # foo
    basename d:/foo.lst  .lst

  WARNING 
    # 失敗するらしい    
    # foo.lst
    basename d:/foo.lst
___

■ dirname

SYNTAX dirname path DESC path から Directory 名をかえす IN arg OUT STDOUT

    # c:/foo
    dirname c:/foo/bar
    dirname c:/foo/bar/

    # c:\foo
    dirname c:\foo\bar
    dirname "c:\foo\bar"

    # [\/] を含まないときは [ . ] がかえる
    dirname foo.exe

___

■ expr

SYNTAX DESC "整数"計算をする expr の後に渡す文字列を expr が計算式として解釈すると考える IN : OUT: OP
    # 足し算
    expr 1 + 5 
    
    # SPC をつけないと shell が誤解する
    # BAD
    expr 1+5


    # 環境変数$val1が10以上であるかを確かめる
    expr $val1 >= 10 
    0   ← 偽を返しているので$val1は10より小さい  
    # 文字列の長さをかえしたり
    expr length "foobar";
    
    # マッチングした文字列の長さをかえす
    expr test.txt : ".*\.txt"
___

■ dos2unix

___

■ unix2dos

SYNTAX dos2unix file DESC 改行 code を変更
    echo -e "aaa\n" | unix2dos > foo.txt


    # RET         
    #   00000000  6161 610d 0a0d 0a    aaa....
    dump foo.txt
___

■ cygstart

SYNTAX cygstart DESC Windows のようにファイル,URL を関連付けたアプリケーションで起動するコマンドラインツール Windows の start コマンドと似ている

    # カレントディレクトリをエクスプローラで開く
    cygstart .

# 既定のブラウザで www.yahoo.co.jp を開く
% cygstart http://www.yahoo.co.jp/

# テキストファイルを既定のプログラムで開いて,即プリント.
% cygstart --print README.txt

# .doc なファイルを開いて,最大化で表示
% cygstart --maximize ~/tmp/regist.doc


___

■ hina

SYNTAX zip [-#@cdDefFhijJklLmnoqrRTuvXyz] [-t mmddyy] [ zipfile [ file...]] [-xi list] DESC Imploding法を使用してファイルを圧縮する WINDOWS を初めとした多くの OS 上で使われている圧縮方式 zipは,米PKWARE社のPKZIPと互換性がある zipで圧縮したファイルには一般的に拡張子に.zipを付けることになっている オプションを省略した場合は圧縮処理をする IN : OUT: OP zip foo.zip foo.txt
___

■ ctags

SYNTAX ctags [op] src... DESC tag file を生成
    # Recurse 
    cd src;  
    ctags -R

___

■ bison

SYNTAX bison file DESC parser generator (yacc replacement)
___

■ sum

SYNTAX sum DESC チェックサムを計算する 情報転送がうまくいったかどうかチェックする
    
    sum file

    # 送った先で確認
    telnet remote
    sum file

___

■ free

SYNTAX free [OP] DESC Memory 使用状況を Dump IN : OUT: OP


    total         used       free     shared    buffers     cached
    Mem:        514096     440352      73744          0          0          0
    -/+ buffers/cache:     440352      73744
    Swap:       774144      32172     741972


    # Mega 単位
    free -m
                 total       used       free     shared    buffers     cached
    Mem:           502        431         71          0          0          0
    -/+ buffers/cache:        431         71
    Swap:          756         31        724


    # 3 秒ごとに表示
    free -s 3
___

■ cd

SYNTAX cd DESC IN OUT OP P: symboclink link L: 物理 dir 構造
___

■ declare(typeset)

SYNTAX declare [OP] [name=[val]] DESC 変数の宣言, 型の設定 IN OUT OP i : 変数を整数値としてみなす. a : array としてみなす. a : array としてみなす. p : print WARNING
    declare -i i=10;
    declare -p i;      
___

■ printf

SYNTAX printf format [args] DESC 引数を指定した書式に変換して出力する IN : OUT: OP
    # [,] はいらない
    printf "foobar %d %d" $i $j

    # RET: 0001
    i=1; printf "ret %04d" $i;
___

■ pushd

SYNTAX pushd [OP] [dir] DESC dir を stack に push dir も変更 IN OUT OP n : dir 変更をしない +n : dir list の左から n番目の entry を stack 先頭に移動する. working dir も移動する.
___

■ dirs

SYNTAX dirs [op] DESC Directory Stack の表示 IN OUT OP c : clear l : ~ -> /home/usr p : 1 行 1 入力 v : 行番号 [+|-]n : n 番目 stack 取得( これ便利 )

    # Clear
    dirs -c

    dirs -l

___

■ cmd

SYNTAX cmd [OP] [arg] DESC IN OUT OP n : 改行抑制 // うまくいかない. e : escape 文字を解釈する // echo "aaa\tbbb\n" E : escape 文字を解釈しない.
___

■ enable

SYNTAX enable [OP] [name] DESC 組み込み shell command での実行許可の設定. IN OUT OP n : 実行許可をあたえない. p : print : 組み込み shell cmd を表示. trap とかも含むよ
    ;; typeset cmd を実行できないようにする
    enable -n typeset


    ;; すべての 組み込みコマンドの設定を表示
    enable -a
    
    
___

■ compgen

SYNTAX compgen [OP...] -- [WORD] DESC 補完リストを作成する complete と同じ方法のリストを返す
    # 組み込み Command なので Shell からのみ利用できる
    #
    %type compgen
    compgen is a shell builtin

    %type ls
    ls is hashed (/usr/bin/ls)
    ;; File list をかえす
    compgen -f

    ;; Group list をかえす
    compgen -g


    ;; shell の 予約語( Keyword ) をかえす
    compgen -k

    ;; Service 一覧
    compgen -s


    ;; User 一覧
    compgen -u


    ;; File && ~ でない && ch で始まる
    compgen -f -X '*~' -- ch
    
    

___

■ complete

SYNTAX complete [ OPTION... ] COMMAND... DESC コマンドの補完方法を指定する OP -W LIST List を補完候補にする ( " "区切り ) -X PATTERN -X !PATTERN Pattern にマッチする語を除外( 対象 ) -F FUNCTION POINT FIGNORE で指定した パターンは補完候補にならない
    FIGNORE='~:.o:.dvi'

  # cd の補完は Directory のみ
  complete -d cd

  # group は Group のみ
  complete -g group

  # finger は User のみ
  complete -u finger


  # 利用する Host 名を指定しておく
  complete -W 'host1 host2 gate1'  rsh


  # xxx.tex のみ対象にする
  complete -X '!*.tex'  jlatex



  # 現在の設定を Print
  complete -p


  # 関数を経由して 対象をきめる
  complete -F mycomp.sh   notepad
  
  COMP_LINE  : CommandLine 全体
  COMP_POINT : Cursor 位置
  COMP_WORDS : CommandLine の単語配列
  COMP_CWORD : 補完中の語の番号

  COMPREPLY  : 結果をセットする変数

    # gcc での指定
    
    # -o : 補完した後に空白をいれない
    
    complete -o nospace -F _gcc gcc

    function _gcc() {
      prev=${COMP_WORDS[COMP_CWORD-1]}
      cur=${COMP_WORDS[COMP_CWORD]}

      case $cur in

      # -I を含む場合
      #      -I を除去した語を Directory 候補として Listup
      #      最後に -I をもどす
      #
      #      -S WORD
      #        補完結果に [WORD] を追加
      #
      -I*) d='echo $cur | sed 's/^-I//''
          COMPREPLY=( 'compgen -S / -d -- $d | sed -e 's/^/-I/'' );;

      # -I 以外
      #      File を候補にするだけ
      *)   COMPREPLY=( 'compgen -f -- $cur' );;
      esac
    }



___

■ export

SYNTAX export [OP] [name=[word]] DESC [現在のshellの ?]環境変数を設定する export とすると , declare -x PATH="/home/bar"; IN OUT OP n : 削除 # export -n USER p : print # export した 変数のみ Print

    # Current の Shell で設定された 変数リストをみる
    export

___

■ fc

SYNTAX fc [OP] [first] [last] DESC history list の編集, 出力をする history list から cmd を再実行 IN OUT OP l : listup // fc -l -3; r : revert n : no disp number
    
    # 1-10 番目の cmd 表示.
    fc -l 1 10  

    # 101 番目の cmd 実行. 
    !101        
___

■ select

SYNTAX select name [in list] do cmd done DESC menu list から値を選択して, その値により それぞれの処理をする. select は CUI でもできるのか --- break , return でぬける IN OUT OP
select i in man woman; do
    echo your select $i
    break;
done
___

■ uptime

SYNTAX uptime [OP] DESC system 稼働時間. 起動時刻. user 数. loadAverage の出力 IN OUT OP
___

■ users

SYNTAX users [file...] DESC system 上にいる user の login 名を出力する shell の上にいる人を想像しよう IN OUT OP
___

■ w

SYNTAX w [OP] [user] DESC login している user , 実行cmd を system 状況を出力. login 名, 端末名, loginTime, 現在の process CPU 時間. IN OUT OP h : no header l : detail s : simple f : from : login した host 経路を出力する. u : uptime cmd と同様の出力.
___

■ wall

SYNTAX wall [file] DESC 全 user に対して, STDIN からの message を送信. file : messsage 内容 IN OUT OP g : group 指定. wall message
___

■ whatis

SYNTAX whatis cmd... DESC cmd の簡易説明の出力. == man -f DB が必要. catman cmd が必要. IN OUT OP
  whatis gcc
___

■ whereis

SYNTAX whereis [OP] [file...] DESC file( cmd )の source, obj, manual の場所を出力. ( ) IN OUT OP b : binary file m : manual s : source M dir : Manual 検索 dir の指定. S dir : Source 検索 dir の指定. B dir : Binary 検索 dir の指定. whereis gcc
___

■ set

SYNTAX set [OP] [args] DESC 指定した shell 変数の値を出力する. OP 指定で 変数の属性の変更 IN OUT OP o : 変数の設定. set # すべての shellVar を表示.
___

■ shift

SYNTAX shift [n] DESC paramter 位置の shift IN OUT OP
while [ $# -gt 0 ]; do
    echo $@
    shift
done
foo.sh a b c d e f
___

■ shopt

SYNTAX shopt [OP] [opname] DESC Shell Option shell が使用する OP を制御 IN OUT OP s : set u : unset p : print q : 簡易 print o : set-o で定義している 変数に限定. shopt -s dotglob cdable_vars : cd cmd 引数が dir でない場合は 変数名として処理. cdspell : dir cmp の小さな spell miss を修正. checkhash : hashtable に 実行 cmd が登録されているか check checkwinsize: cmd 実行毎に 画面サイズを check cmdhist : bash が 複数行の cmd をすべて同じ history に保存 dotglob : path 名の展開に . で始まる file 含む. execfail : exec cmd が引数 file を実行しなくても 対話的 shell を終了しない expand_aliases: alias を展開する. extglob : 拡張した patten match を有効化する. histappend : shell が終了したとき HISTFILE が指定した file に保存 -> ~/.bash_history histeverify : history 置換の結果を shell 構文分析に送らない. hostcomplete: @ を含む単語は hostname の補完をためす. huponexit : shell 終了時に すべての job に HUP signal 転送 interactive_comments: # で始まる行を無視. lithist : cmdhist が ON のとき, 改行こみで保存 login_shell : login_shell の証明 -> login_shell -> shell が nest しているかどうか check 可能. no_empty_cmd_completion: 空行への補完になる場合は PATH 検索しない. nocaseglob : path 名展開時の sensitive nullglob : file名に match する pattern がない場合は 空行に展開. . echo *detarame* -> RET *detarame* progcomp : program 補完の toggle promptvars : prompt の 文字列が 変数と parameter を展開する. restricted_shell: shell を制限つきで起動. shift_verpose: shift cmd の ERR 制御 sourcepath : source cmd が PATH も検索. xpg_echo : echo cmd が \ を展開する . echo "aaa\tbbb" -> RET aaa bbb
    # wildcard の展開結果を 空にする
    shopt -s nullglob

    echo *.foo

___

■ help

SYNTAX help [OP] [ptns] DESC 組み込み cmd の help IN OUT OP s : simple ( 簡易情報 ) help cd; help -s cd;
___

■ jobs

SYNTAX jobs [OP] [%job] DESC 現在の job 状態を出力する. job とは OS という Process のお仕事かい ? IN OUT OP l : list all process ID p : gourp leader process r : runing : 実行中. s : stop : 停止中
  # 
  jobs %1  // こんな感じ 

  #
  kill %1
___

■ let

SYNTAX let arg1 [arg2] DESC 指定した文字列が[ 演算式 ]として評価される # expr より楽かも let sum="1+1"; echo $sum; IN OUT OP id++ id-- ++id --id *-/+ < = >= != = +=
___

■ local

SYNTAX local [OP] [name=[val]] DESC 宣言した shell でのみ有効な 変数を作成 関数内のみでしか利用できない IN OUT OP p : print a : array f : 関数名のみ使用する. i : 変数を整数とみなす. r : readonly ( 変数の設定はできない. )
   function foo() 
   {
     # foo は local 
      local foo=bar;
      echo $foo;
   }
現在の buf の shell を実行する. ./bufname.sh とするだけ. shell-command[c-m-! (buffer-file-name) ]
___

■ pwd

SYNTAX pwd [OP] DESC IN OUT OP // 今のところわからない L : symbolick link を含む形. P : symbolick link を含まない形.
___

■ read

SYNTAX read [OP] [name] DESC STDIN から 順番に 変数に代入 Game に使える name == 0 ならば, shellVar: REPLY に代入 IN OUT OP p : prompt r : \ を escape 文字として扱わない. t : timeout EX read -t 10 var n : nrChar 指定文字数を読み込む. s : silent a : arrVar の index 順に 値がセットされる. . read -a aVar; d : 入力の最後の文字を指定
   read var
   read var1 var2;

  # yes/no 入出力をうけつける
  read val;
  if [ $val == "n" ]; then 
     exit $?
  fi
___

■ readonly

SYNTAX readonly [OP] [name] readonly -p DESC 指定した shellVar を読み込み専用にする. 変数を読み込み専用にする const みたいなもの VAR: readonly variable IN OUT OP p : 読み込み専用. a : 配列変数に限定( 配列しかいれちゃだめ ) f : 関数を読み込み専用にする.
___

■ return

SYNTAX return (n) DESC 指定した戻り値 n で関数を終了させる. n == 0 -> 直前に実行した関数の戻り値. 関数呼び出しわかった BAD func(); OK func; 結果は $? にはいるようだ IN OUT OP
function func() {
    echo "call func"

    # a は scope される
    local a;

    # $RANDOM 
    # こんなことできるんだ 
    for((a=0;a< 5;a++)) 
      do
      echo $a;
    done
    return $a;
}
func;
echo ret $a;
___

■ popd

SYNTAX popd [n] DESC stack top を削除して Working Directory を 2番目の entry にセット IN OUT OP n: n番目の stack を削除.
___

■ nohup

SYNTAX nohup [cmd] DESC hungup signal を無視して cmd 実行 IN OUT OP
  ./foo.sh  # 無限 loop 
  kill -HUP %1 # hangup signal を送信. 
  nohup ./foo.sh # hangup signal から切り離す
  jobs 
  kill HUP %1 # hangup signal が無視される
___

■ nice

SYNTAX nice [OP] cmd [arg...] DESC 指定 cmd の優先順位を変更して実行する.( JOB の priority ? ) IN OUT OP n[1:20] n だけ優先順位を低くする POINT emacs から起動する shell は 別の子供かも ( cmd ごとに 子shell が起動するかも ) PONT shell も program だから起動できるのか nice find / -name foo -print & # find cmd を優先順位を低く実行
___

■ logout

SYNTAX logout DESC login shell を終了させる( 窓口がひとつなくなる様子を想像しよう ) SVAR:ignoreeof がセットされていて c-d が利用できない場合は有効. IN OUT OP
___

■ login

SYNTAX login [username | OP] DESC login ?( 通常のログインですること ) IN OUT OP p : preserve ENV
___

■ jobs

SYNTAX jobs [OP] DESC 現在の job 一覧 IN OUT OP l : process 番号.
___

■ if

SYNTAX if (exp1) then cmd1 else if(exp2) then else cmd3 endif DESC IN OUT OP d=`date +%m` echo $d; if [ $d -lt 12 ]; then echo "small" else echo "big" fi
___

■ foreach

SYNTAX foreach name (wordlist) ... end DESC wordlist の各要素を name にセットして cmd を順次実行. IN OUT OP foreach usr (user1 user2 user3) echo hello | mail $user end WARNING ないかも.
___

■ fg

SYNTAX fg [%job] DESC 指定番号の job を foreground で実行する. 省略時: current job IN OUT OP

    ;; RET: [1] 2639
    notepad &

    ;; 
    fg %1; 

POINT & (background) 実行すると, multithread が体験できる ( 特に出力 )
___

■ getopts

SYNTAX getopts optstr name DESC 引数( option )を解析する
    # "abc" を引数にとる
    # : は 引数にとる

    # 値が必要ならば : をつける    

    while getopts a:bc var
    do
    case $var in
      a)
        echo "option set a"
        # $OPTARG で a の値を参照
        echo "a =" $OPTARG
        ;;     # break
      b)
        echo "option set b"
        ;;     
      esac
    done

    # よびだす
    foo.sh   -a 10 -b  -c

    # option は先に指定すること
    foo.sh   -a   arg1  arg2

    # BAD
    foo.sh  arg1  arg2 -a

# option 部分は shift を利用して切り捨てることで # 残りの処理が簡単になる

    # option 解析

    shift `expr $OPTIND - 1`

    # 引数の index が option の直後が 0 に移動する


    # RET
    #    arg1  arg2
    echo $1 $2
___

■ exit

SYNTAX exit [expr] DESC [ 現在の shell ] を終了させる expr 省略時 : 終了status を shell 変数 status の値とする POINT .sh を実行するときは subshell が起動して終了する IN OUT OP
___

■ exec

SYNTAX exec cmd DESC

    # ls を実行させた後に shell を終了させる
    exec ls


IN OUT OP
___

■ eval

SYNTAX eval args DESC current shell で Command 実行 args を cmd列と思えば OK IN OUT OP

  cmd="ls -la"; 
  eval $cmd;

  eval "ls"

  if ( eval "$cmd" ) | grep xxx > /dev/null ; then  
  ...
  fi

___

■ dirs

SYNTAX dirs [OP] DESC print dir stack ( 左が stack top ) IN OUT OP
___

■ cd

SYNTAX cd [OP] [dir] DESC change wordking dir IN OUT OP
___

■ join

SYNTAX join [OP] file1 file2 DESC file1 , file2 "関係づけて" を結合する IN [-] : STDIN OUT STDOUT WARNING field は空白, 改行で区切られる 結合される field は ASCII 順で sort される必要あり. OP
___

■ xargs

SYNTAX xargs cmd ? DESC build and execute command lines from standard input STDIN からの文字列を 別の cmd 引数としてわたす ( -> 総 Byte 以内の引数を cmd に渡してくれる. ) 単なる PIPE とは異なる 引数としてわたしてくれる * どうやら 1 行でまとめてくれる // Opera にわたす 引数は 1 Line になる cat sql.htm | grep "http://" | xargs Opera # src file は XXX.rm になる find -name "*.rm" | xargs mv -t ../foo POINT cmd arg には総 Byte がある. STDIN から読み込まない cmd に わたしたいときに使うと便利 ! IN STDIN OUT OP 0: arg が NULL文字(\0)区切りであることを前提に処理
  # print0 の場所は 最後だよ 
  find . -name \*~ -print0 | xargs -0 rm  // ( Program Files とかあるときに便利 )


  find -type f | xargs rm -i;

  # STDIN から入力しない cmd の引数へ流すには
  find -iname "*test*" | xargs cygpath -a;    

  # SPC 区切りでわたしてくれる
  ls *_bk | xargs rm -v

  cd /work
  echo "aaa bbb" | xargs cygpath -am
___

■ uniq

SYNTAX uniq [OP] [infile [outfile]] DESC 行の重複をなくす 前後の行を比較して一致させる IN STDIN( infile がない ) OUT STDOUT( outfile がない ) OP u : only print uniq c : count ( 重複行 ) s : skip-chars=10 d : only print Duplicate line i : insensitve f : skip field
  # 連続してないとだめかも 
  echo -e "aaa\nbbb\naaa" | uniq
  echo -e "aaa\naaa\naaa" | uniq
  echo -e "aaa\nbbb\naaa" | sort | uniq
___

■ kill

SYNTAX kill [OP] pids kill [OP] %jobs DESC 指定 Process を強制終了する IN OUT OP l : list signal ( これ参考になりそう ) p : signal : ps に送る 信号の種類.( 省略 : SIGTERM, 15 )
  
  gcc foo.cpp 

  # とめる
  c-z            

  # Process の一覧をみる
  ps -a          

  # ps コマンドの PID で表示された ID を指定して消す
  kill 932


POINT SIGKILL, 9 // 強制終了
___

■ hostid

SYNTAX hostid [opt] DESC host 識別番号の出力 IN OUT OP
___

■ hostname

SYNTAX hostname [OP] DESC host名( machine )を出力 自分のマシンにある HTTP server にアクセスする時に 調べる winddows にもある ( OP なし ) POINT 遠隔操作をしているときに 利用している PC がわかる 厳密には Computer 名 と (TCP/IP の Host ) は違うが同じのが返る ? ipconfig でも調べられる Network Program では hostname のかえす 結果をいれると動く -> ので winsock::connect で指定しているということか ? IN OUT OP
  // これは machine名
  yahoo.co.jp
___

■ id

SYNTAX id [OP] [usr] DESC user 情報を出力 Print information for USERNAME, or the current user. usr名, usrID, usrGrp, idGrp を表示 だれが起動した Process かを判別します IN OUT OP g : group only u : usr only G : すべての GroupID を表示 n : 数値のかわりに 名前で表示 a : all process

    # すべての GroupID を表示
    # RET: 513 0 544 545
    #
    # /etc/group にあります
    id -G

    
    # Group 名で表示    
    id -nG
___

■ rsync

SYNTAX rsync [op] src dst -r: Recusive ディレクトリツリーをコピー -l: シンボリックリンクを、シンボリックリンクのままコピー -p: Permissionをそのままコピー -t: タイムスタンプをそのままコピー -g: グループ名をそのままコピー -o: ファイルオーナをそのままコピー (root権限 が必要) -D: デバイスファイルをそのままコピー (root権限が必要) -n 実際のファイル操作を行わない( 必ずこれでテストを ) -z 転送時にgzip圧縮 --exclude '正規表現' マッチするファイル・ディレクトリをコピー対象から除外 --include '正規表現' excludeパターンに穴をあける。このパターンにマッチしたらexcludeパターンにマッチしていてもコピー対象に含める。 --timeout=秒 指定の秒数データ転送が停止したらば終了する。デフォルトは0 (決してタイムアウトしない) なので特に注意。crontabに仕込む場合は必ず書くこと。 --rsh=ssh 手元のマシンとsshアカウントのあるマシン間でつかう 実はscpよりこっちを使うことが多かったり WARNING Remote側・local側でProtocol Versionが違うと相互接続できない
    # 暗号化する
    rsync -e ssh

    # Directory "src" を Directory "dst" の下に Copy 
    #    dst がなければ mkdir される
    #    RET: src/dst
    rsync  -r ~/test/sh/rsync/src   ~/test/sh/rsync/dst


    # dst 末尾の [/] はどちらでも OK
    rsync  -r ~/test/sh/rsync/src   ~/test/sh/rsync/dst/


    # src が Directory ならば -r をつけないと SKIP
    # RET: skipping directory src
    rsync  ~/test/sh/rsync/src   ~/test/sh/rsync/dst/


d:/rsync を外部ストレージ( f: )にバックアップする。-r で指定したディレクトリ以下を Recusive にコピーする
    rsync  -r /d/rsync   /f
完全に同期するには --delete をつけて、コピー元の削除ファイルをコピー先にも反映させる
    rsync  --delete  -r /d/rsync   /f
タイムスタンプ, パーミッションを保持する
    rsync  --delete  -rtp /d/rsync   /f
その他、頻繁に利用するオプションは -a ( アーカイブオプション )でまとめて指定できる
    rsync  -a /d/rsync   /f

    # これと同じ
    rsync  --rlptgoD  /d/rsync   /f
除外ファイルのリストを指定する
    rsync  --exclude-from=/d/ext.txt  -r /d/rsync   /f
除外リストの例
    ; コメント
    # コメント

    # 除外したいファイルのパターンを指定する

    # .obj とつくファイルを除外する
    *.obj
    
    # CVS ディレクトリを除外
    CVS
___

■ root

UNIX系OSの 管理者アカウント のこと Windows NT系OS では Administrator アカウントがrootに相当 アクセス権の設定にかかわらず すべてのファイルに無制限にアクセスすることが可能 日常的にUNIXを利用するには権限が強すぎて危険なため ふつうは管理を行なうためにしか用いられない また パスワードの変更の機能はrootアカウントを利用する必要があるけど 予めrootアカウントから設定をすることで 1般ユーザも設定にしたがってrootアカウントの権限を利用できる rootアカウントのパスワードが漏洩したとき パスワードを入手したユーザは無制限にアクセスが可能になる
___

■ ipconfig

SYNTAX ipconfig DESC IPAddress など Network 関連の情報を出力する. -> 認証のとき必要になるので, 覚えておくと便利. 自分の PC 名を知るにも利用できる. * win32 の command
  # Proxy Address
  192.168.2.253
  # 自分に割り振られたアドレス ? 
  210.150.255.66
  # 逆引きもできる.

  # MACAddress ( PhysicalAddress )を調べるには
  # HostName もわかる
  # HostName == ComputerName となっている
  # http://hostname/ これでも ACCESS できる

  POINT
    HOST [ hostname ] に , HTTP request を 送れ ということ

  # DNS Servers もでてくる
  #  cygwin だと返らない...
  ipconfig /all
  # そういえば, 外から見れるのか ? 
IN OUT OP all
___

■ nslookup

SYNTAX nslookup DESC NameServer に問い合わせて, DomainName を取得する NameServer に LookUp という意味 電話帳( Table )をひいて( lookup 索引 )すること 1. xxx : NEW 1. yyy : OLD * DNS Server は 自分の管理している 範囲の IP しかしらない :: 何も指定しないと, DNS Server の情報がかえってくる :: :: Default Server: nameServer.xxx :: Address: 111.111.111.1 :: nslookup Default Server: warpstar-a5dc25 Address: 192.168.0.1 * Domain 上に xxx というページはない という言い方がある
    # RET: 66.249.89.147
    nslookup google.com

    # IPAddress 直接指定で Web Page がみれる
    http://66.249.89.147/
___

■ wget

SYNTAX wget [OP] URL DESC ウェブサーバや FTPサーバからファイルを取得する。 Page を直接 Browse しなくても取得可能 IN : OUT: OP t( Trial ) : POINT ConfigFile に設定しておくこと /etc/wgetrc
    #  index.html をおとす
    wget http://www.sample.com/index.html

    # サイトごとダウンロードする場合は -r ( Recusive )
    wget -r http://www.sample.com/

    # ウェブサーバの image ディレクトリ以下のファイルをおとす。
    wget -r http://www.sample.com/image
    
    # 大きいファイルで途中でダウンロードが止まった場合は -c でレジューム
    wget -c http://www.sample.com/index.html


    # filepath で指定されたファイルに記述された
    URL を自動取得してダウンロードもできる

    
    # Webサーバーからファイルをダウンロードする
    wget http://www.xxx.com/file.tar.gz 

    # リトライ回数を5回に設定してFTPサーバーからファイルをダウンロードする
    wget -t 5 ftp://ftp.xxxxxx.co.jp/file.tar.gz 

    # FTP サーバーのdirディレクトリ以下を全て
    wget -r ftp://ftp.foo.com/dir/ 

    # Web サーバーから5段階までリンクをたどりながらファイルを入手する
    wget -l 5 -L http://www.foo.com/index.html 

    # png 画像のみ
    wget -r -A .png http://www.foo.com/index.html 
ログの制御
    # 大量のデータをおとすときは高速化のためログをきる
    wget -q  http://google.com

    # verbose モード
    wget -v  http://google.com

    # 指定したパスへログを出力する
    wget -o  d:/log.txt   http://google.com

    # ログを追加する
    wget -a  d:/log.txt   http://google.com

    # debug ログを出力する
    wget --debug  http://google.com
ダウンロードするファイルの制御
    # 取得済みのファイルはとらない
    wget -nc  http://google.com 

    # サーバの方がローカルよりも新しいときは取得する
    wget -N  http://google.com 

    # ファイル名を指定する
    wget -O  test.htm   http://google.com 
DESC // emacs から使える URL は Directory でなく Page( URL ) を指定しないとだめ SYNTAX を見ると URL とある File を指定しないと index.htm とみなされる ttp://host/foo/bar == http://host/foo/bar/index.htm 次の 動作をする * file ( index.htm ) を指定 http://www.yahoo.co.jp/ * dir 以下を指定 r http://www.yahoo.co.jp/ -> というか直接アクセスできない Host があるかも ( ie. 非公開の Host は wget でも無理 ) たとえば http://www.yahoo.co.jp/foodir 以下を指定しているつもりでも wget -r "http://www.yahoo.co.jp/foodir/" Case1: file名わからん && Link 元の Page はわかる * 直前は xxx からきたと偽る * -r ( Recursive )に * -l 1 ( 指定した回数の Link をたどる ) * -H : 異なる Host でも検索をたどる * -A".zip" : zip のみ必要. -> 落としたあと消している * --user-agent=XXX: Browser であることを偽る wget --referer "xxx" -r -l1 -H -A".zip" "xxx" /etc/wgetrc [ HTTP や FTP 経由のファイル取得 ]をするツール # 郵便番号: 佐藤さん家の / pdf 書類をください # 何でもできて本当に便利. http://www.tax.metro.tokyo.jp/kobai/20090602.pdf Webサイトをゆっくり見たいときは リンク先を階層で指定して一気に取れる オフラインでじっくり読んだり Mirror サイトを簡単にできる DL が中断したら 途中からやり直す Resume 機能があり便利 Forbiden といわれるときは while[] ; do wget で対応しよう ! done # cookie の指定 --load-cookies=cookies.txt # HTTP header を指定する wget --header 'Cookie: foo=bar' http://webos-goodies.jp/index.html OP a(AcceptList) 指定 拡張子の file のみ取得. k HTMLに含まれる絶対パスを相対パスにする Local で見るときに便利 t # retry 回数. 1 にしておいた方が無難 # wgetrc :: tries=1 wget -t 1 http://www.google.co.jp --------------------------------------- ■ 再帰ダウンロードの制御 --------------------------------------- r Recursive に FILE をとる 指定した Directory 以下を再帰的に取得する
        # 要はすべて取得してしまう. 
        wget -r http://www.google.co.jp
WARNING HTTP , FTP で動作はちがう HTTP では HTM 内の link( href, src )から, 再帰的におとす 回数を指定するのは -l (DEFAULT:5) FTP では SubDirectory の Tree を再帰的におとす H Host をまたいで取る ON にすると Host が異なる file がおちてくる l depth --level=depth を指定する A (Accept) 指定 パターンの File のみ DL 厳密には wildcard[?*]を含むとき pattern match ふくまない suffix の指定 # xxx.zip にマッチ A".zip" # xxx_w1.zip にマッチ. [*] で完全にマッチさせること A"*w*.zip" R (Reject) --------------------------------------- DL. 保存の制御 --------------------------------------- nH ホスト名の Directory を作らない( www.yahoo.co.jp ) ( 子供 Directory は作成される ) nd Local に Directory をつくらない ( 直下に DL したいときに便利 )


    # 中断したら Continue( Resume )
    wget -c http://www.sample.com/index.html



    # site ごと落とすには Recurive って Directory のことね 
    # まるごとになってしまうかも
    wget -r http://www.yahoo.co.jp

    wget -r http://www.nemopan.com




    wget -A".jpg" -r http://www.nemopan.com/auto_gallery_racing/files/attach/images/

    # Filepath で指定した URL から取得
    wget -i listurl.txt
    
      # listurl.txt
      http://www.google.com
      http://www.yahoo.co.jp
      Option は指定できない
  
    # Link 先を 3 階層たどる ( -r 必須 )
    #
    wget -r -l 3 http://www.google.com/index.html      

    # xxx.htm から LINK < a href=xxx.zip> をDL
    #
    wget -r -l1 "www/foo/bar/xxx.htm"
    
    # zip のみ取得.
    wget -a http://yahoo/foo.co.jp -o log.txt
    wget http://yahoo/foo.co.jp -a log.txt

    # 指定拡張子のファイルのみ取得
    





    # HTTP server 上の Directory 以下の gif をとる 
    #   --no-parent : 階層の外部( おや )の file をとらない
    #    つけないと SITE 全体がおちてくる
    #
    wget -r -l1 --no-parent -A.gif http://weather.yahoo.co.jp/weather/

    # MP3 も落とせる 
    wget "http://nikkei-pod.stream.ne.jp/www09/nikkei-pod/kiku/kiku4-090331-pc.mp3"


    # Background で実行
    wget -b http://www.google.com
    wget http://www.google.com &


    # Basic 認証をかけられたページにアクセスできる 
    wget --http-user={username} --http-passwd={password} {host}


    # 差出人のウソをつく. Forbiden 403 といわれるときに有効
    # Browser が Server にわたす情報 のひとつ
    # LINK 元( どこから来たか )をしらせる
    # 
    wget --referer "http://foo" "http://bar"

    # Server の応答をみる
    wget -S http://www.yahoo.co.jp
wget http://nchc.dl.sourceforge.net/sourceforge/python-mode/python-mode-1.0.tar.gz WARNING /etc/wgetrc http_proxy を設定すること
  # File を指定しないと index.htm を指定したことになる
  #      
  wget -r http://localhost/

  # おなじ意味
  wget -r http://localhost/index.htm

  # -r は File の Link をたどる
  #    Directory 階層はたどらない
  
  wget -r http://localhost/index.htm
  wget -r http://localhost/img/foo.png

  /index.htm
  /img/foo.jpg    # これは index.htm からの Link がなければ落ちてこない


  # Link されていれば取れる
  index.htm
  < img src=foo.jpg>



  # OK
  wget -r http://localhost/app

  # OK
  #      index.htm のみ
  wget http://localhost/app

  # これは うまくいかない
  # Root 直下以外はだめ
  wget http://localhost/app/somedir
  
  
___

■ sleep

SYNTAX sleep time[smhd] DESC cmd 実行の一時中断 IN OUT OP
    # 20分後に compile を background 実行.
    (sleep 1200;gcc exfile)&  
    sleep 1m;
___

■ file

SYNTAX file [OP] file... DESC file の種類を判定をして STDOUT へ出力( おおまかに予測 ) IN NULL OUT STDOUT OP f : 指定fileに記述されている file を 検査. /log/lua.htm /log/cygwin.htm
___

■ cal

SYNTAX cal [month year] DESC OP 3 : 前後3 s : sunday first m : monday first y : year
  # 前後 3 ヶ月
  cal -3

  
___

■ ping

SYNTAX ping [OP] host psz cnt ping [OP] あて先 荷物の大きさ 回数. DESC 指定した macine と packet を指定数おくる. default では packet は 1秒ごとに転送される. c-c で中止. OP

    ping www.google.co.jp 
___

■ hash

SYNTAX hash [OP] [cmd...] DESC Command 検索 path を hash Table に登録することで検索速度をあげる OP d: d r: remove tbl t cmd:
  
    # 現在の内容を確認
    hash
    
    # Table を空にするには
    hash -r

    

___

■ df

SYNTAX df [OP] [filesys] [files] DESC Disk の空き容量を出力 OP a: all : 0block size 含む B: Block : 指定Blockサイズ -B 1024 l: local : local file system
    # [:]必須
    df C:
___

■ du.DiskUsage

SYNTAX du [opt...] [file...] DESC ディスクの使用容量をしらべる estimate file space usage for each file OP c : total b : byte a : all file h : human readable s : Summarize( 要約 )
    # 次のような Directory
    ls -R oya

    /dust/oya:
    foo.txt
    ko

    /dust/oya/ko:
    foo.txt



    # oya 以下の Sub Directory ごとにサイズを出力
    du -h oya

    1.0K  oya/ko
    2.0K  oya

    # 合計も出力
    du -ch oya

    1.0K  oya/ko
    2.0K  oya
    2.0K  total

    # oya の合計のみ表示
    #   ( SubDirectory を表示しない )
    du -sh oya

    2.0K  oya


c ドライブの直下のディレクトリをしらべる
    # 子供 Directory のみ表示
    du -h --max-depth=1  c:/
___

■ od

SYNTAX od [opt] file... DESC Object Dump OP c : 1byte ごとに Ascii 表示 o : 1byte ごとに 8 進数で表示 x : 1byte ごとに 16 進数で表示 POINT 文字 code の検索に利用
___

■ dump

SYNTAX dump DESC Binary を出力 OP
  foo.txt aaa : ascii txt
  dump foo.txt
  00000000 6161 61
___

■ strip

SYNTAX strip [OP] objFile DESC discard symbol from objFiles Symbol Table を obj から削除する
___

■ m4

SYNTAX m4 [OP]... [file]... DESC macro processor OP
___

■ ps

SYNTAX ps [OP] [-u usrname] [-p pid] DESC cur process 表示 * UID userName * PPID ParentPID * PID ProcessID * SITME StartTime OP W: windows ps f: full a: all users u: list processes owned by UID p: procss
___

■ mkdir

SYNTAX mkdir [OP ...] dir DESC Make Directory OP p : no error if existing, make parent directories as needed m : mode 指定. // mkdir -m 777 foo p ( Parent )オプションで必要ならば親ディレクトリを生成する
    mkdir -p ./a/b/c
またディレクトリが既にあってもエラーにならないので -p を設定しておくと便利
    mkdir test

    # エラーにならない
    mkdir -p test
___

■ cat

SYNTAX cat [OP...] [file...] IN file... | - | STDIN OUT STDOUT DESC ファイルを結合して STDOUT へ出力 OP n : 行数つきで出力 v : 制御文字つきで出力 e: endline t: tab s : 空行を 1 行に e : 行末[$] が表記 POINT SPACE を可視にする時に使う POINT STDIN からの情報を file に書き込む. cat > file foo bar c-d # 終了 STDIN からの情報を file に追記する cat >> file c-d

  # 行末に $ をつける
  cat -E foo.txt

  # 行数をつける -> 行数を知るのに便利
  cat -n top.htm

  # [ - ] は STDIN がはいる
  date | cat header.htm - footer.htm; 


   # ファイルに共通のヘッダ、フッダを追加できる
  cat header_c xxx.c
  cat header_htm xxx.htm
  cat header_h xxx.h
   cat header_txt xxx.txt
___

■ rm

SYNTAX rm [-OP]... file... DESC file( Directory )を削除 OP f : Force : file無しでも prompt しない r : Recursive : v : Verpose :
  ps | cat fileA - fileB; [ - ] は標準入力がはいる

  # bar より下の file( dir ) を消去
  rm -r /foo/bar/*  

  # bar dir を含め 削除
  rm -r /foo/bar    
     
  
  echo /foo/bar/* とすると shell の cmd 置換の結果がわかる
___

■ tr

SYNTAX tr [-OP] set1 set2 DESC STDIN からの文字を変換, 削除して STDOUT へ出力 IN STDIN OUT STDOUT
OP c : Complement ( 補集合 ) tr -c A-Za-z a < test.txt // すべての英文字以外を変換 d : Delete s : Squeeze ( ( 連続した文字を一個だけ出力 )

  # // すべての英文字を変換
  tr A-Za-z a <  test.txt 


  # すべて小文字へ
  echo "AAA" | tr "[:upper:]" "[:lower:]"


  # 空白を消去
  tr -d ' ' <  test.txt

  # // キャリッジリターン[\r] を消去
  tr -d '\015' <  test.txt 
  echo -e "aaa\n\rbbb" | tr -d "\r"

  # s : squeeze ( 連続で置き換えのとき一個だけ出力 )
  tr -s A-Za-z a <  test.txt // すべての英文字以外を変換

  # すべての空白を Space1文字 にする
  echo "aaa    bbbbb" | tr -s " "

  # set2 が指定されると set2 の最後の文字になる
  echo abced | tr [:alpha:] abc


  # 英文字, 空白, 改行  以外を消去 

  tr -cd "A-Za-z \012" <  test.txt 
 
  # 単語リストをつくる
  tr -cs "" "\012" <  test.txt

  echo "aaa bbb ccc aaa bbb" | tr -cs "[[:alpha:]]" "\n" | sort | uniq

  tr -s [[:space:]] "\n"


  # -s だけは指定できない
  echo aaa | tr -s

  
  

  WARNING
    文字の追加はできないため, sed, perl で代用する

___

■ grep

SYNTAX grep [-OP] pattern [file,...] DESC 入力の中にパターンを含む行があればその行全体を出力 emacs のgrep と同じ IN file ( STDIN ) OP c : count数 n : nrLine h : hideFile s : suppress err ( 2> /dev/null ) i : insensitive 大小文字区別無し POINT grep -h ptn funcName // cpp から関数名を取得

    // inVert( 反転指定 )
    grep -v "cpp"

  WARNING 
    // "\t" は指定できない
    echo -e "a\tb" | grep "\t"

    echo -e "a\tb" | grep "[[:space:]]" | grep -v " "



  // 前後 1 行を表示
  echo $'a\nb\nc' | grep -n1 "b"

  // b のみ
  echo $'a\nb\nc' | grep  "b"

// patten [...]bc はファイル置換と同様しかしPETTERN の箇所は""する必要ないかも
  grep "[ak]bc" [Tt]est.txt 
 // aaa, bbb, ccc のいずれかを含むを行を出力

 // @WARNING () は処理結果を変えるメタキャラクタなので""必要
  egrep "(aaa|bbb|ccc)" *

  // 行頭aaa にマッチ
  grep "^aaa" test.txt 

  // 行末aaa にマッチ
  grep aaa$ test.txt 

    @WARNING UNIX 改行コードでない場合はtext editor上では行末でもデータとして異なるので注意!!!
  grep . test.txt // 任意の一文字にマッチング
  grep "\[a\]" test.txt // [] : shell の meta chara だから
  grep "foo" `find .` // cur dir 以下から探す
  grep '\1' // 後方参照可能

  // posix ブラケット表記
  grep [[:alnum:]] test.txt 
  grep [[:blank:]] test.txt // [\t ]
  grep [[:graph:]] test.txt // 表示可能文字 // 空行を除去可能

  // 英記号のみ( \n は含まない )
  grep [[:punct:]] test.txt 
  egrep 'a{0,5}' file // 省力しない
  grep 'a\{0,5\}' file // {} meta chara 扱い

WARNING grep は改行コードも含めて検索する grep "" はうまくいかない
    // [-] は qout がいる ? 
    BAD
      echo "---aaa"| grep "--"
    OK
      echo "---aaa"| grep "\-"
echo "** テスト " | grep "^\*\+.*[[:space:]]\+$" echo "** テスト" | grep "^\*\+.*[[:space:]]\+$" echo "** テスト " | grep "^\*\+.*[[:space:]]\+$" echo " ** テスト " | grep "^\*\+.*[[:space:]]\+$" Escape[\]することで MetaChara 扱いになる文字 [+] BAD grep '[a-z]+' file OK grep '[a-z]\+' file WARNING egrep では上記と逆 -> grep, egrep に統一すべき . BAD grep '.htm' file OK grep '\.htm' file ()後方参照時 BAD grep '(ptn),\1' file OK grep '\(ptn\),\1' file WARNING egrep は上記と逆 {}回数指定 BAD grep '[0-9]{4}' file OK grep '[0-9]\{4\}' file WARNING egrep は上記と逆, egrep の方が使いやすいかも ? : 任意の文字の 0 || 1 BAD grep 'd?emon' file OK grep 'd\?emon' file WARNING egrep は上記と逆, egrep の方が使いやすいかも  制御文字は[\t]未対応 ? 応用 -> うる覚えの単語を探すというのが一番の使い方!
  grep [abcde][abcde][abcde] test.txt // 母音3文字にマッチング
  grep ^..........$ test.txt  // 長さ10文字の単語にマッチング
  grep '\(...\)\1' test.txt  // 3文字の反復の単語
  grep '\(.\)\(.\).\2\1' test.txt  // 5文字の回文
  // foo && bar を含む行をマッチング
  grep "foo" * | grep "bar"  
  // log を指定日時で見る
  grep '1[0-2]/Jan/2005:23:0[0-5]' 
    
___

■ sed

SYNTAX sed [s/ptn/out/...] [file...] IN : file がない場合 STDIN OUT : STDOUT DESC 文字列をルールに従って変換する 最長(最短)検索 はできない 変換に利用できるルールには下の条件式が利用できる 文字列を挿入したい場合は「a」や「i」の後に挿入する文字列を指定 サポートする Regexp は 基本正規表現 を少し拡張したもの Perl のように 複数行にまたがる処理はできない。 文字列を置換 「s/置換ルール/置換文字/」 置換ルールの最初に数値を指定すると,指定した行のみが処理される 「3d」と指定すると,3行目が削除 変換をするときは 変換処理は -e オプションを指定した後に記述する
    sed -e 's/foo/bar' test.txt
区切り文字は / 以外にも , @ などが利用できる。
    sed -e 's,/,\,' test.txt
パターン・スペースとホールド・スペース 処理をする対象の文字列を一時的に保存する ( パターン・スペース という ) POINT 次の処理をすると image がわきやすい -> Group の文字が ひとつずつ していることがわかる echo abc | sed "s/[abc]/ABC/" 1行目を処理するときには,1行目の内容がパターン・スペースに保存 その後 パターン・スペースにある文字列に対して置換などの処理が行われる ホールド・スペースは パターン・スペースのサブとして使われる保存領域 パターン・スペースにある文字列を後の処理で利用したい場合などは 一度ホールド・スペースに移動しておく 他の処理を行った後に ホールド・スペースからパターン・スペースにもどせば 前の処理の続きができる パターン・スペースの文字列をホールド・スペースにコピーする場合h ホールド・スペースの文字列をパターン・スペースにコピーする場合は「g」 パターン・スペースとホールド・スペースを入れ替える場合は「x」 OP e: Expression f: Expression をファイルから読み込み n: デフォルト出力の抑制

  # 改行の変換はできない
  sed 's/\n/\r\n/' <  TEST_LF.TXT > TEST_CRLF.TXT

  # Perl ならできる
  perl -p -e 's/\n/\r\n/' <  /dust/LF.txt > /dust/CRLF.txt


  # tr みたいな使い方もできる
  #      1 < -> 1 対応しないとだめ
  echo ABCAAA | sed "y/ABC/ebc/"

  BAD
    echo ABCAAA | sed "y/ABCD/ebc/"

sed -n '10,/STRING/p' /dust/foo.txt { } sed s/foo/bar/ foo.cpp ls | sed s/foo/bar/ # STDIN から入力する. echo $変数名 | sed -e 条件 # 変数を置換するのはこれなのか ?
  ./test.sed foo.txt


  # 2-4 行目を削除
  sed '2,4 d' main.cpp

  
  # Error とある行に,「### Check Line ###」という新しい行を追加する
  #
  # 
  echo "ERROR: xxx" | sed -e "/ERROR/i #### Check Line ###" 
  
    sed -e '1,2 d' -e 's/foo/bar/g' foo.cpp

  // 数値のみを抽出
  sed "s/.*\([\.[:digit:]]\+\).*/\1"

echo "   aaa" | sed "s/[[:space:]]\+//g"



-f FILE で変換式を外部ファイルから指定できる。
    sed -f  script  test.txt

    # 複数指定する。
    echo "aaa" | sed -f script1 -f script2
変換式は次のように各行に式をかく
    # commnet

    1,2 d 
    s/a/A/g
    s/b/B/g
    s/c/C/g
___

■ DefaultMetaChara

DESC まとめるとこれ
    S_RESED
    # Escape して 通常文字( Default MetaChara )
    # .[]
    # Escape して MetaChara 扱いにする
    # +()|/< >
    E_RESED
[] : Group
  BAD 
    # [ab] を c に変換
    echo aaa | sed 's/\[ab\]/c/g' 
  OK 
    # a or b を c に変換
    # RET: ccc
    echo aaa | sed 's/[ab]/c/g' 
    # 株価情報 だけをとりたい ! ( Filter する )
    curl -s "http://profile.yahoo.co.jp/independent/9430" | sed "s/[^0-9.,]//g"
. : 任意の 1 文字
  BAD
    echo "aaa.txt" | sed 's/./_/g' 
  OK
    echo "aaa.txt" | sed 's/\./_/g' 
___

■ Escape[\]対象文字

* Escape して MetaChara 扱いにする [+()|/< >] () : back ref
  BAD
    sed 's/(foo)\t(bar)/\2,\1'
  OK
    sed 's/\(foo\)\t\(bar\)/\2,\1'
(a|b) : or
  BAD
    sed 's/(a|b)/foo/' file
  OK
    sed 's/\(a\|b\)/foo/' file
+ : 1文字以上の繰り返し
  BAD
    sed 's/[[:alnum:]]+/bar/g' file
  OK
    sed 's/[[:alnum:]]\+/bar/g' file
WARNING [/] がptn, out に存在する際は [\/]
___

■ du

SYNTAX du [OP...] [file...] DESC Disc Usage space, disc 容量を調べて、stdout へ出力
  # Current Directory 以下の容量を出力
  du


  6  ./CVS
  3  ./extra/CVS
  56  ./extra
  3  ./img/CVS
  1972  ./img
  8954  .
___

■ which

SYNTAX which cmd DESC cmd の full path を表記
___

■ find

SYNTAX find [dirlist...] [OP...] [expression] DESC ファイル, ディレクトリを検索する。 POINT dirlist は -OP の前に指定 expression type c f : regular file d : dir find -type d | grep 'etc' // etc dir 検索 find -name "*xxx*" -type f -exec rm {} \; 名前で検索する。 i ( insensitive )指定もある。 マッチする対象は ファイルだけではなくディレクトリも対象になる。 -name では shell の wildcard が使える。 名前は完全に一致する必要がある
    # BAD
    find . -name ".txt"

    # OK
    find . -name "a.txt"
-name 指定ではシェルの wildcard が使えるので部分的に指定する場合は使う
    # a.txt
    find -name "*.txt" 

    # a.TXT  a.txt
    find -iname "*.txt" 

    # main.cpp, main.htm
    find -iname "main.???"

    # main.d, main.o
    find -iname "main.[do]"

検索するディレクトリの深さを指定する ( -maxdepth INT )
    find . -maxdepth 1 -name "*.txt"
条件を not(反転) させる
    #  a.htm  a.jpg   a.png
    find -not -name "*.txt"

    # 各フラグの前に -not は指定できる。
    find -name "*.txt" -not -size +10K
  WARNING
    Path に "完全" に Match する必要がある
    "部分" ではだめ
    grep と間違えないように

    # regexp 検索
    
    regex str


regex ".*\.txt" cur dir からの相対パスで match する必要あり と思ったが, 検索開始 パスからの相対になる と表記すると Current になるだけ 仮説: match の比較対象の PATH は FULL PATH # d:/work 以下の すべてに match find d:/work/ -regex ".*" OK find -regex './foo.txt' BAD find -regex 'foo.txt' exec cmd // 対象ファイルに cmd を実行( {}SPC\; 必須 ) // -exec cmd {}< b>< font color="ff000000">SPC\;< /font>< /b> find . -exec rm -i {} \; newer FILE // file より新しいもの( timestamp ) mtime n // [ n*24 時間前に更新 ]されたもの. // EX. -mtime +7 // ここ一週間更新されないもの. // EX. -mtime -7 // 1 週間以内に検索されたもの. mmin n // 過去[ n Minute 内に更新 ]されたもの. ( 新規 file を検索にどーぞ. ) print0 // dlm として 0 をセット. ( xargs -0 と組み合わせる. ) empty // 空ファイルを取得.
    # current の file を取得する
    find . -maxdepth 1 -type f
    find . -name "*.foo" -type d

    # rm each file となる
    find . -name '*.zip' -exec rm {} \; 

    # pro 以下 *.cpp 検索
    find /pro/ -iname "*.cpp"  

    # bmp, jpg を listup
    find . -regex ".*\.\(bmp\|jpg\)"   

    # FILE より新しい
    find -newer FILE

30分以内に更新のあったファイル検索する
    find  -mmin -30
ファイルサイズを条件にして検索する
    find -size N[cwbkMG]

    # 1024 byte 以下
    find -size -1024c

    # 1M byte 以下
    find -size -1M

    # 100M byte 以上
    find -size +100M

    # 300 kbyte 以上
    find -size +300k
regexp : meta chara 機能を ON not need escape [ . * ] need escape [ ( ) | ] find -regex './te\(s\|x\)t' RET ./text ./test
___

■ mount

SYNTAX mount WindowsPath CygwinPath DESC Windows File System の Directory を POSIX PATH に mapping drive文字を POSIX dir tree の subtree にマッピング POINT map された情報は レジストリに保存される // user 毎の設定 // システム全体のテーブル デフォルトでは POSIX ルート / はシステムパーティションに位置づけられていますが mount コマンドを使用して Windows ファイルシステム中の任意のディレクトリで再定義できる Cygwin が Win32 パスから POSIX パスを生成したかどうかに関わらず 最も長くマッチしたプレフィックスがマウントテーブル中で使われます すなわち C: が /c として 更に / としてマウントされている場合 Cygwin は C:/foo/bar を /c/foo/bar として変換する // system とあるのは 全 user f:\cygwin\bin on /usr/bin type system (binmode) // user // user ごとの設定 c: on /cygdrive/c type user (binmode,noumount) 特定の Win32 パスを 既存のマウントによって POSIX パスへと変換することが出来なかった場合 Cygwin は常に自動的に POSIX パス /cygdrive の下にある仮想上のマウントポイントを使用します 例えば Cygwin が Z:\foo にアクセスしたが Z ドライブは現在のマウントテーブルには存在しなかった場合 Z:\ は自動的に /cygdrive/Z へと変換される Cygwin は Win32(ディレクトリの区切りにバックスラッシュを使う)スタイルのパスと POSIX(ディレクトリの区切りにスラッシュを使う)スタイルのパスを共にサポートする UNC パス名(二つのスラッシュと一つのネットワーク名で始まる)もまたサポートする (Linux のような)POSIX オペレーティングシステムには、ドライブ文字という概念はない 代わりに、全ての絶対パスは(「c:」のようなドライブ文字の代わりに)スラッシュで始まり 全てのファイルシステムはサブディレクトリとして表現されます ( 例えば 新しいディスクを購入してそれを /disk2 というディレクトリにする、といったようになります)。 UNIX システムで動作するように書かれた多くのプログラムでは 単一の統合された POSIX ファイルシステム構造の存在が前提となっているので Cygwin は それらのプログラムが Windows 上で正常に動作するように、 Win32 ファイルシステムに対する特別な内部的 POSIX ビューを提供します Cygwin は必要に応じて Win32 パスと POSIX パスの間の変換用のマッピングを使用します。 POINT 環境変数 HOME、PATH LD_LIBRARY_PATH は Cygwin プロセスが最初に開始された時点で自動的に Win32 フォーマットから POSIX フォーマットに変換される echo $HOME (c:\cygwin\bin から /bin のように echo $PATH // こちらは変更されない echo $INCLUDE

    # 現在の MountTable を listup
    mount

    # --Change-cygdrive-prefix
    # cygdrive prefix を [/] に変更
    # cd /c  で c:/ へ移動
    mount -c /
    cd "/c/Program Files"


    # "d:/work" を /work に map
    mount  d:/work   /work


    # 同じ意味
    //    \\ とすること
    //    Invalid argument となってしまう
    mount  d:\\work   /work

    
    

    mount d:/work/log/htm/public /log
    umount /log

___

■ cygpath

SYNTAX cygpath [OP] path... DESC pathWin < -> pathCyg 相互変換 IN NULL OUT STDOUT POINT # 複数指定できる cygpath -am ./foo ./bar ./foobar OP w: Windows u: Unix m: mixed( EX. c:/windows ) W: c:/WINDOWS P: start > programs < b>-a: absolue< /b> l: Windows longname ? プリセットのディレクトリのパスを返す
    #  c:/Users/USER/Documents
    cygpath -O

    # c:/Users
    cygpath -H

    # c:/Users/USER/Desktop
    cygpath -D

    # c:/Windows/system32
    cygpath -S

___

■ wc

SYNTAX wc [option]... [file]... DESC Word Count file の行数, 単語数, バイト数を表示 IN file( STDIN ) OUT STDOUT OP l : Line 数 w : Word 数 c : encode に依存する L : Longest line

    # ファイルの行数
    wc -l file

    # Record 数をとる
    cat record.csv | sort | uniq | wc -l
    
    # logdata vtxdata[ 0 1 2 3 4 5 ] があった際のカウント数を調べる
    wc -w log.txt

    WARNING 
      Line は [\n] の数で判定している

      # NrLine = 2
      aaa\n
      bbb\n
      ccc

      # NrLine = 3
      aaa\n
      bbb\n
      ccc\n

    echo -en "aaa\nbbb\nccc" | wc -l
    echo -en "aaa\nbbb\nccc\n" | wc -l


  # 行はなくなっている
  tmp=`curl -s "http://weather.yahoo.co.jp/weather/jp/13/4410.html" 
    | grep "^< img.*forcast.*gif.*"`

  echo $tmp | wc;        
___

■ echo

SYNTAX echo [op...] [string ...] DESC 文字列を STDOUT に出力 # cmd 置換の結果をみるにも便利
___

■ mv

SYNTAX mv [OPTION]... [-T] SOURCE DEST mv [OPTION]... SOURCE... DIRECTORY mv [OPTION]... -t DIRECTORY SOURCE... DESC IN OUT OP u : update
    # 上書きを無視するには
    mv -f srcfile /work/tmp/

    # verpose
    mv -v src dst
___

■ cp

SYNTAX cp [op]... file... dir cp [op]... file file cp [op]... -r dir dir DESC ファイルをコピーする ( Default では Directory は Copy しない ) POINT 引数によって使い方は 3つ
     2 つ以上のファイル と最後に Directory を指定
      [ dir以下 ] に cp される
      ( 最後に Directory を指定しないとエラー )

     2 つの FILE
       1 番目のファイルを 2 番目のファイル名でコピーする

     2 つの DIRECTORY
       cp -r dir1 dir2
       GUI で dir1 を dir2 に DragDrop するのと同じ
       結果は dir2/dir1
* Permission denied について コピー先の場所はあなたが書き込むことのできる場所です そうでないときは `Permission denied(許可しません)' と表示します 上書きのときは元のファイルをいったん消して書き込みますので 元のファイルもあなたが書き込み許可を持っていなければ同じく `許可しません'となる ファイルモードを chmod()で変更してからすること . cp -R f:/work/data d:/work // RET: d:/work/data tgt を [/] で 終わるようにすると, dir を指定したことになる. -> 指定した dir がなければ, 処理は止まるはず. ? cp -Ruvp ./foo.cpp /cygdrive/c/tekitou/ OP r : Recursive u : Update p : Preserve ( TimeStamp, OwnerShip modifytime ) を変更しない コピーすると, コピーした日付や所有者はコピーした人になるが 元のファイルの所有者やグループ,モード,日付もそのままコピーする。 f( --force ) dst を開けなくても, 削除してから再度コピー v : Verpose ( どのように Copy が動作するか チェックするのに便利 ) POINT
    #  Directory 自体のコピー( EX. f:/work/data -> d:/work/data )

    // BAD
    cp -R f:/work/data d:/work/data/
    // OK
    cp -R f:/work/data d:/work/

  WARNING 

    # tgt の Directory は自動で作成されない
    #      mkdir -p( Parent ) で作成しておく
    cp src.cpp ./tekito/dst.cpp   

    # tgt にしかない FILE は削除されない
    cp -Rvfup dst src
___

■ date

SYNTAX date [OP] [+format] DESC 時刻の表示 OP FORMAT +STRING : 出力format 指定 WARNING + は必須( ""はmeta chara 抑制の為 )?

    # RET: 2007_08_18
    date "+%Y_%m_%d"

    # RET: 20070818
    date "+%Y%m%d"


    # RET: 2007-09-17
    date "+%F"
    date "+%M"     // RET: minute

    # RET: 2124
    date "+%H%M"     

    # RET: 21:25
    date "+%R"
___

■ nkf

SYNTAX cat foo | nkf -s DESC network kanji変換 filter 入力漢字 code を自動認識, 指定した出力漢字 code を出力 [in/out] 対応文字列 . jis-code : ISO-2022-jp( 7bit jis ) . sjis : MS 漢字 code . 日本語EUC: AT-T code OP s: shift jis e: euc j: jis
___

■ ar

SYNTAX ar [OP] archive [member ...] DESC archive 作成 OP r: replace v: verbose

    # test.o , sub.o を Archive する
    #
    ar -rv libtest.a test.o sub.o

    # a : Append
    a - test.o

    # r : Replace
    r - sub.o

    
___

■ ranlib

SYNTAX ranlib [-vVt] archive DESC archive Index を更新する POINT GNU ar は自動で Index も更新するため不要
___

■ test

SYNTAX test EXPRESSION [ EXPRESSION ] DESC ファイルタイプのチェック 値の比較 RETVAL 0: true : test 結果が真 1: false : test 結果が偽 POINT # RET: false ( == 1 ) test ; # RET: true ( == 0 ) test nandemoii;
  WARNING
    BAD
      # SPACE なしでは str に値が代入される
      [ $str=1 ]
    OK
      [ $str = 1 ]
expression [ num = 0 ] # 数値の比較 [ str = str ] # 文字列が等しければ [ str == str ] # SPC を忘れずに [ str != str ] [ int1 -gt int2 ] : greater than( -ge : greater | equal ) [ int1 -lt int2 ] : less than test -f foo.txt // File Check test -d foodir // Directory Check test -n $str // if strlen != 0 test -z $str // if strlen == 0 test -s file // if file Size > 0 test -w file // if file Writable test -r file // if file Readable test -S file // if file Socket test -t file // if file open By Terminate test -s file -a -s file // if file is empty int1 -ne int2 // int1 not_equal int2 dep -nt tgt // dep が tgt より新しければ
    # 引数 がなければ
     if test -z $1; then    

    # file に記述があれば
    if [ -s ./alert.txt ]; then
       notepad alert.txt &
    fi  
dst が src より新しければ
    if test $dst -nt $src; then

    fi
ディレクトリであるかテスト
    if [ -d $path ]; then

    fi 
___

■ echo

SYNTAX echo [arg] IN arg 省略時に STDIN から読み込む OUT STDOUT DESC [ 引数 ]を[ STDOUT ]に出力 複数の文字列を出力する際は, SPC tab で区切る OP n: no trailing newline( 改行を出力しない ) e: Escape [\] の後を MetaChara として扱う \n : Newline \t : Tab
    echo -e "aaa\nbbb" /dust/foobar
    // 改行を出力しない
    echo -n 元気
    echo ですか

    // wc を 利用すると 確認できる
    // RET 4
    echo 123 | wc -c

    // RET 3
    echo -n 123 | wc -c

    # ["] を含むときはどうなる ? 
    BAD
      echo "aaa\"bbb"
    OK
      echo 'aaa"bbb'
    # どうやら lisp を経由しているから
    BAD
      echo "aaa\"bbb"
    OK
      echo "aaa\\"bbb"
    # 改行コードをいれて ( \n を メタキャラとして )
    echo -e "up\ndown" > /dust/foo

    :: パラメータの展開みれます
    echo %1 > ret.txt

___

■ ls

SYNTAX ls [OP...] [dir...] DESC CurrentDirectory の内容を表示 OP a : All file ( .file 含む ) A : All file ( . | .. 除く ) l : long format : 詳細表記 d : Directory : dir 自身の表記 POINT Directory 名を指定したとき再帰的にlist するか指定 ( default on ) R : recursive r : Reverse s : print Size ( kB ) f : do not sort t : Time : 変更日時順にソート S : sort by Size Fc : dir の後に / , 実行fileに * ( file 属性を表示 ) i : inode番号を出力. g : user のない LongFormat o : group がない longformat p : dir の後に / s : block数. m : stream形式( foo, bar ... ) B : ignore Backup file ~ i : 各 file の index 表示 --color S : sort by file size --full-time WARNING ls は CurrentDirectory の内容を表記する( 再帰的ではない ) Full-Path で表示されない

    :: 変更した順に
    ls -t

    
    :: ".xxx" ファイルを含め ".", ".." を除く
    ls -A


    # ファイルサイズを出力する
    ls  -s    test.bmp

    #  1M など人が読みやすいフォーマットで
    ls  -sh   test.bmp
    ls -l の format

    permisson  owner  group  size  ModifyTime  filename

    group "なし" といわれる ? 

___

■ faq

■ PATH 表記は win32 | POSIX どちらにすべき ? DESC mycon > PATH -> POSIX PATH に自動変換 D:\mydata\tool\exe -> /cygdrive/d/mydata/tool/exe 2. which cmd は POSIX path のみ有効ではない export PATH=$PATH:"D:\mymus"
___

■ MetaChara


  DESC
    特定の表現方法を示す文字

  WARNING
    meta chara は[ 正規表現可能な箇所 ]に記述したときに meta chara の意味になる
    Command によって正規表現の扱いがちがいます
    規格は完全に統一されてません

___

■ ^

DESC 行頭 // ^# 否定 // [^a-c], [^a]
___

■ $

DESC 行末( 文字列の末尾 ) // .jpg$ WARNING 改行コードにマッチするわけではない
___

■ .

DESC 任意の一文字 // ... 任意の3文字 WARNING . == 表示可能な文字 shell のpath 展開では ? DESC 直前の文字の0回以上の繰り返し ab* -> ab, abb, abbb, a 2. 0 文字以上の任意の文字 ( shell )
___

■ ?

DESC 直前の文字の0, 1 回の繰り返し test.html? // test.htm || test.html POINT あってもなくてもよい場合に便利 WARNING 基本正規表現では 単なる文字として扱う 2. 任意の1文字 ( shell )
___

■ -

DESC 前後に指定された文字の範囲 [ 0-9 ] WARNING 文字コードに依存 POINT 次のケースは通常文字として扱う [a-c], [-abcdt], [abcde-]
___

■ []

DESC []内で記述された一文字 POINT 文字クラスにposix ブラケットを指定可能 ( egrep ) 2. ^, - は[]内ではmeta chara としての扱い 3. 他のmeta chara は[] 内では通常文字としての扱い -> 単なる文字として扱うことができる
___

■ |

DESC | の前後の文字列の片方 WARNING | の前後の文字列、正規表現は全体が考慮される
    BAD
    slee|ap -> slee || ap
    OK
    sle(e|a)p -> sleep || sleap
    基本正規表現では通常文字として扱う( grep -> egrep )
___

■ ()

DESC meta chara の影響範囲を指定 (foo|bar) 2. 後方参照 POINT 基本正規表現では () を通常文字として扱う場合は \(, \) とする
___

■ \< \>

DESC 単語の(先頭|末尾)の空文字にマッチ
  \< no // nothing, nobody,
  \< no\> // no
POINT < , > は通常文字としての扱い
___

■ min max

SYNTAX {min,max} DESC 直前の文字の繰り返し回数
  # ee, eee, eeee, eeeee
  # e を 2 〜 5 回の繰り返し
  e{2, 5}

  # [0:3]
  e{,3} 


  # RET : aaa
  echo "aaa" | grep "a\{3,4\}"

___

■ \b

DESC 単語の境界にマッチ( boundary ) 単語とは [a-zA-Z0-9] 以外の文字 == [:./\ \n] // 制御文字も含む 単語の(先頭|末尾)とは 上記の文字列が切り替わる箇所 空文字とは 文字の間にある論理的な文字 WARNING 空文字 != ( [a-zA-Z0-9] | [:./\ \n] ) 単語の境界にマッチ == 単語 ^単語の間の空文字にマッチ ie : 空集合 word -> 行頭 n w n o n r n d 行末 WARNING 制御文字を意味する\b もある [\b] は単語境界を意味 grep は\b:backslash は非サポート
___

■ \d

DESC 数字 1文字 Digit POINT == [0-9], [[:digit:]] WARNING grep では使用できない ?
___

■ \D

DESC 数字以外 1文字 POINT == [^0-9], [^[:digit:]]
___

■ \s

DESC 空白文字の 1文字 POINT 空白文字 == [ \t\n\r\f] == [[:space:]] POINT \S == ^空白文字
___

■ \w

DESC alphabet || 数字 1文字 ( word ) POINT [a-zA-Z0-9] == [[:alnum:]] _ 含む POINT grep で使用可能 制御文字の表現 なぜ制御文字をサポートする? tag, 改行にまたがるパターンを指定できる database file 制御文字の表現方法 \x のようにescape する \a == 0x07 \b == 0x08 \e == 0x1B [ESC] \f == 0x0C [FF] \n == 0x0A [LF]( unix ), 0x0D0x0A[CRLF]( win ) POINT 論理的な改行コードを意味、platform に非依存[ 改行 == \n ] \r == 0x0D [CR] \t == 0x09 [HT] \s : 空白文字 ( 正規表現のmeta chara ) POINT meta chara にbindされない制御文字は文字コードで直接指定 foo\tbar -> foo\011bar // 8進数で指定する場合3 桁で WARNING grep, emacs では失敗 foo\tbar -> foo\x09bar // 16進数で指定する場合 meta chara のエスケープ 目的 meta chara として使用される文字を通常の文字として扱うため $100 // 行末 + 100 \$100 // $100 \100 // 後方参照 \\100 // \100 \b // 単語境界 \\b // \b posix ブラケット表示 目的 code 体系に依存しない文字クラスの表現をするため [0-9] == code 0 から code 9 の範囲の文字コード, != [0< =nr< =9] POINT よく使用される文字code( ASCII がbase == ASCII code 体系 ) ShiftJIS EUC Unicoord DESC [[:xxx:]], xxx 論理的な文字セットを表す 文字自体ではない local に依存 [[:upper:]] 指定した文字コードの大文字 != alphabet 大文字 ( ASCII code 体系 ) alnum : alphabet + nr cntrl : 制御文字[\b \n \t \e] lower : alphabet 小文字 space : blank + [\n] alpha : digit : nr print : [[:graph:]] + SPC + (TAB?) upper : alphabet 大文字 blank : SPC + TAB, [^\n] graph : 表示可能文字, [[:alnum:]] + [|&*] punkt : 英記号, 表示可能文字 && [[:alnum:]] || SPC でない xdigit : 16進表記, [0-9a-fA-F], perl only word : word == \w 基本正規表現 拡張正規表現 WARNING 拡張 != 基本 + α , ( 混在している ) list . ○ ○ * ○ ○ + - ○ // == {1,} ? - ○ // == {0,1} {min,max} \{\} ○ // meta chara として扱うため \ する( 逆? ) ^ ○ ○ $ ○ ○ [^] ○ ○ [-] ○ ○ () \(\) ○ // meta chara として扱うため \ する( 逆? ) | - ○ 後方参照 ○ - 各tool の 正規表現のサポート WARNING toolが基本正規表現, 拡張正規表現の規格に一致する訳ではない 基本正規表現 sed, ed 拡張正規表現 egrep list egrep sed emacs . ○ ○ ○ * ○ ○  ○ + ○ \? ○ ? ○ \? ○ {min,max}  ○ ○ ○ // meta chara として扱うため \ する( 逆? ) ^ ○ ○ ○ $ ○ ○ ○ [^] ○ ○ ○ [-] ○ ○ ○ () ○ \(\) \(\)// meta chara として扱うため \ する( 逆? ) | ○ \| \| 後方参照 ○ ○ ○ \< \> ○ ○  ○ {}     ○ \{\} - // emacs 対応?, {}が文字のケースが多い-> \ \b\B ○ ○ ○ \d\D - - - \s\S - - - \w\W ○ ○ ○ posix bra ○ column DFA : 決定性有限オートマトン -> 平行処理 NFA : 非決定性有限オートマトン -> 逐次処理( back track )
___

■ Shell.の.MetaChara

DESC file path の正規表現のため command line 変換 は [*] してしまえば けっこういけます
    *  :  0 コ以上の任意の文字
    ?  :  任意の1文字
    [] : []内の任意の文字
            [^xyz], [!xyz], -> [^xyz] で統一
POINT path名置換に失敗しても、そのままの引数がcmdにわたる

    # echo を利用して結果が見れます
    echo *.htm -> foo.htm bar.htm

    # 失敗するとそのままかえる
    echo *.htm_xxx -> *.htm_xxx
    
    # file path の変換に使う
    cp -upv /work/dust/foo/bar/kosinpri/*.jsp $dst/jsp

    # FilePath にマッチするなら Current Directory でなくてもOK
    ls ./sub/*.txt


POINT Shell の CmdLine も WildCard 展開をする // shopt == shell option // 以下のものを .sh にいれておくと. shell の制御が可能 shopt -s nullglob で cmd line の処理を終了 shopt -s igncr $SHELLOPTS igncr を いれることで CRLF の CR を無視. WARNING cmd の正規表現と区別する egrep 'foo*' file // 'foo*' の * はgrepの正規表現
___

■ {}.brace.展開

DESC []内, で区切った文字列を順に展開
    /home/{bin, sbin}
    ->
    /home/bin
    /home/sbin
WARNING regex の {}とは異なる 行頭と行末, 空文字 行とは [\n]の次の文字から次の[\n]が現れるまでのdata POINT 多くの toolは行単位で textを処理 論理的な行頭 特定の文字に依存しない論理的な行頭 WARNING 行頭の文字コードがあるわけではない POINT foo bar -> ^foo bar と考える
___

■ 後方参照

DESC 後で参照するptn を()をつけて、\nで参照
  aaa.htm,aaa.jpg のような組み合わせのptn表現可能
___

■ 最長一致と最短一致

DESC ptn マッチにおいて、できるだけ長く一致する動作 [*?+{min,max}]時に機能 tool 間でほぼ共通の動作 tom aaa(bbb) cccc) sed 's/aaa.*)/out' file -> tom out
___

■ 最短一致の指定

aaa.*) -> aaa.*?) : perl 互換のtoolでサポート POINT sed 'a/aaa[^\)]/out' file : [)]以外の文字と明示する
___

■ 実践例


___

EX >■ EX

for f in *.cpp という扱いでOK
___

■ file数をカウント


  # CurrentDirectory の jpg の数
  ls *.jpg | wc

  ls | egrep "lzh|zip" | wc

  ls | grep "jpg" | grep "png" | wc
___

■ xxx.zip.を見つけたら消す

  find . -name '*.zip' -exec rm {}\;
___

■ cur dir以下の特定名のfileをcp|mv

    cp `find . -name 'foo'` foodir
    query-replace-regexp \\$ -> NULL; // 行末の \ を削除
# tag を追加, ascii OK !, [""]は \ するとエラー, ie quato の必要なし query-replace-regexp ■ \(.*\) -> < b id="aaa"> ■ \1< /b> # htm/ 以下に < meta charset="Shift_JIS"> を先頭にいれたいconcat を使用する file の 中身を探す際は find && grep を使用
___

■ 特定のディレクトリを検索

    # Layout UV 使用方法を bonus tool からさがしている
    find . -name 'bonus tool';  // file にあたりをつける
___

■ file内をキーワードでさがす

  
  # file から説明を探す
  grep -R -i "layout UV" dir_bonus_tool
___

■ 西暦をいれる

# 1999.10.15 のみ抽出 egrep '[0-9]{4}\.[0-9]{2}\.[0-9]{2}' file # 後方参照 egrep '[0-9]{4}\.([0-9]{2})\.\1' file # : day[01-31] egrep '[0-9]{4}\.([1-2][0-9]|0[1-9]|3[0-1])\.\1' file
___

■ SpellCheck

  # daemon < -> demon とまちがえてしまう
  egrep 'd?emon' test.txt
___

■ CSV項目を入れ替えてカンマ区切りに変換


  sed 's/\(foo\)\t\(bar\)/\2,\1'

___

■ list から文字列を抽出

 : /usr/bin 以下から a から始まるfile を取得
       ls /usr/bin | egrep '^a'
___

■ 条件を満たすfileを取得

  file == xxxx.0
       find /usr/bin -name '?*[a-zA-Z].[0-9]'
  egrep でmail address を抽出( mailer から address を抽出 )

  # user 名のみをとる
  # From: usrname@domain in file 
  grep '^From:' file | cut -d ':' -f 2
___

■ Commentカンマ空行を一度に消す

  egrep -v '/\*' test.c | egrep -v '^$'

  # 
  egrep -v '(/\*|^$)' test.c

  # [^/] == / 以外の一文字 == 空行は !match
  egrep -v '(^[^/])' test.c
___

■ sed.で.comment.を削除

  cmd;   ### comment ###
  ^.*#.* -> 最後の # で match
  ^[^#]*#.* -> 最初の # で match

  # 変換パターン    ^\([^#]*\)#.* 
  # 置換            \1
  
  sed 's/^\([^#]*\)#.*/\1/'
  print "test";   # comment

  print "test";
 c cmt を削除

  /* はcmt に存在しない

  /\*.*\*/


  '.' -> '*/' 以外の文字にmatch


  [^*] == *以外の文字
  \*[^/] == * + /以外の文字
  ([^*]|\*[^/])*


  /\*([^*]|\*[^/])*\*/

  
___

■ htm.からheaderを抽出

  
  #  パターン [hH][1-6]
  echo "< h6>xxx< /h6>" | grep "[hH][1-6]"

  # Insentive 指定
  cat foo.htm | grep -i "h[1-6]"

___

■ emacs.で時刻を条件に.logをchk

    2005/01/10 - 12
    23:00 - 23:05 の log を見る
  ptn
    1[0-2]/Jan/2005:23:0[0-5]
___

■ emacsで表記の一貫性のチェック

    (xxx) の 全角、半角の統一
  ptn
    ( (|\( ) .+? ( )|\) )
  rep
    ( (|\( ) (.+?) ( )|\) )  -> \2
  WARNING
    emacs meta chara
    |() -> escape で meta chara に変換
    \( (\|( \) \(.+?\) \( )\|) \)  -> \2
    \((\|(\)\(.+?\)\()\|)\)  -> \2
  POINT
    [] で \ を代用
    [((]\(.*?\)[))] -> (\1)
  POINT
    [ xxx ] など表記の統一に利用可能
htm の tag を取り除く
  ptn
    < .+>

  空行
    [\t ]*
    [\t ]*< .+>

  最短一致
    [\t ]*< [^>]+>

    header 作成
      sed s/^\([^[:space:]]\+\)/< h1>\1< \/h1>/g test.txt


   # URL を Anchor タグでくくる

   sed 's/http:.*/< a href=\"\1\">\1< \/a>/g' file
___

■ Cygwinをいれる


  DESC
    Cygwin の Setup 方法

___

■ Cygwin.とは

Cygwin とは Windows で Unix 環境を利用する UNIX Tool 群 のセット
  0. DL すみの package は /mydata/cygpack

  1. Install from LocalDirectory
2. パッケージの選択で、default から Install に変換 WARNING   デフォルトだと必要な TOOL、man などがインストールされない cygwin とはUNIX環境を再現した cygwin.dll とUNIXツールの集合から成る install はパッケージから選べる Base Devil( compiler... ) UNIXのバックグラウンド
___

■ 環境設定のための.file

DESC /home/< usr>/ bash_profile : bash boot ( login 時によみこみ ) .bashrc : ( session 毎に ) ) .bash_logout cygwin 起動時の設定ファイル(c:/cygwin/etc/profile)
___

■ Directory.構成

DESC
      FHS
      bin : 基本cmd
      boot : boot に必要なファイル
      dev : デバイスファイル( SpecialFile ) 
      etc : 設定ファイル : 各host 固有のdata
      home : usr home dir : 各ユーザのhome dir の場所
      lib : 共有library : DLL に相当  ( libc.a とか )
      mnt : 一時的なmnt
      opt : 追加 appli
      proc : process info
      root : root 用 home dir : super user 用 home dir
      sbin : system 管理 cmd : system recovery 用 cmd
      tmp : tmp file : reboot 時に消去される
      usr : 各種 Program
            ----- local : site local( 個人用 )
      var : 変更されるdata


      # user が独自で install した Program は /
      #    usr/local/inlude
      #    usr/local/lib
      #
      cd /CUnit-2.1-0
      make install

      /usr/local
          |
          +-- /doc/CUnit/     ... HTML ドキュメント群
          |
          +-- /include/CUnit/ ... インクルードファイル群
          |
          +-- /lib/           ... ライブラリファイル群
          |
          +-- /man/man3/      ... MAN ドキュメント
          |
          +-- /share/CUnit/   ... XML 関係のファイル群

  
    # passwd file 
    /etc/passwd

    # group file 
    /etc/group

___

■ cygrunsrv


  DESC

   UNIX デーモンプログラムを 
   NT/2000/XP 上のサービスとして動作させるための
   サービススタータプログラム

___

■ サービス制御.コマンドラインMode

システムレジストリへの サービスのインストールや削除をします インストール済みのサービスの 起動と停止もできる
___

■ サービスの実行.デーモン化

Windows のサービス制御マネージャから呼び出される 特殊なエントリポイントからのみ実行されます ( 実装すべき関数があるということ ) コマンドラインから cygrunsrv をこのモードで動作させることは出来ません 「デーモン化」モードでは cygrunsrv は(「コマンドライン」モードで指定されたフラグに従って)環境を設定します cygrunsrv はターゲットとなるサービスが cygwin1.dll を簡単に見つけ出すことが出来るように 「/bin」を PATH の先頭に追加します (必要であれば)cygrunsrv は 標準出力、標準入力、標準エラー出力をログファイルや NT/W2K イベントログにリダイレクトします(イベントログへのアクセスはまだ実装されていません cygrunsrv はターゲットとなるデーモンを起動します
___

■ いろいろやってみた

  // -p で実行する Service( Pro ) を指定 
  // -a "foobar" で Service にわたす Arg を指定
  cygrunsrv -I foo -p /usr/bin/bash -a "foo.sh"

  // Service が起動したときの ENV を指定する
  cygrunsrv -I foo -p /usr/bin/bar -e HOME=/e/services -e TMP=/var/tmp


  ;; sshd.exe を Service として登録する
  cygrunsrv -I sshd -d "CYGWIN sshd" -p /usr/sbin/sshd -a "-D" -e "CYGWIN=ntsec"
___

■ ひさびさにはいってみた


  ;; cygwin にある ssh client を使う
  ssh localhost

  xxx@localhost's password xxx
  
  // netstat -n とすると sshd, ssh がつながっているのがわかります
  TCP    127.0.0.1:2263         127.0.0.1:23           ESTABLISHED

___

■ Command.一覧

cygrunsrv POINT "サービス" を見ながら確認するとわかりやすいです

  // 大文字, 小文字あります

  // install する
  cygrunsrv --install cron --path /usr/sbin/cron --args -D -e "PATH=/work/shellscript"


  // "cron" という service 名で /usr/sbin/cron.exe を登録
  cygrunsrv -I cron -u xxx -w "xxx" --path /usr/sbin/cron --args -D -e "PATH=$PATH"


  cygrunsrv -R cron 
  cygrunsrv -I cron -p /usr/sbin/cron --args -D -e "PATH=$PATH;d:/cygwin/bin"
  cygrunsrv -I cron -p /usr/sbin/cron --args -D -e "PATH=$PATH"
  cygrunsrv -I cron -p /usr/sbin/cron --args -D
  cygrunsrv -I sshd -p /usr/sbin/sshd --args -D -e "PATH=$PATH"

  * Warning: User mode mounts detected.  
  This will likely cause the service to fail to start.  

  You must have system mode mounts
  * in order to run services.  Re-run setup and choose 'All Users'
  * or consult the FAQ for more information.




  // Service を開始する
  cygrunsrv --start cron
  cygrunsrv -S cron


  // Service をとめる
  cygrunsrv --stop cron
  cygrunsrv -E cron


  // 動作しているかチェック
  cygrunsrv --query cron
  cygrunsrv -Q cron


  // Uninstall する ( Service 一覧から消えます )
  //     ( Service 名の指定は -I xxx の名前で )
  cygrunsrv --remove cron 
  cygrunsrv -R cron 


  // Help をみる
  cygrunsrv -h

  // ユーザ「xxx」アカウントとして動作するサービス sshd をインストールする
  cygrunsrv -I "xxx sshd" -p /usr/sbin/sshd -a '-D' -u xxx -w privy23

___

■ Option

http://www.amy.hi-ho.ne.jp/tachibana/cygwin/cron.html /// 指定した.PATH.をとおすには -e PATH=$PATH:/work/shellscript /// log を見るには /// Optional output file used for stdout redirection. Default is /var/log/< svc_name>.log. // stdout へ出力を見るには
___

■ cron


  
    http://homepage1.nifty.com/cra/linux/cron.html

    cron の設定
    cygwin で cron を使う
    
  DESC
    cron とは、ジョブ(スクリプト)を自動実行するためのデーモンプロセスです      
    crontab コマンドはUnix系OSにおいて
    コマンドの定時実行のスケジュール管理をしたりする


    標準入力からコマンド列を読み取り crontab というファイルに保存

      cron という名称はギリシア語のクロノス (χρ?νο?)に由来

      一般にcrontabコマンドで編集されたスケジュール内容は、
      crond デーモンにより実行される。crondはバックグラウンドで稼動し
      毎分ごとに実行すべきスケジュールがないか確認し、もし実行すべきジョブがあれば
      それを実行する。このジョブは「cron job」とも呼ばれる。
      自分で常駐 Thread を用意しておけばこのようなことも可能. 


___

■ WindowsService.に登録する


   // -D は cron.exe の Argument  
   cygrunsrv -I cron --path /usr/sbin/cron --args -D
   cygrunsrv -R cron
   cygrunsrv -Q cron


    # cronが動いているかテスト
    cygrunsrv --query cron

    # RET
    Service            : cron
    Current State      : Running        // 動いてる !
    Controls Accepted  : Stop
    Command            : /usr/sbin/cron -D

___

■ 下準備

1. Cygwin を Full-Intall する 2. サービス > cron を起動 ( 本体は D:\cygwin\bin\cygrunsrv.exe )
___

■ Job.を登録する

場所は /usr/sbin/cron.exe ファイルは /etc/crontab
___

■ 設定方法

# 編集するには crontab -e 編集ファイルには # comment です # 最後に改行をいれるといいかも # min hour day month week command # [*] WildCard SYNTAX Minute Hour Day Month Week Command DESC 時刻 と 処理 を登録する 各行はそれぞれ1タスクになる Minute : 0-59 hour : 0-23 day : 1-31 month : 1-12 (or names, see below) week : 0-7 (0 or 7 SUN 1 : MON 2 : TUE ... チェック用の Job としては # 1 分ごとに 日付を書き込む * * * * * /bin/date >>/tmp/foobar.txt # vi が嫌なら使いたい Editor を指定する export EDITOR=/usr/bin/emacs # 登録内容をチェック crontab -l # Job を消す crontab -r; # Log を見る cat /var/log/cron.log
___

■ 例

    # 指定 (10/1 3:00) に hoge.sh を実行
    0 3 1 10 * /usr/local/bin/hoge.sh

    # 毎日 2時
    0 2 * * * /usr/local/bin/hoge.sh

    # 月初めの5時
    0 5 1 * * /usr/local/sbin/hoge.sh

    # 2 時間ごと
    0 */2 * * * /usr/local/bin/hoge.sh


    # [*/N]  で N ごと ( Step値指定  )

    # [*] は wildcard

    # 1分ごと
    */1 * * * * /work/foo.sh

    # 15分ごと
    */15 * * * * /work/foo.sh

    # 毎分
    * * * * * /work/shellscript/kawase.sh

    # 毎晩 23:55
    55 23 * * *   /work/shellscript/cronjob.sh
    * * * * *   /work/shellscript/cronjob.sh




    # 1時間に1回 コピー
    0 * * * * cp -auR /cygdrive/c/usr/work/* /home/kaz/backup/


    # 毎日 2時に
    0 2 * * * /usr/local/bin/hoge.sh


___

■ 詳細な.Command.を登録するのは手間なのでxxx.sh.を呼び出す

  * * * * * /work/cronjob.sh
  # Shell Script をすきに記述
  # foo.sh
  
  date >> /work/foo.txt
  date >> /work/bar.txt
  /work/shellscript/foo.sh
___

■ 問題点

PATH がとおっていない ? BAD job.sh OK /work/shellscript/job.sh # こうした方がいいかも cygrunsrv -I cron -p /work/shellscript
___

■ 簡単なJobを登録してテスト

1 分おきに 時間をかきこむ Job # Edit する bash> crontab -e; # EDITOR が起動するので 入力して保存 # WARNING # 最後に [\n] を忘れずに * * * * * date >> /dust/crontest.txt # Install 成功 bash> crontab: installing new crontab
___

■ 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 スクリプト : コマンドの集合 == パッケージ フィルタ : 標準入力からデータを読み、標準出力へ出力するプログラム 実際 多くのフィルタはファイル名を指定することで、データを入力できるようになっている
















NINJAIDX 3