run

提供: Personal Tukubai for Academic
2021年8月27日 (金) 05:50時点におけるPt4a editor (トーク | 投稿記録)による版 (Batch Update)
(差分) ← 古い版 | 最新版 (差分) | 新しい版 → (差分)
ナビゲーションに移動 検索に移動

名前

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

書式

使い方とオプション

Usage

run [option] "<対象SHELL 引数...>" [<開始行>-<終了行>]
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行目にブレークポイントを入れる。

Option

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

説明

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

例(その1)

シェルスクリプトだけを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

例(その2)

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

$ 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

例(その3)

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

$ 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

例(その4)

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

$ 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)

指定した行数以外、変数宣言行だけは必ず実行されます。以下の例のように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

例(その6)

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

例(その7)

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

$ 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

例(その8)

–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

例(その9)

シェル内で登場した $$ を全て $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

例(その10)

パイプ処理の途中の出力結果を出すことが出来ます。例えば以下のような短いソース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

例(その11)

以下のようなちょっと長いシェルスクリプト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
....

© 2021 Universal Shell Programming Laboratory site