对于忙箱灰壳,是否有相当于exec 5> / BASH_XTRACEFD =“5”/ set -x?

问题描述 投票:2回答:1

我有一个在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方面做的那样?

linux bash shell ubuntu-14.04 busybox
1个回答
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的开头

© www.soinside.com 2019 - 2024. All rights reserved.