2017-09-01 4 views
1

私はbashで期待通りに動作するスクリプトを持っていますが、ashシェルの下でbusyboxを実行しているボックスに転送されたとき、それは私がしたいことをしません。私は2つの簡単なスクリプトを書いた。 myscript1.shビジーボックスのashシェルには、exec 5>/BASH_XTRACEFD = "5"/set -xと同等の機能がありますか?

#!/bin/bash 

exec 5> debug_output.txt 
BASH_XTRACEFD="5" 
set -x 
PS4='$LINENO: ' 

var1=blah 
var2=foo 

echo Currently in $0 
echo 
echo $0 :: var1 : $var1, var2 : $var2 

export var1 
echo 
echo Entering myscript2.sh 
./myscript2.sh 
echo 
echo Back in $0 
echo $0 :: var1 : $var1, var2 : $var2 
echo 

myscript2.sh

#!/bin/bash 

echo Currently in $0 
echo 
echo $0 :: var1 : $var1, var2 : $var2 

var1=flop 
var2=bleh 

私は唯一のロギング機能をテストするためにそれらを書きました。 の最初の3行myscript1.shは、というデバッグ出力ファイルというファイルを作成し、それが実行されるときにスクリプトの出力を持ちます。あなたは debug_output.txtログファイルを見ることができるように

(^)#(^)#(^)#(^)[email protected]:~/bashscripttutorial$ ./myscript1.sh 
Currently in ./myscript1.sh 

./myscript1.sh :: var1 : blah, var2 : foo 

Entering myscript2.sh 
Currently in ./myscript2.sh 

./myscript2.sh :: var1 : blah, var2 : 

Back in ./myscript1.sh 
./myscript1.sh :: var1 : blah, var2 : foo 

(^)#(^)#(^)#(^)[email protected]:~/bashscripttutorial$ ls 
debug_output.txt myscript1.sh myscript1.sh~ myscript2.sh myscript2.sh~ 

作成し、ここに出力されました:これはmyscript1.shの出力である

(^)#(^)#(^)#(^)[email protected]:~/bashscripttutorial$ cat debug_output.txt 
+ PS4='$LINENO: ' 
8: var1=blah 
9: var2=foo 
11: echo Currently in ./myscript1.sh 
12: echo 
13: echo ./myscript1.sh :: var1 : blah, var2 : foo 
15: export var1 
16: echo 
17: echo Entering myscript2.sh 
18: ./myscript2.sh 
19: echo 
20: echo Back in ./myscript1.sh 
21: echo ./myscript1.sh :: var1 : blah, var2 : foo 
22: echo 
(^)#(^)#(^)#(^)[email protected]:~/bashscripttutorial$ 

指摘するもの私はスクリプト内で何が起きているのか、そして何が起こっているのかを正確に見ることができます。 ビジーボックスでは別の話です。ここでmyscript1.shです:

# cat myscript1.sh 
#!/bin/bash 

exec 5> debug_output.txt 
BASH_XTRACEFD="5" 
set -x 
PS4='$LINENO: ' 

var1=blah 
var2=foo 

echo Currently in $0 
echo 
echo $0 :: var1 : $var1, var2 : $var2 

export var1 
echo 
echo Entering myscript2.sh 
./myscript2.sh 
echo 
echo Back in $0 
echo $0 :: var1 : $var1, var2 : $var2 
echo 

、ここmyscript2.shです:

# ./myscript1.sh 
: ./myscript1.sh 
+ PS4=$LINENO: 
: var1=blah 
: var2=foo 
: echo Currently in ./myscript1.sh 
Currently in ./myscript1.sh 
: echo 

: echo ./myscript1.sh :: var1 : blah, var2 : foo 
./myscript1.sh :: var1 : blah, var2 : foo 
: export var1 
: echo 

: echo Entering myscript2.sh 
Entering myscript2.sh 
: ./myscript2.sh 
Currently in ./myscript2.sh 

./myscript2.sh :: var1 : blah, var2 : 
: echo 

: echo Back in ./myscript1.sh 
Back in ./myscript1.sh 
: echo ./myscript1.sh :: var1 : blah, var2 : foo 
./myscript1.sh :: var1 : blah, var2 : foo 
: echo 

デバッグ:これはmyscript1.shを実行しているからの出力は

# cat myscript2.sh 
: cat myscript2.sh 
#!/bin/bash 

echo Currently in $0 
echo 
echo $0 :: var1 : $var1, var2 : $var2 

var1=flop 
var2=bleh 

です.output.txtはcreatですそれは空のファイルです。 bash側と同様の出力を得る方法はありますか?

+0

busyboxで実行すると、 'shebang line'(行1)が '#!/ bin/sh'に変更されましたか? (それはそれを修正するつもりはない)。がんばろう。 – shellter

+0

私はあなたが示唆したように、それは動作しませんでした。 –

答えて

0

あなたはbusyhのシェルであるashにbash固有の変数を使用しようとしますが、このシェルはそれらを知らない(LINENOとBASH_XTRACEFD)。

set -xを呼び出すと、トレースはfd2(標準エラー)に出力されます。

set -xの出力をBASH_XTRACEFDでキャッチし、この出力をファイル(debug_output.txt)にリダイレクトするように指示しているので、bashではこれを見ていません。

busyboxの場合、fd2の出力がファイルにリダイレクトされないため、画面にset -xのトレースが表示されます。

この出力をビジーボックスのあるファイルで取得する場合は、fd2をリダイレクトする必要があります。

echo Currently in $0>&2 

で:

exec 5> debug_output.txt 

は、私が灰と変数LINENOを交換する方法を見てすることはできませんが、あなたはのようなものどこがあなたをremenberするアンカーを使用することができます

exec 2> debug_output.txt 

になりましたmyscript2.shの開始

関連する問題