久々に1時間30分を目安にまとめてみたが、時間が足りずまとまらなかった。OTR
: ヌルコマンド
ヌルコマンドは動作は何もしないが、終了ステータスとして0を返す。
また、引数に変数をしていすると、変数をセットすることが可能。
この変数セットの使い道は、echoコマンドで変数をセットすると
値を標準出力に表示してしまう。しかし、ヌルコマンドを使えば、
表示せずに設定だけを行うことができる。

ヌルコマンド : の実行例
dorayaki@[~/study/shell_scrpt]$ : ${VAR:=abc}
dorayaki@[~/study/shell_scrpt]$ echo $VAR
abc
dorayaki@[~/study/shell_scrpt]$ : ${VAR:=123}
dorayaki@[~/study/shell_scrpt]$ echo $VAR
abc
dorayaki@[~/study/shell_scrpt]$

ヌルコマンドを使わずにechoコマンドを使うとこうなる。
dorayaki@[~/study/shell_scrpt]$ echo ${VAR:=123}
abc
dorayaki@[~/study/shell_scrpt]$

ヌルコマンドを使ったファイルの初期化
dorayaki@[~/study/shell_scrpt]$ : > foo
dorayaki@[~/study/shell_scrpt]$ cat foo
dorayaki@[~/study/shell_scrpt]$ ls > foo #lsの内容をfooに書き込んでいる
dorayaki@[~/study/shell_scrpt]$ cat foo
2-6-1.sh*
append.sh*
bk_q.sh*
foo
mmm.sh*
nnn.sh*
test1
test2
dorayaki@[~/study/shell_scrpt]$ : > foo
dorayaki@[~/study/shell_scrpt]$ cat foo
dorayaki@[~/study/shell_scrpt]$

これと同じ効果を持つ例(/dev/nullを使ったもの)
dorayaki@[~/study/shell_scrpt]$ cp /dev/null foo
dorayaki@[~/study/shell_scrpt]$ ls
2-6-1.sh* Makefile append.sh* bk_q.sh* foo mmm.sh* nnn.sh* test1 test2
dorayaki@[~/study/shell_scrpt]$ cat foo

dorayaki@[~/study/shell_scrpt]$ cat /dev/null > bar
dorayaki@[~/study/shell_scrpt]$ cat bar
dorayaki@[~/study/shell_scrpt]$

evalコマンドについて
evalコマンドは変数の置換や、コマンドの置換、ワイルドカードの展開などを
1行のコマンドで一辺に展開するコマンド。
また、引数に実行できる形式の引数を指定するとそのまま実行する。

evalコマンドの実験
dorayaki@[~/study/shell_scrpt]$ VAR1=value
dorayaki@[~/study/shell_scrpt]$ VAR2=VAR1 #VAR2からvalueを表すには2回置換が必要
dorayaki@[~/study/shell_scrpt]$ echo $"$VAR2"
VAR1
dorayaki@[~/study/shell_scrpt]$ echo $$VAR2
6042VAR2
dorayaki@[~/study/shell_scrpt]$ echo $'$VAR2'
$VAR2
dorayaki@[~/study/shell_scrpt]$ echo \$$VAR2
$VAR1
dorayaki@[~/study/shell_scrpt]$ eval echo \$$VAR2
value
dorayaki@[~/study/shell_scrpt]$ eval echo $"$VAR2"
VAR1
dorayaki@[~/study/shell_scrpt]$ eval echo $'$VAR2'
VAR1
dorayaki@[~/study/shell_scrpt]$

引数に実行できる形式を吐くresizeコマンドを使用しての例
dorayaki@[~/study/shell_scrpt]$ resize
COLUMNS=125;
LINES=17;
export COLUMNS LINES;
dorayaki@[~/study/shell_scrpt]$ eval `resize`
#これでCOLUMNSとLINESを環境変数にセットできた。
dorayaki@[~/study/shell_scrpt]$

証拠
dorayaki@[~/study/shell_scrpt]$ resize
COLUMNS=125;
LINES=17;
export COLUMNS LINES;
dorayaki@[~/study/shell_scrpt]$ eval `resize`
dorayaki@[~/study/shell_scrpt]$

リダイレクションについての注意
リダイレクト処理は左から右へと処理される。

command > /dev/null 2>&1
これは標準出力、標準エラー出力ともに、/dev/nullへリダイレクトされている。
しかし、順序を間違って、
command 2>&1 > /dev/null
と書くと、普通の実行結果だけが/dev/nullに書き込まれている。
(command 2>&1の時点で標準エラーが端末に表示されてしまう。)

execコマンドについて
execコマンドは新しいプロセスを作らずにカレントシェルのプロセスと
置き換えて、引数のコマンドを実行させる。このコマンドを実行したら
もとのシェルに戻ることはない。

fooの中身
#!/bin/sh
exec ls -l
echo abc
2行目を実行した時点でfooスクリプトのプロセス自体がlsコマンドの
プロセスと置き換わっているのでechoコマンドが実行されることはない。

証拠の実行結果
dorayaki@[~/study/shell_scrpt]$ ./foo
合計 40

  • rwxr-xr-x 1 dorayaki dorayaki 154 2007-03-07 23:06 2-6-1.sh
  • rw-r--r-- 1 dorayaki dorayaki 20 2007-03-16 14:27 Makefile
  • rwxr-xr-x 1 dorayaki dorayaki 118 2007-02-28 19:06 append.sh
  • rwxr-xr-x 1 dorayaki dorayaki 62 2007-02-28 20:24 bk_q.sh
  • rwxr-xr-x 1 dorayaki dorayaki 30 2007-03-16 15:14 foo
  • rwxr-xr-x 1 dorayaki dorayaki 84 2007-03-01 23:39 mmm.sh
  • rwxr-xr-x 1 dorayaki dorayaki 43 2007-03-01 23:26 nnn.sh
  • rw-r--r-- 1 dorayaki dorayaki 410 2007-03-16 15:03 stdout
  • rw-r--r-- 1 dorayaki dorayaki 5 2007-02-28 19:03 test1
  • rw-r--r-- 1 dorayaki dorayaki 10 2007-02-28 19:06 test2

dorayaki@[~/study/shell_scrpt]$

execコマンドとリダイレクション
dorayaki@[~/study/shell_scrpt]$ echo abc
abc
dorayaki@[~/study/shell_scrpt]$ exec > /dev/null
dorayaki@[~/study/shell_scrpt]$ echo abc
dorayaki@[~/study/shell_scrpt]$ cat noexist
cat: noexist: No such file or directory
dorayaki@[~/study/shell_scrpt]$