我有一个在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
那样得到类似的输出?
答案 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的开头