uspTukubaiコマンドに関する様々な資料がここにあります。

 

 

魂内検索

DOCUMENTS

COMMAND

FORUM

UEC DOCS

VIDEO

 

ABC順リスト |  カテゴリ別リスト

(動画教材準備中)

run

<概要>

run:シェルスクリプトの特定範囲だけを実行するデバッガ。

<書式>

Usage: run [option] "<対象SHELL 引数...>" [<開始行>-<終了行>]

option一覧:
  --log <ファイル名>   ログ出力先を変える。
  --var <変数名>=<値>  変数代入値を差し替える。
  --break <行数>       ブレークポイントを入れる。
  --debug              run自身のdebug情報を出力する

使い方例:
  run SCRIPT                      # SCRIPTをそのまま実行
  run "SCRIPT A B"                # SCRIPTに引数を与えて実行
  run SCRIPT 4-6                  # SCRIPTの4~6行目を実行
  run --log errlog                # 出力ログを"errlog"に保存
  run --var tmp=$$                # 変数tmpに$$を代入($$は固定される)
  run --var dir=/home/usp,tmp=142 # 複数の変数に代入。
  run --break 15,19,20 SCRIPT     # 15,19,20行目にブレークポイントを入れる。

<説明>

<SCRIPT>の中で一部分だけを取り出して実行します。長いシェルスクリプト
をデバッグする時、処理時間が掛かる前処理を何度も繰り返したくない時に
後半部分の処理だけを何度も繰り返し実行することが出来ます。

<例>

シェルスクリプトだけをrunで指定すると、エラー出力も含めて実行されま
す。元のシェルスクリプトの bash オプションに -vx が無くても、それを
含めて出力されます。

$ cat hoge.sh
1: #!/bin/bash
2:
3: echo a
4: echo b
5: echo c

$ run hoge.sh
#!/bin/bash

echo a
+ echo a
a
echo b
+ echo b
b
echo c
+ echo c
c

<例>

エラーログを吐き出す先を指定することも出来ます。

$ cat hoge.sh
1: #!/bin/bash
2:
3: echo a
4: echo b
5: echo c

$ run --log errlog hoge.sh
a
b
c

$ cat errlog
#!/bin/bash

echo a
+ echo a
echo b
+ echo b
echo c
+ echo c

またエラーログが要らなければ、捨てることも出来ます。

$ run --log /dev/null hoge.sh
a
b
c


<例>

引数を指定したいときは、ダブルクォーテーションで括ります。

$ cat hoge.sh
1: #!/bin/bash
2:
3: echo a
4: echo $1
5: echo $2

$ run --log /dev/null "hoge.sh x y"
a
x
y

<例>

実行行数を指定すると、その行だけが実行されます。

$ cat hoge.sh
1: #!/bin/bash
2:
3: echo a
4: echo $1
5: echo $2

$ run --log /dev/null "hoge.sh x y" 3-4
a
x

<例>

指定した行数以外、変数宣言行だけは必ず実行されます。以下の例のように
5~6行目だけ指定しても、変数宣言している2~3行目は有効になります。
変数宣言が実行されないと正常に動作しないことが多いためです。

$ cat hoge.sh
1: #!/bin/bash
2: b=bbb
3: c=ccc
4:
5: echo a
6: echo $b
7: echo $c

$ run --log errlog "hoge.sh x y" 5-6
a
bbb

<例>

varオプションを使えば変数宣言部を書き換えることが出来る。特に以下の
例のようにtmpに$$を使って書き換えると、$$ がログインシェルのPIDにな
るため、tmpの中身が固定化される。

$ cat hoge.sh
1: #!/bin/bash
2:
3: tmp=/tmp/tmp_$$
4:
5: echo $tmp

$ run --log errlog --var tmp=/tmp/tmp_$$ hoge.sh
/tmp/tmp_1401
$ run --log errlog --var tmp=/tmp/tmp_$$ hoge.sh
/tmp/tmp_1401


<例>

以下のように、複数の変数を変更することも出来る。

$ cat hoge.sh
1: #!/bin/bash
2:
3: tmp=/tmp/tmp_$$
4: dir=/home/usp/HOGE
5:
6: cat $dir/hoge > $tmp-aa

$ run --var dir=/home/usp,tmp=/tmp/tmp_$$ hoge.sh 6-6

<例>

--debugオプションを付けるとシェルスクリプトは実行されず、設定情報と改変後のシェルスクリプトが表示される。

$ cat hoge.sh
1: #!/bin/bash
2:
3: tmp=/tmp/tmp_$$
4: dir=/home/usp/HOGE
5: semd=$dir/SEMAPHORE
6:
7: cat $dir/hoge > $tmp-aa
8:
9: rm -f $tmp-*

$ run --var tmp=/tmp/tmp_$$ --debug hoge.sh 7-7
-------------------------------------------------------------------
EditedScript  : /tmp/run.hoge.sh.1401
ScriptName    : hoge.sh
ScriptOptions :
StartLine     : 7
EndLine       : 7
LogOutput     : /dev/stderr
Clean         : NotActive
Upcnt         : Active
Semaphore     : Active
-------------------------------------------------------------------
001 ##!/bin/bash
002 #
003 tmp=/tmp/tmp_1401
004 dir=/home/usp/HOGE
005 semd=$dir/SEMAPHORE
006 #
007 cat $dir/hoge > $tmp-aa
008 #
009 ##rm -f $tmp-*


$ run HOGE log=/dev/null 3-4
これを実行すると、3~4行目以外はコメントアウトします。

1: ##!/bin/bash
2: ## これはHOGEというスクリプト。
3: A
4: B
5: #C | D > $tmp-hoge

<例2>

シェル内で登場した $$ を全て $PPID に置換します。結果的に何度実行し
ても$$は変化しないので、$tmp も固定化される。
また変数宣言はコメントアウトしません。

1: #!/bin/bash
2: # これはHOGEというスクリプト。
3: tmp=/tmp/tmp_$$
4: echo $tmp

$ run HOGE log=/dev/null 4-4
これを実行すると、以下のようなシェルスクリプトを実行します。
$PPIDはbashコンソールのPIDになるので、何度実行しても $tmp の指し示す
先は変わらなくなります。

1: ##!/bin/bash
2: ## これはHOGEというスクリプト。
3: tmp=/tmp/tmp_$PPID
4: echo $tmp



<例3>

パイプ処理の途中の出力結果を出すことが出来ます。例えば以下のような短
いソースHOGEを想定します。

1: A |
2: B |
3: C > $tmp-hoge

$ run HOGE 1-1
を実行すると、2~3行目はコメントアウトします。また最終行(ここでは
1行目)の末尾にパイプがあったら、コード最終行に cat を付加して出力
させます。上のシェルスクリプトは、下のように変換されて実行されます。

1: A |
2: # B |
3: # C > $tmp-hoge
4: cat

<例4>

以下のようなちょっと長いシェルスクリプトHOGEを想定します。

  1 #!/bin/bash -vx
  2 #
  3 # 単なるテストスクリプト
  4 #
  5 # written by K.Okada(k-okada@usp-lab.com) / Tue May 20 18:29:21 JST 2014
  6
  7 tmp=/tmp/tmp_$$
  8
  9 seq 1 10     |
 10 self 1 1 1 1 |
 11 ysum num=0   |
 12 self NF      > $tmp-hoge
 13
 14 seq 1 100 |
 15 yarr -10  |
 16 self NF   > $tmp-hoge2
 17
 18 ycat $tmp-hoge $tmp-hoge2 |
 19 ysum num=0                |
 20 self NF
 21
 22 rm -f $tmp-*
 23 exit 0

(9行目まで実行する)
$ run HOGE log=/dev/null 1-9
1
2
3
4
5
6
7
8
9
10

(9~10行目まで実行する)
$ run HOGE log=/dev/null 9-10
1 1 1 1
2 2 2 2
3 3 3 3
4 4 4 4
5 5 5 5
6 6 6 6
7 7 7 7
8 8 8 8
9 9 9 9
10 10 10 10

(9~12行目まで実行する。結果は tmp-hoge に保存される)
$ run HOGE log=/dev/null 9-12
$

(9~12行目までを実行しつつ、エラーログが出力される)
$ run HOGE 9-12
....