我有一个在bash
中按预期运行的脚本,但是当它被转移到busybox
shell下运行ash
的盒子时,它没有按照我的意愿行事。我写了两个简单的脚本。 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
方面做的那样?
您尝试使用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的开头