そのラインをチェックする方法がある番号のbash
「今」が実行されているスクリプトは?
使用bash -x script.sh
は有望に見えます。ただし、現在の行番号を取得する必要があります。
そのラインをチェックする方法がある番号のbash
「今」が実行されているスクリプトは?
使用bash -x script.sh
は有望に見えます。ただし、現在の行番号を取得する必要があります。
回答:
はい、方法があります。
関数が呼び出された行番号の配列があります。
この関数を定義します。
f(){ echo "${BASH_LINENO[-2]}"; }
そしてf
、行番号が必要な任意の行で呼び出します。例えば:
#!/bin/bash
f(){ echo "${BASH_LINENO[-2]}"; }
f
echo next1
f
echo next2
f
echo next 3
f
印刷されます:
6
next 1
9
next 2
12
next 3
15
呼び出される関数の軌跡を表示するように拡張できます。
#!/bin/bash
f(){
for ((i=${#BASH_LINENO[@]}-1;i>=0;i--)); do
printf '<%s:%s> ' "${FUNCNAME[i]}" "${BASH_LINENO[i]}";
done
echo "$LINENO"
}
SomeOtherFunction(){ echo -n "test the line numbering: "; f; }
f
echo next 1
echo -n " This line numbering: "; f
SomeOtherFunction
echo next 2
echo -n " This line numbering: "; f
SomeOtherFunction
echo next 3
echo -n " This line numbering: "; f
印刷するもの:
$ ./script
<main:0> <f:12> 7
next 1
This line numbering: <main:0> <f:15> 7
test the line numbering: <main:0> <SomeOtherFunction:16> <f:10> 7
next 2
This line numbering: <main:0> <f:19> 7
test the line numbering: <main:0> <SomeOtherFunction:20> <f:10> 7
next 3
This line numbering: <main:0> <f:23> 7
上記のecho "$LINENO"
出力は常に同じであることに注意してください(この場合は7)。
ここの部分借りソリューションですl0b0さんとDopeGhotiの答えが(より少ない程度に、そして、sorontarの)。それらの答えのように、私のもの$LINENO
は行番号を発見するために使用します。それらとは異なりtrap
、レポートをトリガーするために使用します。bashのtrap
コマンドについては、bash(1)で説明しています。
trap [-lp] [[arg] sigspec ...]
コマンドargは、シェルがシグナルsigspecを受信したときに読み取られて実行されます。…︙
… sigspecがDEBUGの場合、コマンドargは、すべての単純なコマンド、for
コマンド、case
コマンド、select
コマンド、すべての算術for
コマンドの前、およびシェル関数で最初のコマンドが実行される前に実行されます…
したがって、このスクリプト:
$ cat -n myscript
1 #!/bin/bash
2 trap 'printf "%3d: " "$LINENO"' DEBUG
3 date
4 sleep 30
5 date
6 sleep \
7 11
8 date
9
10 ls -l
11 for f in *
12 do
13 echo "$f" &&
14 ls -ld "$f"
15 done
16
17 for ((i=0; i<3; i++))
18 do
19 echo "i = $i"; date
20 done
21
22 echo $((5+25+12))
$
実行されるprintf "%3d: " "$LINENO"
スクリプト内のすべてのコマンドの前にコマンドを、この出力を生成します。
$ ./myscript 3:2017年4月5日水曜日10:16:17 AM 4:5:2017年4月5日水曜日10:16:47 AM 7:8:2017年4月5日水曜日10:16:58 AM 10:合計4 -rwxr-xr-x 1 myusername mygroup 221 Apr 5 10:01 myscript -rwxr-xr-x 1 myusername mygroup 252 Apr 5 10:01 myscript2 -rw-r--r-- 1 myusername mygroup 132 Apr 5 09:59 myscript2.log -rw-r--r-- 1 myusername mygroup 45 Apr 5 08:34 other_file 11:13:myscript 14:-rwxr-xr-x 1 myusername mygroup 221 Apr 5 10:01 myscript 11:13:myscript2 14:-rwxr-xr-x 1 myusername mygroup 252 Apr 5 5 10:01 myscript2 11:13:myscript2.log 14:-rw-r--r-- 1 myusername mygroup 132 Apr 5 09:59 myscript2.log 11:13:other_file 14:-rw-r--r-- 1 myusername mygroup 45 Apr 5 08:34 other_file 17:17:19:i = 0 19:2017年4月5日水曜日10:16:59 AM 17:17:19:i = 1 19:2017年4月5日水曜日10:16:59 AM 17:17:19:i = 2 19:2017年4月5日水曜日10:16:59 AM 17:17:22:42 $
ノート:
sleep
行目は、スクリプトの行6と7にまたがっており、行7として報告されます。for f in *
)は、そのfor
ループの各反復の前に1回報告されます。echo "$f"
そしてls -ld "$f"
、それぞれの行(13および14)で正しく報告されます。for ((i=0; i<3; i++))
)が報告されて二倍
というの各反復の前にfor
ループ、そして二回以上、最後の反復後。set -x
、DEBUG はbash拡張機能であり、すべてのシェルで機能するわけではありません。LINENO
PS4
trap
trap
は任意のコマンドを実行でき、スクリプトの標準出力または標準エラーへの書き込みに制限されません。質問では、ユーザーインターフェイスを指定せずに、「今すぐ」bashスクリプトのどの行番号が実行されているかを確認します。別のアプローチは、現在の行番号をログファイルに継続的に書き込むことです。
$ diff myscript myscript2 2c2 <trap 'printf "%3d:" "$ LINENO"' DEBUG --- > exec 6> myscript2.log && trap 'printf "%3d \ n" "$ LINENO">&6' DEBUG $ ./myscript2 2017年4月5日水曜日10:23:50 AM 2017年4月5日水曜日午前10時24分20秒 2017年4月5日水曜日10:24:31 AM 合計4 -rwxr-xr-x 1 myusername mygroup 221 Apr 5 10:01 myscript -rwxr-xr-x 1 myusername mygroup 252 Apr 5 10:01 myscript2 -rw-r--r-- 1 myusername mygroup 24 Apr 5 10:23 myscript2.log -rw-r--r-- 1 myusername mygroup 45 Apr 5 08:34 other_file マイスクリプト -rwxr-xr-x 1 myusername mygroup 221 Apr 5 10:01 myscript myscript2 -rwxr-xr-x 1 myusername mygroup 252 Apr 5 10:01 myscript2 myscript2.log -rw-r--r-- 1 myusername mygroup 60 Apr 5 10:23 myscript2.log other_file -rw-r--r-- 1 myusername mygroup 45 Apr 5 08:34 other_file i = 0 2017年4月5日水曜日10:24:31 AM i = 1 2017年4月5日水曜日10:24:31 AM i = 2 2017年4月5日水曜日10:24:31 AM 42 $
myscript2.log
別の端末からファイルの内容を監視することにより、このスクリプトの実行を監視できます。たとえば、2番目の間にsleep
、
$ tail myscript2.log
3
4
5
7