是否有相当于exec 5> / BASH_XTRACEFD =" 5" / set -x for busy box ash shell?

时间:2017-09-01 17:25:53

标签: linux bash shell ubuntu-14.04 busybox

我有一个在bash中按预期运行的脚本,但当它转移到busybox shell下运行ash的框时,它没有做什么我喜欢。我写了2个简单的脚本。 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

#!/bin/bash

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

var1=flop
var2=bleh

我只是为了测试日志记录功能而编写它们。 myscript1.sh 的前3行创建了一个名为 debug_output.txt 的文件,并在运行时输出脚本。这是 myscript1.sh

的输出
(^)#(^)#(^)#(^)bminter@ubuntu:~/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

(^)#(^)#(^)#(^)bminter@ubuntu:~/bashscripttutorial$ ls
debug_output.txt  myscript1.sh  myscript1.sh~  myscript2.sh  myscript2.sh~

正如您所看到的,创建了日志文件 debug_output.txt ,这是输出:

(^)#(^)#(^)#(^)bminter@ubuntu:~/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
(^)#(^)#(^)#(^)bminter@ubuntu:~/bashscripttutorial$

需要指出的是,我可以确切地看到脚本中发生了什么以及它正在发生的行号。在 busybox 中,它是一个不同的故事。这是 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

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

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

var1=flop
var2=bleh

这是运行 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 已创建,但它是一个空文件。有没有办法像bash那样得到类似的输出?

1 个答案:

答案 0 :(得分:1)

您尝试使用bash特定变量with ash,busybox的shell,但是这个shell不知道它们(LINENO和BASH_XTRACEFD)。

当您调用set -x时,跟踪将在fd2上打印(标准错误)。

你没有看到使用bash,因为你告诉我用BASH_XTRACEFD捕获set -x的输出,你将这个输出重定向到一个文件(debug_output.txt)。

使用busybox,您会在屏幕上看到set -x的跟踪,因为fd2的输出不是文件的重定向。

如果要使用busybox在文件上获取此输出,则必须重定向fd2。

exec 5> debug_output.txt

成了

exec 2> debug_output.txt

我看不到用灰替换变量LINENO的方法,但你可以使用锚来重温你的位置:

echo Currently in $0>&2

在myscript2.sh的开头