2017-09-01 1 views
1

J'ai un script qui fonctionne comme prévu dans bash mais quand il est transféré à une boîte exécutant busybox sous le shell ash il ne fait pas ce que je voudrais. J'ai écrit 2 scripts simples. myscript1.sh:Existe-t-il un équivalent de exec 5>/BASH_XTRACEFD = "5"/set -x pour un shell de cendres de boîte occupé?

#!/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 

et myscript2.sh:

#!/bin/bash 

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

var1=flop 
var2=bleh 

Je leur ai écrit que pour tester la fonctionnalité de journalisation. Les 3 premières lignes de myscript1.sh créent un fichier appelé debug_output.txt et possède la sortie du script lorsqu'il s'exécute. Ceci est la sortie de myscript1.sh:

(^)#(^)#(^)#(^)[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~ 

Comme vous pouvez le voir le fichier journal debug_output.txt a été créé et est ici la sortie:

(^)#(^)#(^)#(^)[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]tu:~/bashscripttutorial$ 

La chose à signaler c'est que je peux voir exactement ce qui se passe dans le script et sur quel numéro de ligne cela se passe. Dans busybox c'est une histoire différente. Voici 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 

et ici myscript2.sh:

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

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

var1=flop 
var2=bleh 

Ceci est la sortie de l'exécution myscript1.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 

debug .output.txt est creat ed mais c'est un fichier vide. Existe-t-il un moyen d'obtenir une sortie similaire à celle que je fais du côté bash?

+0

avez-vous changé la 'ligne shebang' (ligne 1) en '#!/bin/sh' quand vous l'avez lancé dans busybox? (Ne pas dire que ça va le réparer). Bonne chance. – shellter

+0

Je l'ai fait comme vous l'avez suggéré et cela n'a pas fonctionné. –

Répondre

0

Vous essayez d'utiliser la variable spécifique bash avec des cendres, le shell de busybox, mais ce shell ne les connaît pas (LINENO et BASH_XTRACEFD). Lorsque vous appelez set -x, la trace est imprimée sur fd2 (erreur standard).

Lorsque vous appelez set -x, la trace est imprimée sur fd2 (erreur standard).

Vous ne voyez pas cela avec bash parce que vous dites attraper la sortie de set -x avec BASH_XTRACEFD et vous redirigez cette sortie sur un fichier (debug_output.txt). Avec busybox, vous voyez la trace de set -x sur l'écran car la sortie de fd2 n'est pas redirigée sur le fichier.

Si vous souhaitez obtenir cette sortie sur le fichier avec busybox, vous devez rediriger fd2.

exec 5> debug_output.txt 

est devenu

exec 2> debug_output.txt 

Je ne peux pas voir un moyen de remplacer la LINENO variable des cendres, mais vous pouvez utiliser l'ancre pour vous remenber où vous êtes comme:

echo Currently in $0>&2 

à le début de myscript2.sh