忘れがちなUNIXコマンド

 

便利なキーボードのショートカット

Ctrl+u: カーソル以降を削除

Ctrl+k: カーソル以前を削除

Ctrl+d: カーソルの重なる文字を削除

Ctrl+h: Backspaceが効かない場合に、文字が削除できる場合がある

Ctrl+a: 行頭に移動

Ctrl+e: 行末に移動

Ctrl+l: スクリーンをクリア(clearのショートカット)

Ctrl+_: アンドゥ

Ctrl+/: アンドゥ

Ctrl+t: カーソルの文字をカーソルの前の文字の前にもっていき、カーソル自身は次の文字に移動(ミスタイプしたときに重宝)

Esc+F:   次の単語に移動

Esc+B:   前の単語に移動

Esc+R:   この行のアンドゥ

Esc+C:   現在の単語の先頭だけを大文字に変換(キャピタライズ)

Esc+L:   現在の単語をすべて小文字に変換(Lower

Esc+U:   現在の単語をすべて大文字に変換(Upper

Esc+d:  カーソル位置から現在の単語末までを切り取り

Esc+Del: カーソル位置から現在の単語の先頭までを切り取り(? bash

 

http://www.obihiro.ac.jp/~suzukim/masuda/octave/html/octave_13.html

 

特別変数:

$? 直前に実行されたプロセスの戻り値

立った今実行されたプロセスの戻り値を確認するには、

$ echo $?

でいい。

 

$$ 現在のシェルのプロセス番号

 

$0 実行中のスクリプト名

 

$1$9 シェルスクリプトに与えられた引数

 

$# シェルスクリプトに与えられた引数の数

 

$* $0以外の全ての引数

 

$@ $*と同じく$0以外の全ての引数。$*との違いは、"$@"としたとき、位置パラメタの評価をせずコマンドに渡すこと。囲まなければ、$*とまったく同じ。

 

$- シェルにセットされているオプション

 

$! バックグラウンドで実行された直前のプロセスのプロセス番号

 

バッククォート:

バッククォート「`」で括られた内容は、その中でまず実行され、結果がそれを呼び出したコマンドに渡され、それを呼び出したコマンドからはその結果もコマンドの一部として実行される。

 

例)

$ echo `date '+%Y-%m-%d+%H-%M-%S'`

2009-04-21+14-38-09

 

2

kshbashの場合、「$(コマンド)」($+単一の丸括弧)はバッククォート`」と同じ。

$ echo $(date '+%Y-%m-%d+%H-%M-%S')

2009-04-21+14-32-19

 

解凍・圧縮

bunzip2:

bz2形式で圧縮されたファイルを解凍する。

例)ファイル a.tar.bz2を解凍したい。

> bunzip2 a.tar.bz2

実行後、同一ディレクトリにa.tar.bz2ファイルがa.tarファイルに解凍される。

 

tar:

命令: 以下の中から必ず1つだけ指定しなければならない。

c tarファイルを新しく作る
x tar
ファイルを展開する
t tar
ファイルの内容を表示する
r tar
ファイルに追加する。z Z オプションと同時には使えない。

 

オプション:

f tarファイルを指定する

一見、毎回 f オプションを指定する意味がないように思えるが、本来 tar はテープドライブに書き出すコマンドなので、f でアーカイブ名を指定しないとテープドライブのデバイス /dev/rst0 を対象に読み書きしてしまう。

p パーミッションや ownergroup の情報を保存する。これは展開時にのみ影響する。

v バーボーズモード。処理内容を詳しく表示する

パーミッションなどの詳細な情報が表示されるため、はじめのうちはアーカイブ作成・展開時に tar cvf tar xvf などと v オプションを付けたくなるかもしれない。しかし、慣れてきたら v オプションを指定しないようにしよう。

C 場所を指定 ???

 

例)ファイルa.tarを展開する。

実行後、a.tarファイル内でディレクトリ形式も含めて解凍されていたファイル郡が、ディレクトリ階層も含めて展開される。

Ø       tar xvf a.tar

 

指定した場所に作成

Ø       tar cvf a.tar C /home

 

a.txta.txt.tarに圧縮

Ø       tar cvf a.txt.tar a.txt

 

tar.gz:tar.gz形式にファイルを圧縮する

Ø       tar xvzf xxxx.tar.gz

 

gzip:gz形式でファイルを圧縮・展開する

Ø       gzip xxxx (xxxx.gzが出来上がる)

Ø       gunzip xxxx.gz


tar
ファイルの内容を表示

Ø       tar tvf a.tar

 

Note) cygwin環境では、ファイルの絶対パス(DOSフォーマット)を指定しても上手く動かない場合がある。その場合、ディレクトリを移動してから相対パスを指定すると上手く動く。

 

ln:

ハードリンクもしくはシンボリックリンクの作成

 

Ø       ln <リンク元ファイル> <新規リンク>

 

ハードリンクはあるファイルの複製を作ることができるが、一度ハードリンクを作ってしまうと、本当のファイルと別名といった区別はなくなり、両方のファイルが同じi-nodeを指すようになる。

例を見よう。

 

あるファイルa.txtのハードリンクb.txtを作るには、

 

$ ln a.txt b.txt

 

この結果を見ると、

$ ls -il *.txt | sort +0

   5744850 -rw-r--r--   2 doik     staff         13 Apr  5 19:18 a.txt

   5744850 -rw-r--r--   2 doik     staff         13 Apr  5 19:18 b.txt

                     

i-node番号       リンク数

 

となり、実体のあるファイルが作られるが、a.txtb.txtともに同じi-node番号を持っていてさらにそれらのリンク数が2になっている。

これは違う名前のファイルが同じファイルオブジェクトを指していて、実際にそのオブジェクトを参照しているファイル(リンク)が現在2つあるということである。

なお、rmで削除する場合このリンク数が2以上の場合、ファイルオブジェクトの実体は削除されない。リンク数が1のときに限って、rmによってファイルオブジェクトがディスクから物理的に削除される。

 

あるファイルのシンボリックリンクを作るには、

$ ln –s abc.txt ABC

 

(オプション)

-f     すでにリンクが張られていたらリンクを付け替える

-s     シンボリックリンクを張る

 

値のコンソール出力

echo:

最も馴染み深いのはやはりechoだろう。

$ echo $SYBASE

/opt/sybase

 

コンソールに標準出力および標準エラー出力を表示しないには、出力をNULLデバイスにリダイレクトする。

$ echo a 1>/dev/null 2>&1

 

printf:

改行で悩みたくない場合は、printfも使える。

$ printf "abc"; printf "def"

abcdef

 

リダイレクション:

これもまたUNIXでは奥が深く、かつ強力なコンセプトである。よくあるリダイレクションは、

 

$ echo "hello" > hello.txt

 

とした、標準出力をファイルにリダイレクトするやり方であるが、原則は以下である。

まず、標準出力は1番、標準エラー出力は2番であると「覚える」。(ちなみに、標準入力は0番)

 

リダイレクションのフォーマットは以下である。

(source output)>&(target output)

 

もしくは、

 

(source output)>(target file)

 

である。標準出力もしくは標準エラー出力にリダイレクトする場合、>の後に&が必要となる。よく見かける>&2で、「標準エラー出力にも」と解釈しがちだが、そうではない。単に必要なのである。

また、(source output)は省略することができて、省略された場合は1、つまり標準出力がデフォルトとして採用される。

 

リダイレクションの原則として、その時点でのtargetの出力先と同じ出力先にsourceの出力先が設定されるというのが大きなポイントである。

特にリダイレクションを設定していない場合、それぞれの出力先は

1: 出力コンソール

2: エラー出力コンソール

となっているが、

 

たとえば、標準出力と標準エラー出力の両方をファイルに書き出したいとする。

$ cat error.sh

#!/bin/sh

echo "OUT"

echo "ERROR" >&2

 

この場合、

$ ./error.sh > file.txt

としても、標準出力のみがfile.txtにリダイレクトすることになる。(source outputが省略されているのでデフォルトの1、つまり標準出力がfile.txtにリダイレクトされている)そこで、

$ ./error.sh 2>&1 1>file.txt

としたいところだが(標準エラー出力の出力先を標準出力(と同一のもの)にして、標準出力の出力先をfile.txtにする)、これは実はうまくいかない。というのは、

2>&1により、

1: 出力コンソール

2: 出力コンソール

となり、2の出力先は出力コンソール(つまり画面)に設定され、

1>file.txtにより、

1: file.txt

2: 出力コンソール

と設定されたのである。よって、このままでは標準エラー出力の出力先は依然として画面である。よって、

$ ./error.sh 1>file.txt 2>&1

としなくてはならず、この場合、

1>file.txtにより、

1: file.txt

2: エラー出力コンソール

となり、2>&1により、

1: file.txt

2: file.txt

となるのである。要するに、出力先を指定する順番が肝心なのである。

 

文字列操作(編集、フォーマット、情報):

シェル変数$xの文字列を編集するには、以下の構文を使う。パターンにはワイルドカード文字を使うことができる。(*は任意の0個以上の文字、?は任意の1個の文字)

u    ${x#<パターン>}:パターンに左から最小マッチしたものを取り除いた文字列を返す。

例)x=20060201などのときに、0201だけを取り出す。

${x#????} (左から4文字取り除いたものを返す)

u    ${x##<パターン>}:パターンに左から最大マッチしたものを取り除いた文字列を返す。

例)x=abc/def/ghiなどのときに、ghiだけを取り出す。

${x##*/} (左から見て、/を探し続けて最後に見つかった/を含めた文字列を取り除いたものを返す)

u    ${x%<パターン>}:パターンに右から最小マッチしたものを取り除いた文字列を返す。

例)x=20060201などのときに、2006だけを取り出す。

${x%????} (右から4文字取り除いたものを返す)

u    ${x%%<パターン>}:パターンに右から最大マッチしたものを取り除いた文字列を返す。

例)x=abc/def/ghiなどのときに、abcだけを取り出す。

${x%%/*} (右から見て、/を探し続けて最後に見つかった/を含めた文字列を取り除いたものを返す)

 

注)Borneシェルでは使えないので、要注意。その場合は、たとえば

> echo $a | sed 's/^.*\///g'      ${x##<パターン>}、「左から最大マッチを取り除く」と同じ)

などとして上手に回避してください。

 

(サンプル)

x=20060201

year=${x%????}

mmdd=${x#????}

mm=${mmdd%??}

echo $year

echo $mmdd

echo $mm

trg="${year}-${mm}"

echo $trg

filepath=abc/def/ghi

file=${filepath##*/}

echo $file

root=${filepath%%/*}

echo $root

 

プレース展開:

{ }内に文字列をカンマ区切りで並べると、それを展開してくれる

 

例)

$ echo abc{123,456,789}def

abc123def abc456def abc789def

 

長さ:

${#x}

変数がxの場合、${#x}とするとその変数の文字列長が得られる。

 

演算:

expr:

Ø       expr 1 + 1    (+記号の前後には空白が必要)

Ø       2

他に使える記号は、
   +     加算                                    
   -     減算                                                    
   *     乗算      (ただし、*のみシェルのメタキャラクタであるため、\によるエスケープシーケンスが必要)
   /     除算                                                   
   %     剰余
   ^     べき乗
 

注)

kshbashの場合、exprの代わりに「$((演算))」($+二重の丸括弧)が使える。この括弧の中では空白は自由に入れられる。

 

標準入力読み込み:

read:

read <変数>

で変数の読み込みが可能

 

 

関数:

name()

{

}

 

case文:

case $<検証値> in          ex) $VAR

<対象値>)            ex) a)

      

       ;;

       *)                   (=default)

       ;;

esac

 

if文:

テスト([]で囲われた条件式)が真か偽かで、処理の道筋を変えることができる。

例)

aaa=123

 

if [ $aaa = "abc" ]                      #文字列の比較

then                                     

       echo "aaa is abc"

elif [ $aaa -eq 123 ]                    #数値の比較

then

       echo "aaa is 123"

else

       echo "aaa is not abc nor 123"

fi                                       #最後はfiで閉じる(いかにもUNIXらしい)

 

例2:1if)

if [ 1 = 1 ]; then echo 0; fi 

 

testが解釈できる主な条件式は以下の通り。

 

s1 = s2       文字列 s1 s2 が同じであれば真

s1 != s2      文字列 s1 s2 が同一でなければ真

s1 < s2       文字列 s1 が文字列 s2 に対し、文字の ASCII 順において前に来るなら真

s1 > s2       文字列 s1 が文字列 s2 に対し、文字の ASCII 順において後に来るなら真

n1 -eq n2     整数 n1 n2 が等しければ真

n1 -ne n2     整数 n1 n2 が等しくなければ真

n1 -gt n2     整数 n1 n2 がより大きければ真

n1 -ge n2     整数 n1 n2 より大きいか等しければ真

n1 -lt n2     整数 n1 n2 より小さければ真

n1 -le n2     整数 n1 n2 より小さいか等しければ真

true          常に真

false         常に偽

! true        常に偽

! false       常に真

 

主なファイルテスト演算子は以下の通り。

 

-f foo               ファイル foo が存在するなら真。foo がディレクトリやシンボリックリンクの場合は真にはならない。

-d foo               ディレクトリ foo が存在するなら真

-L foo               シンボリックリンク foo が存在するなら真

-e foo               ファイル foo が存在するなら真。foo がディレクトリやシンボリックリンクでもよい。(ただし、この演算子はBorneシェルにはないので注意!

-r foo               ファイル foo が存在し、読み込み可能なら真

-s foo               ファイル foo が存在し、サイズが0より大きければ真

-w foo               ファイル foo が存在し、書き込み可能なら真

-x foo               ファイル foo が存在し、実行可能なら真

-z foo               文字列fooの長さが0なら真

file1 -nt file2      ファイル file1 file2 より新しければ真 (nt newer than)

file1 -ot file2      ファイル file1 file2 より古ければ真 (ot older than)

 

条件式の結合には、

|| 論理和

&& 論理積

 

を用いる。

例)if [ $a = $b ] || [ $c = $d ]; then…

 

Ø       test –d <ディレクトリ>

Ø       echo $?

とすると、成功(ディレクトリが存在する)なら0が、失敗なら1が返ってくる。

ここは、はまりやすい。 (!のあとにスペースがいる。括弧でくくったりしてもうまく動かない)

Ø       test ! –d <ディレクトリ>

Ø       echo $?

とすると、成功(ディレクトリが存在しない)なら0が、失敗なら1が返ってくる。

 

注)Makefile内では、ifは使えない。ifeq()などの関数を用いる。

 

while:

(一定回数のループ)

i=0                                                           #i=0の間にスペースを入れるとうまくいかない

while [ $i -lt 365 ]; do

        off=`expr -9 + $i \* 24`                              #exprの後の計算式では変数の間にスペースが必要

        dt=`env TZ=JST-$off date "+%Y%m%d"`

        echo $dt

isql -STK_GDCL_D01_DS -Udbo_riskc -Pfl5ps1de -Driskc <<EOT    #ヒアドキュメント中は行の先頭にタブやスペースが入ってはならない

exec test_SensisNew_HK_lastbusdate '$dt'

go

exit

EOT

        i=`expr $i + 1`                                       #i=`exprの間にスペースを入れるとこれまたうまくいかない

done

 

(連続更新表示1行野郎)

例)AutoSysJob10秒おきに更新表示

while [ 1 ]; do clear; echo `date +[%Y/%m/%d\ %H:%M:%S]`; autorep -J GEWEB%; sleep 10; done

 

for:

(条件に該当する変数を逐次処理。イメージ的にはforeach)

例)

for files in `ls -1 *.jil`

do

grep "insert_job" $files | sed 's/insert_job/delete_job/g' | sed 's/ *job_type: c.*$//g' > $files".del"

done

などとすれば、*.jilに該当するファイル全てに対して、grep, sedを行った後、$files".del"ファイルに結果をリダイレクトすることができる。

 

行単位の処理:

コマンド:

ls -l | while read line; do

echo $line

done

 

注)上記のパイプの中でexitコマンドを発行すると、スクリプト自体のプロセスではなく、パイプに用いられているプロセスから脱出する。

その後$?をループ終了後に呼び出すと、ループ内でexitしたときに設定した終了コードを取得できる。

 

ファイル:

while read line; do

echo $line

done < file.txt

 

ヒアドキュメント:

while read line; do

echo $line

done <<END
hoge  #
このヒアドキュメント内のコマンドはファイルの行頭から始まる必要がある
fuga  #
さもないとOSはこのコマンドを読み取らない
END

 

何もしないコマンド:

:

if/then/else/fithen句内で何もしたくないことがある。そのときは「:」を使うとよい。

 

例)

if [ (test) ]

then

       :

else

       (process…)

fi

 

シェルはthen/else内に何かしらの記述がないと、シンタックスエラーで受け付けないのでこのコマンドは有用である。

 

 

コマンドの連続実行:

コマンドの連続実行を制御するために、以下の特殊文字が提供されている。

;      コマンドの区切り文字

       1行に複数のコマンドを記述できる。

( )   コマンドのグループ化(コマンドはサブシェルで実行される)

       複数のコマンドの標準出力と標準エラー出力が1つのストリームにまとめて扱われる。

{ }   コマンドのグループ化(コマンドは現在のシェルで実行される)

       複数のコマンドの標準出力と標準エラー出力が1つのストリームにまとめて扱われる。{の後と}の前にはスペースが必要。

` `   コマンドの置換

       ` `内の結果を代入できる。

&&     左のコマンドの終了値が真の場合に右のコマンドを実行

       ifを使わなくても、右のコマンドを実行するかどうかを判断できる。

||     左のコマンドの終了値が真の場合に右のコマンドを実行

       ifを使わなくても、右のコマンドを実行するかどうかを判断できる。

 

例)

$ cmd1 && { cmd2; cmd3 }

cmd1の終了値が真のとき、cmd2cmd3を連続して実行する。

 

ファイル検索:

find:

いわずと知れたfindコマンドだが、オプションの設定で快適度はかなり違う。

 

基本: find <ディレクトリ> <諸条件>

 

ディレクトリは複数指定可能。現ディレクトリはおなじみの「.」で指定。

 

(オプション)

-name <検索したいファイル名>:検索対象のファイル名を指定

> find <検索したいディレクトリ> -name <検索したいファイル名> 2>/dev/null   (エラー出力は、nullデバイスへ)

ファイル名は完全に一致していなくてはいけない。部分検索をしたい場合はワイルドカード*を使う。ワイルドカードを使う場合は、検索したいファイル名とワイルドカードを、ダブルクォーテーション(またはシングルクォーテーション)で囲う必要がある。
例)

Ø       find ./ -name "abc*.txt"

 

-atime <[-n|+n|n]>:最後にアクセスされたのが何日前なのかを指定

例)

> find ./ -name "abc*.txt" –atime 1      (1日前にアクセスされたファイルのみ抽出)

 

-ctime <[-n|+n|n]>:最後にステータスが更新されたのが何日前なのかを指定

例)

> find ./ -name "abc*.txt" –ctime +1     (1日前以前に作成されたファイルのみ抽出)

 

-mtime <[-n|+n|n]>:最後にデータが更新されたのが何日前なのかを指定

例)

> find ./ -name "abc*.txt" –mtime -1     (1日前以後に修正されたファイルのみ抽出)

 

-type f は検索対象をファイルのみにする
-type d
は検索対象をディレクトリのみにする

 

-prune 検索をその対象に限定(-oをさらに加えてその対象を除外することもできる)

例)

> find . -type d -name "logs" -prune -o -exec grep -l "its_script" {} \; (logsディレクトリ以下を除外して、its_scriptを含むファイルのみをリストアップする)

 

-exec 検索ファイルを引数としてコマンドを実行

(個人的には、このfind –execは数あるUNIXのコマンドの中でも最強の部類に属するものすごく強力なコマンドだと思う。広範囲の検索をかけた後にそのマッチした対象に対して逐一処理が実行でき、しかも1行でできてしまうというのだからもうすごいとしか言いようがない)

 

(応用)

./CVSフォルダ(とその中のファイル等)以外のファイルをすべてコピーしたい。

Ø       cp `find ../lib -type f | grep -v CVS` lib/.

 

サブフォルダのファイルもgrepしたい。

Ø       find . –name <*検索したいファイルの文字列(一部)*> | xargs grep <検索したい文字列>

xargsfindの結果出力を複数の引数として分けてから、grepに渡す。

 

Ø       find . –name <*検索したいファイルの文字列(一部)*> -exec grep <検索したい文字列> {} \;

検索したいファイルをリストアップして、-execオプションで、(grep <検索したい文字列>)を実行する。{}の場所には、検索したファイル名が入る({}は必須)

;はコマンドの終了を表すが、シェルに「;」を解釈させず、findへ「;」を渡すためにエスケープしてある。また「{}」と「\;」の間にはスペースが必要。

 

フォルダ内の条件を満たすファイルに同じ行為を実行したい。

例)ある名前に共通性を持ち、中身に同じテキストを持つものをすべてcatする。

Ø       find . –name <*検索したいファイルの文字列(一部)*> -exec grep <検索したい文字列> {} \; -exec cat {} \;

 

注){}は標準出力としては扱えない模様。つまり、以下のコマンドはうまく動かない。

Ø       find . –name <*検索したいファイルの文字列(一部)*> -exec grep <検索したい文字列> {} \; -exec cat <file> >> {} \;

たとえばある文字列を含むファイルに対してその行の下に一行追加したいなどと思ったら、、(→付録A)

 

エラーメッセージは表示したくない。

Ø       find . -print 2>/dev/null

として、標準エラー出力を廃棄すればよい。

 

 

-ls:詳細を表示

 

-user <ユーザ名>:指定したユーザが所有するファイルのみ抽出

 

-oまたは-or

検索条件をORでつなげることができる

 

-aまたは-and

検索条件をANDでつなげることができる

 

!または-not

否定の検索条件を指定する

 

コマンド履歴:

history:コマンドの履歴を表示

Ø       history

!<n>:n番目のコマンドを再実行

!<コマンドの部分文字列>:直近の部分文字列を持つコマンドを再実行

vi

今更書くまでもないのだが、最近知った便利なコマンド

[w]カーソルを次の語の先頭へ移動f

[W]カーソルを次の語群の先頭へ移動 (語群の区切りは空白)

[b]カーソルを前の語の先頭へ移動

[W]カーソルを前の語群の先頭へ移動

[e]カーソルを現在の語の末尾へ移動

[E]カーソルを現在の語群の末尾へ移動

[0]カーソルを現在行の先頭へ移動

[$]カーソルを現在行の末尾へ移動

[J]改行の削除(これ便利)

[:%s/<置換前>/<置換後>/g]で文字列の置換

特殊な例):%s/[[:cntrl:]]//gHiddenCharacterを取り除くことができる。

 

なお、タブのスペースの数など各種設定が、.exrcファイル(または.vimrcファイル)で設定可能。

 (.exrcファイルの例)

set tabstop=4

set showmode

set autoindent

set showmatch

 

ファイルや標準出力の中身などをスクロールを使って確認する場合は、moreもしくはlessを使う。

more:

単なる画面スクロール

 

less:

あるコマンドを実行結果や、ファイルの内容を見たいとき、1画面に収まりきらずスクロールしてしまって最初の部分が見えないことがある。そういう場合、

% ls -l | less

% less file.txt

などとすることでゆっくり見ることができる。

 

more ではできなかったバックスクロールに対応、他にも gzip compress で圧縮されたファイル (*.gz *.Z) を直接見ることができるなど、いろいろな機能が付け加えられている。なお、FreeBSD less は日本語を表示できないので、jless (ja-less) を使うこと。

最初に使うときは

Ø       q で終了 (more と違って、less はファイルの最後に到達しても終了しない)

Ø       カーソルキー・Ctrl-pCtrl-n で上下スクロール

Ø       <>で先頭行・最終行に移動

Ø       / で検索 (正規表現として扱われる)

ということを覚えておくとよい。大概のコマンドがviと一致しているので試してみると良い。(変な事になっても責任は取れません、スミマセン)

 

 

telnet:

syntaxは、

> telnet <host> <port>     (hostportの区切りはスペース)

 

パッケージ:

パッケージファイルによってデプロイされたアプリケーションのバージョン情報を見る。

Ø       pkginfo –l <package name>

例)

[ebondapp@tk1p1440app log]$ pkginfo -l BBExecFeed

   PKGINST:  BBExecFeed

      NAME:  BBExecFeed 1.0

  CATEGORY:  interface

      ARCH:  sun4u

   VERSION:  1.0

   BASEDIR:  /opt/ebond

    VENDOR:  DrKW

    PSTAMP:  tk1d1140app20060329121004

  INSTDATE:  Mar 29 2006 19:09

    STATUS:  completely installed

     FILES:       33 installed pathnames

                   6 directories

                   2 executables

               11396 blocks used (approx)

 

パッケージ作成:

$ pkgmk –o –r <パッケージソースディレクトリ> -d <パッケージ格納ディレクトリ> -f <パッケージプロファイル>

 

インストール:

1. gunzip

2. tar xvf

3. pkgadd

$ pkgadd [-d directory] <Package>

 

pkgadd -d /tmp TicketClipper      (パッケージのtar/tmpに解凍される場合、-dでディレクトリを指定)

 

アンインストール:

$ pkgrm <Package>

 

プロセス情報:

ps:

そのコマンドを実行したユーザが所有するプロセスを表示する。

(オプション)

-e     所有者に関係なくすべてのプロセスを表示

-f     プロセスの詳細情報を表示

 

/usr/ucb: この配下には便利なコマンドが眠っている

プロセスの状態をより詳しく見るには、

Ø       /usr/ucb/ps -auxwww|grep -i bbexec

などとすると、プロセス文字列を150文字まで取ることができる。

 

(オプション)

-a     自分が所有しないプロセスも併せて表示

-e     各プロセスが参照する環境変数を表示

-u     ユーザ関連の情報を表示

-x     制御端末のないプロセス(nohupで起動されたプロセス)も表示

-w     表示幅をワイドに。連続すれば(-ww)任意の幅を選択できる

 

(通常のpsでは、最大50文字までしかプロセス情報を入手できない)

 

例)

[ebondapp@tk1p1440app log]$ /usr/ucb/ps -auxwww|grep -i bbexec

ebondapp 26851  0.1  0.1  992  792 pts/4    S 10:00:50  0:00 grep -i bbexec

ebondapp 21636  0.0  3.313758433280 ?        S 08:15:10  0:05 java -Xms64m -Xmx256m -Doa.uselog4j=true org.openadaptor.adaptor.RunAdaptor /opt/ebond/BBExecFeed/conf/bbexecfeed.props BBExecFeed

 

秘密兵器)

上記の出力から、1行目(つまり、この結果を得るために実行したgrepプロセス)を抜きたい場合、

 

[ebondapp@tk1p1440app log]$ /usr/ucb/ps -auxwww|grep -i [b]bexec

 

とすればよい。[b]bexec*bbexec*と正規表現マッチするため、"[b]bexec"とは、マッチしないのである。

 

注)

なお、どんなに消しても消えない(あるいは似たような名前で再生してしまう)ファイルがある場合、プロセスがまだ走り続けている場合がある。

ファイル名例)

.nfsXXXX      XXXXは文字や数字)

その場合は、psなどでプロセスを特定し、killすればファイルもいなくなる。

 

ptree:

プロセスIDのツリーを表示できる。

 

シェルスクリプトの起動:

通常実行可能スクリプトファイルは,

Ø       ./hoge.sh

などとして起動するが、

Ø       sh hoge.sh

も可。さらにデバッグモードの指定もできて、

Ø       sh –x hoge.sh

とすると、シェル変数や実行するステートメント等がコンソールに出力される。

 

ksh:

-a 値が代入されたときに変数をエクスポートするよう、変数にフラグをつける

-f

 

man:

便利なオプション

-a     登録されているすべてのマニュアルを一度に表示

-l     登録されているコマンドのリストを表示

-s     セクションを指定

$ man –s 1b ps

とすると、通常のpsではなく、/usr/ucb/ps(セクション1b )のマニュアルが見れる

 

grep:

grepはオプションを使いこなさなければその威力の一割くらいしか使っていないんでしょう。是非ぜひ覚えましょう!

-v <文字列> この文字列を含まないファイルを検索

-e <文字列> 検索文字列に指定。複数の文字列を検索対象にしたい場合に必要。

-n            ファイルの行番号を表示

-i <文字列> 文字列の大文字小文字を区別しない。

-l            ファイル名を表示

-A num        マッチした文字列の後に続く num 行を表示する(Solarisにはないようだ。。。)

-B num        マッチした文字列の前の num 行を表示する(Solarisにはないようだ。。。)

-c <文字列> この文字列が出現した回数を表示

-s            通常対象が存在しない場合に出力されるエラーメッセージを表示しない

 

/user/xpg4/bin/grepなら以下のオプションも使える。

-q <文字列> この文字列を含む場合"0"、含まない場合"1"をシェル特別変数"$?"に返す。(grepの結果によってスクリプトの戻り値を変えたいときなどに便利。例えばisqlSQLの結果がどうであれ常に0(成功)を返すので、outputファイルの中身をgrepしてERRORなどが検出された場合に、スクリプトは1を返すようにするとか)

 

sed:

文字列の置換を行う。

s/aaa/bbb/という書式で文字列aaaを文字列bbbに置換する。

例)

$ cat file

aaa

bbb

ccc

ddd

のとき、

 

$ sed 's/aaa/X/' < file

X

bbb

ccc

ddd

 

aaaの部分には正規表現が使える。

$ ls | sed 's/[a-z]/X/'

 

sedは通常各行に対して、最初に見つかった文字列しか置換を行わないが、s/abc/ABC/gとして3個目のスラッシュ(/)の後にgを付けると、全ての該当する文字列を一度に置換することができる。

$ cat file | sed 's/abc/ABC/g'

 

また、\(\)で囲んだ部分は、置換文字列内で\数字として後方参照することができる。

つまり、\(\)で囲んだ部分は、後ろに現れる\1,\2,\3,…で(更に)置き換えることができるのだ(すごい!)

注)この\(\)の書式はまだ完全につかめていない。どうも挿入をしているようにも見えるが、もう少し研究が必要だ。

 

sedの正規表現と置換後の文字列を囲う部分はシングルクオートで囲む必要があるのだが、例えば置換後の文字列にシングルクオートを含めたいような場合問題が生じる。sed2番目のシングルクオートを囲いの終わりと判断してしまうのである。これを回避するには、正規表現と置換後の文字列をダブルクオートで囲う。そうすると、シングルクオートが普通の文字列として解釈される。

$ cat file | sed "s/ *\t* *$/',/g" (文末のスペース、タブ、スペースを取り除き、「',」を文末に挿入する)

 

例)

autorepの出力(これはAutoSysのサービスだが(catlsなど)何にでも応用可能)からdelete_job:のスクリプトを作成。

 

autorep -j GEWEB% -q | grep insert_job | sed s/insert_job/delete_job/g | sed 's/job_type: [bc]//g' | sed 's/^  //g' | sed 's/ *$//g' > GEWEB_delete_job.jil

 

それぞれのsedは、

@       insert_jobdelete_jobで置換

A       job_type: b又はcを除去

B       行頭にある2つのスペースを除去

C       行末にあるスペース(長さは何でも)を除去

 

こんなに簡単にできるんだ〜〜〜。すげーーー。

 

ちなみに例えばデータベースフィールド名がtrade_typeなどとなっていて、これをJavaスタイルのtradeTypeに変えたいと思ったときにアンダースコア(_)とその直後の小文字を大文字1文字に一括して変換する方法が今のところわからない。

しかたなくsedを使って、

 

cat file |

sed 's/_a/A/g' |

sed 's/_b/B/g' |

sed 's/_c/C/g' |

sed 's/_d/D/g' |

sed 's/_e/E/g' |

sed 's/_f/F/g' |

sed 's/_g/G/g' |

sed 's/_h/H/g' |

sed 's/_i/I/g' |

sed 's/_j/J/g' |

sed 's/_k/K/g' |

sed 's/_l/L/g' |

sed 's/_m/M/g' |

sed 's/_n/N/g' |

sed 's/_o/O/g' |

sed 's/_p/P/g' |

sed 's/_q/Q/g' |

sed 's/_r/R/g' |

sed 's/_s/S/g' |

sed 's/_t/T/g' |

sed 's/_u/U/g' |

sed 's/_v/V/g' |

sed 's/_w/W/g' |

sed 's/_x/X/g' |

sed 's/_y/Y/g' |

sed 's/_z/Z/g'

 

とかやってますが、もっといい方法があったら誰か教えてください。

 

sedの置換対象文字列に環境変数を指定するには以下のトリックを用いる。

$ sed s/xxx/`echo $aaa`/g

 

別解)環境変数置換はこちらの記述でも可能。

$ sed 's/xxx/'$aaa'/g'

 

局面によってはどちらかしか適用出来ない事も有るかもしれないので、2つとも頭の片隅に入れておいて損は無かろう。

 

sedを用いた文字の、行頭と行末のトリミング(triming)も可能。

>  echo `echo "   aaa   " | sed 's/^ *//;s/ *$//'`

aaa

 

od:

オクタルダンプを表示する。ファイル内の文字をバイトコードで読むことができる。(なんてコマンド知ってるんだ、アンダースは。。)

 

(オプション)

-c     ファイルの内容を1バイトごとにアスキーコードで表示する。(行末の改行文字の検査などに重宝します)

-o     ファイルの内容を1バイトごとに8進数で表示する。

-x     ファイルの内容を1バイトごとに16進数で表示する。

 

alias:

コマンドエイリアスを設定、表示する。

例)

$ alias ls='ls -p'

 

groups:

自分の所属するグループを見る

 

chgrp:

ファイル等の所属するグループを変更する。

 

umask:

ファイル新規作成時の禁止ビットを指定もしくは変更する。(ただし実行権限は新規作成時には決して与えられないので、対象にはなっていない)

通常新規ファイルは、

 -rw-r--r—

として、作成される。これを8進数に変換すると(先頭一桁目はファイルタイプなので無視)、

  420|400|400|

つまり、

 644

となる。このとき、umaskは、

bash-2.03$ umask

022

となっているはずである。最も大きな権限を666とした場合、umaskはそこから引くべき数字(この場合022、つまり、----w--w-)を決定しているのである。

 

sudo:

スーパーユーザの権限でコマンドを実行

 

$ sudo <コマンド>

この後パスワードを聞かれ、正確に入力した後実行しているユーザがそのコマンドに対してsudoの権限を持つ場合、コマンドが実行できる。

 

su:

スイッチユーザ。あるユーザに成り代わる。

$ su <user name>

または

$ su - <user name>

"-"があるとそのユーザのプロファイルもロードする。

 

passwd:

パスワード操作コマンド。自分のパスワードを変更するときなどに使う。

なお、パスワードの情報は、/etc/passwdファイルに格納される。

/etc/passwdファイルに格納されるパスワードの情報は、一部の場合もある。その場合残りの情報は/etc/shadowファイルに格納される。

この場合shadowファイルには暗号化された、

-               ログイン名

-               暗号化されたパスワード

-               1970年1月1日以降、パスワードが最後に変更された日までの日数

-               パスワードを変更してもよくなる日付までの日数

-               パスワードを変更しなくてはならない日付からの日数

-               パスワードが有効期限切れになる前にユーザに通知を送る場合の有効期限切れ日までの日数

-               パスワードが有効期限切れになり、アカウントが使用不可能になった後の有効期限切れ日からの日数

-               1970年1月1日以降、アカウントが使用不可能になった日までの日数

-               予約フィールド

 

 

sort:

文字列のソート

(オプション)

+数字 指定の数のフィールドに従ってソート。

-u     同一内容の行は1度しか表示しない。

-n     文字列でなく、数字とみなしてソート。

-c     すでにソートされているか調べる。

-f     大文字と小文字の区別をしない。

-r     逆順にソート

 

ファイルをサイズ順にソートしたい。

lsで出来そうだが、残念ながらPOSIXlsにはそのオプションはない。

この場合、sortをパイプで繋げて実現する。

> ls –l | sort +4    4ls –lでファイルサイズが表示されるフィールド。先頭は0

 

uniq:

重複する文字列を取り除く

(オプション)

-c     結果とともに重複していた回数も表示

 

ssh:

別のマシンにログイン、もしくは別のマシンでコマンドを実行

かつては、rshでこれを実現していたが、rshはセキュリティに問題があるので、sshで置き換えられた。

(オプション)

-n     stdinからの入力を遮断する(stdin/dev/nullにリダイレクトすることで実現)

sshをバックグラウンドで実行するときは必須のオプション。(パスワード等の入力ををフォアグラウンドで行わせないようにするため)

 

ping:

検査したいマシンが応答するか確認

(オプション)

-a     IPアドレスからホスト名を解決する。

 

ftp:

おなじみファイル転送プロトコル。

(コマンド)

$ !ls (ローカルディレクトリのls)

 

nslookup:

DNSエイリアスの登録や有無の確認ができる 

 

例)

$ nslookup

> <ホスト名>
Server:  tkxxxxx.tokyo.com                                # DNS server
Address:  10.zzz.134.xx

 

Name:    <ホスト名>.tokyo.com                        # Host name
Address:  10.zzz.134.yyy                                   # IPAddress
Aliases:  <DNS
エイリアス名>.tokyo.com          # DNS Alias

 

netstat:

通信中のTCPコネクションの調査が出来る。ローカルマシンのTCP/IPプロトコルスタック上で現在アクティブなTCP通信の状態(IPアドレス、ポート番号)を表示することが出来る。

http://tkplanning.ddo.jp/netstat.htm

 

$ netstat -an

 

lsof:

使用中のポート番号を使っているプロセスを表示することが出来る。

例)

$ /opt/IBtools/S28/lsof -i :5005

 

なお,lsofが使えないときは、以下のコマンドで代替可能。

$ for p in `ps -ef | awk '{print $2}'`;do pfiles $p | grep 5005;if [ $? -eq 0 ]; then echo $p is using 5005;fi;done

 

ifconfig:

IPアドレス等、ネットワーク情報の確認ができる。

[root@localhost root]# ifconfig
eth0 Link encap:Ethernet HWaddr 00:00:C0:E4:xx:xx
inet
addr:192.168.0.3 Bcast:192.168.0.255 Mask:255.255.255.0
UP BROADCAST NOTRAILERS RUNNING
MTU:1500 Metric:1
RX packets:114 errors:1 dropped:0 overruns:0 frame:0
TX packets:82 errors:1 dropped:0 overruns:0 carrier:1
collisions:0 txqueuelen:100
RX bytes:13211 (12.9 Kb) TX bytes:8101 (7.9 Kb)

ethx        インターフェース名(NIC)上記の例では、二枚のNICが存在を意味する

addr        IPアドレス NIC毎にユニークな値が必要

HWaddr       MACアドレス NIC毎にユニークな値となっている(変更不可)

Bcast               ブロードキャスト サブネット上のシステムは全て同じブロードキャストアドレスである必要がある

Mask         サブネットマスク アドレスクラス形式に基づく値

Link encap カプセル化されたデバイスの種類 Ethernet」「Local Loopback」「Point-Point Protocol」等もある

MTU          転送できるパケットサイズの上限

Metric              インターフェース・メトリック値

RX packets 受信したパケット数 errorsは、エラー。droppedは、破棄。overrunsは、処理が間に合わなかったパケット個数

TX packets 送信したパケット数

collisions 衝突(コリジョン)の回数

txqueuelen 送信キューの長さ

RX bytes     受信したバイト数 TX bytes 送信したバイト数

 

xargs:

標準入力から複数行の引数を読み込み、それらを複数の引数として指定のコマンドに渡し、実行する。

 

例を見たほうが早い。

$ ls
doi.txt  myfamily.sh

 

$ cat doi.txt
Kotaro
Akiko
Hinako
Yuiko

 

$ cat myfamily.sh
#/usr/bin/bash
echo $#

 

$ cat doi.txt | xargs myfamily.sh
4

catで出力されたdoi.txtの内容が、myfamily.shに複数の引数(この場合4つ)としてmyfamily.shに渡されていることが確認できる。($#特殊変数は引数の数を表す)

 

(オプション)

-I{}   後方の{}と組み合わせることで引数の配置を変更できる。

例)

$ cat doi.txt | xargs -I{} touch {}.txt

mkdir:

新しいディレクトリを作成する。

(オプション)

-p     上位のディレクトリがなくとも目的とするディレクトリを強制的に作成する。

 

rmdir:

ディレクトリを削除する。

 

cp:

ファイルをコピーする。

(オプション)

-p     中身だけでなく属性もすべてコピーする。

 

ls:

ディレクトリの中身をリストアップする。

(オプション)

-a         隠しファイルも表示

-l          ファイル名とそのファイルの属性も表示

-t          ファイルを時刻順にソートして表示

-r          ファイルのソート順をさかさまにして表示

-p     ディレクトリの末尾には"/"をつける

-i     i-node番号も表示(inodeとはファイル、ディレクトリなどのファイルシステム上のオブジェクトに関する基本情報が格納されるところ。i-node番号はそのオブジェクトにつけられた一意な番号)

-u     修正された日時ではなく、最後にアクセスされた日時を表示

-1     出力を逐一改行して1行ずつ表示

 

cd:

ディレクトリを移動。(change directory)

(オプション)

-      直前にいたディレクトリに戻る

 

pushd:

現在いるディレクトリを記憶しつつ、別のディレクトリに移る。

Ø       pushd <ディレクトリ>

 

popd:

pushdで記憶しておいたディレクトリに戻る。

Ø       popd

 

dirs:

pushdで記憶しておいたディレクトリを表示する。

 

uname:

現在のシステム名(OSのバージョンやCPUの型番等)を表示する。

(オプション)

-a     基本的な情報をすべて表示する。

 

date:

現在のシステム時刻を表示する。

例)

> echo `date "+[%y/%m/%d %H:%M:%S]"`

> echo `date "+(%y/%m/%d %H:%M:%S)"` Cシェルで[を使えるやり方があれば知りたい)

> printf "`date \"+[%y/%m/%d %H:%M:%S]\"`\n"    printfは引数を″″でくくる必要があるが、中のdateでも必要なのでそれは\でエスケープシーケンスしておく。

とすれば、フォーマットされた時刻を表示

 

日付のオフセット

> env TZ=JST-9 date dateと同じ。なので、これを用いて

> env TZ=JST+15 date とすれば1日前(24時間前:-9+24=15)の時刻を表示させることができる

 

nohup:

ログアウトしても処理を中断させない。

Ø       nohup command &

 

tee:

あるコマンドの出力をパイプを使って他のコマンドに渡したいが、画面にも表示したい、という場合、tee を使う。(個人的にはこのコマンドがもっとも萌えます)

Ø       make 2>&1 | tee make-log

-a 上書きではなく、追加(append)したいときに指定

-i 割り込みを無視する

 

file:

指定されたファイルを解析し、ファイルの種類を表示する。

コアファイルを指定すると、元のプログラム名を知ることもできる。

またテキストファイルの改行にLF(\n)またはCRLF(\r\n)のどちらを使っているかを教えてくれたりする。(実際には、CRLFのときのみそれを表示する)

しかし、解析にファイルの一部の情報のみを使うため、テキストファイルの場合など間違えることもあるそうだ。

-z 指定ファイルが、圧縮ファイルの場合、伸張して解析する。

-L シンボリックリンク先のファイルを解析する。

 

du:

ディスク使用量を再帰的に表示。

-a ファイルも含めて表示

-c 合計を表示

-k キロバイト単位で表示(デフォルトはブロック単位512B

-d <ディレクトリ> そのディレクトリのみ再帰的に表示

> du –d mydoc/ -akc

 

df:

ファイルシステムごとに、デバイス名、全容量、使用容量、残り容量、使用割合、マウント先を表示する。

-k 512バイト単位ではなく、1キロバイト単位で表示

 

fuser:

ファイルを使用しているプロセスを表示

-u 使用しているユーザ名も表示

> fuser –u a.txt

 

uptime:

システムが何時間起動しているかを表示

 

env:

コマンドの起動時に環境変数を指定する。

 

$ env [ -i | - ] [name=value … ] [ utility [ arg … ] ]

-i ですでに指定されている環境変数を一切無視する

name=valueで今回実行するutilityの環境変数を指定

argにはutilityに渡される引数を指定

 

単独でenvとすると環境変数の一覧が表示される。これはprintenvによっても実現できる。

 

ldd:

ダイナミックライブラリがどのファイルを参照しているかを表示させることができる。

 

jobs, bg, fg:

ジョブ操作コマンド

tail:

あるファイルの末尾の一部を表示し、かつその後の更新を継続的に表示するには、

Ø       tail –f <ファイル名>

Solarisで末尾の出力行数を指定するには、

Ø       tail –100 <ファイル名>

 

dircmp:

ディレクトリの中身の違いを表示。

 

cut:

文字列の抽出にはcutを使う。

各行から「n文字目からm文字目」、「nフィールド目からmフィールド目」といった形に文字列を切り出す。

 

$ cut –c<num1>-<num2>

       <num1>: 切り取り始める文字

       <num2>: 切り取る文字数

 

$sting=yes

のとき、先頭1文字を切り取りたければ、

$ echo $string | cut –c1-1

 

(オプション)

-f            フィールド数で指定(デフォルトのフィールド区切りはタブ)

-d <str>      区切り文字として<str>を指定(デフォルトのフィールド区切りはタブ)

Ø       cut –f2-6 –d','      (2番目のフィールドから6番目のフィールドまで、区切り文字は','(カンマ))

 

wc:

ファイルの行数、単語数、サイズを表示する。

 

nl:

ファイルの内容を行数付きで表示する。cat –nでも同様のことが実行できる。

 

dirname:

パス名+ファイル名からファイル名を削除する。

例)

$ dirname /foo/hoge/abc.txt

/foo/hoge

応用例)

$ cd ` dirname /foo/hoge/abc.txt`

で、/foo/hogeに移動できる。

 

split:

ファイルの分割を行う。結合はcatで。

(オプション)

–l <num>      num行ごとに分割。

$ split –l 60000 hoge hoge hoge.aa, hoge.ab, … 60000行ごとに作られる。

 

(復元方法)

$ cat xaa xab xac > original

 

cksum:

ファイルのチェックサムを求める。

例)

$ cksum g-tfxtradefeed-doikota.pfx

2489503588 4128 g-tfxtradefeed-doikota.pfx

⇒ チェックサムは2489503588、ファイルサイズは 4128、ファイル名は g-tfxtradefeed-doikota.pfx

 

typeset:

シェル変数に型と特性を割り当てる。(どうやらとっても便利そう

 

setuid/setgid: ファイルの実行権限の一種

プログラムを起動するユーザの権限とは別の権限でプログラムを動作させることが可能。

- setuid ビットがセットされたプログラムは,その実行ファイルの所有ユーザ権限で動作する

- setgid ビットがセットされたプログラムは,その実行ファイルの所有グループ権限で動作する

 

具体的には、

$ more setuid_test.c

#include <sys/types.h>

#include <sys/stat.h>

#include <fcntl.h>

#include <stdlib.h>

 

int main(void);

 

int main(void) {

 

               int fd;

 

        /* create a file */

               fd = creat("setuid_test.out", 0644);

                       if(fd!=-1) close(fd);

}

 

という内容の実行ファイルをdoikユーザが所有しているとし、

       -rwxr-xr-x   1 doik     staff       6304 Feb  1 13:17 setuid_test*

 

上記の実行権限の元でebondappユーザがこのスクリプト実行すると、

-rw-r--r--   1 ebondapp staff          0 Feb  1 13:20 setuid_test.out

 

というファイルが作成される(所有者はebondapp。これが普通)

これに対して、下記のコマンドをdoikユーザが発行することによりsetuid/setgidビットの設定が可能。(なお、このコマンドの発行者は実行権限を持っている必要がある)

$ chmod ug+s setuid_test

 

とすると、このファイルの権限が以下のように変更される。

       -rwsr-sr-x   1 doik     staff       6304 Feb  1 13:17 setuid_test*

          ↑↑

     setuid setgid

 

この権限の元、ebondappユーザがこのスクリプトを実行すると今度は、

       -rw-r--r--   1 doik     staff          0 Feb  1 13:25 setuid_test.out

 

というファイルが作成され、所有者がdoikになっている。これはすなわち、この実行ファイルがebondappユーザの実行権限ではなく、doikユーザの実行権限で動作したことを意味する。

 

注)シェルスクリプトにはこれは当てはまらないようだ。シェルスクリプトの中のコマンドは依然として、実行ユーザの権限で動作する。

 

mailx:

UNIX環境にてe-mailを発信および受信するユーティリティ。

使用例)

$ mailx –s <Subject> <Attention> < <Contents>

-s で題を指定し、Attentionで送付先を指定し、<Contents>をファイルからリダイレクトすることで内容を決定する。

 

tr:

文字の置換を行う(文字列ではないことに注意)

$ tr a b < file

file中のabに置き換える。

$ tr abc def < file

file中のadに、beに、cfに置き換える。abcdefに置き換えるのではない。

 

(オプション)

-d <文字>     で指定した文字をすべて取り除くことができる。

 

基本的に、普通に文字列を置換したいのならsedawkperlを使いましょう。。。

(なんだ、つまんないの。。。というのはまだ早い!)

 

しかし!!!!!

実はtrにはsed、(awkPerlは試してませんが)にはできない凄い機能が備わっているのである!

なんとtrは、8進数キャラクタコード(\012:改行など)、およびコントロールコード(\n:改行など)の置換や削除ができるのだ!!!

 

たとえば細切れになってしまっているテキスト

Hel

lo Wo

rld.

Hello World.

にしたいときに、ものすごい強力である。

 

例)

cat <file> | tr –d "\n"

 

DOSフォーマットの改行記号^M0x0D 0x0A)は、

cat <file> | tr –d "\n"| tr –d "\r"

 

(参考)キャラクタコードを載せてくれているページ

http://suto3.mo-blog.jp/nashita/2005/08/ascii__0eed.html



getopt:

http://freebsd4-jman.kandk.co.jp/1/getopt.1.html

 

自作例)

$ more ./mygetarg.sh

echo $1 $2 $3

args=`getopt fc: $*`

set -- $args

for i

do

        case "$i"

        in

        -f)

                echo flag $i set;

                shift;;

        -c)

                echo carg is "'"$2"'"; carg="$2"; shift;

                shift;;

 

        --)

                shift;

        esac

done

echo $carg

exit 0

 

getopts:

http://www.hpc.cs.ehime-u.ac.jp/~aman/linux/bash/comm_defvar.html

 
(記述例)
while getopts ":i:m:d:" opt
do
         case $opt in
         i ) ARG_I =$OPTARG ;;
         m ) ARG_M =$OPTARG ;;
         d ) ARG_L =$OPTARG ;;
         \? ) echo "Invalid Option!" >&2
                 echo "    -i <I >" >&2
                 echo "    -m <M >" >&2
                 echo "    -d <L >" >&2
                 exit 1 ;;
         esac
done
shift  $(($OPTIND - 1))

 

一番目の引数":i:m:d:"の中にある一番初めの":"(コロン)は、無効なオプションが指定された場合に、getoptsのデフォルトのメッセージが表示される代わりに、\? )のところの処理に入るよう指示するものである。これが指定されないと、optには"?"が格納され、デフォルトのメッセージが表示される。

2個目以降の":"(コロン)は、そこに引数が来ることを意味し、この場合-iの後ろの引数の値は、OPTARG変数に格納される。

 

二番目の引数optは、指定されたオプションが格納される変数である。これをcase文で処理していく。(ただし、"-"は含まれない)

 

最後のshiftは、スクリプトにオプション以外の引数($1, $2, ...)を正しく受け取るように指示している。なお、OPTIND変数には次に処理する引数の番号が格納されている。二重括弧は、この文が算術演算式であることを示す(Borneシェルでは動かなかった、、)。

 

set:

実行中のシェルの環境変数の特徴を定義しなおす

 

(オプション)

-e 実行したコマンドが0以外の値を返した場合、ただちに現在実行中のプロセスを終了する

 

 

(付録A)

おまけ

Windows

ipconfig /displaydns:

そのマシン上でキャッシュされているDSNエイリアスの一覧が表示可能。

 

ipconfig /flushdns:

そのマシン上でキャッシュされているDSNエイリアスをDNSサーバが保持する最新のものに更新。

 

Display

export DISPLAY=${SSH_CLIENT%% *}:0.0

として、DSIPLAY環境変数をSSH_CLIENT環境変数を用いて設定することでX-windowの出力先を自分の端末にフォワードできる。