我有一个 Bash 脚本,其中包含大约20个命令,为了调试目的,我经常需要滚动查看输出。不幸的是,Bash 不会告诉我输出的哪个部分属于哪个命令。
当我在脚本中使用“set -x”时,它至少会打印一些有关它刚刚执行了什么的信息,但我并不喜欢它生成的输出。
例如,如果我有这个脚本:
我希望输出的结果类似于这样:
如何使用bash实现这个目标?
此时输出看起来像这样:
编辑:
我有一个想法,就是编写一个脚本,在主脚本的一开始引用它,然后让被引用的脚本解析主脚本。类似这样:
source_me.sh
在这种情况下的输出为:
``` echo "Foo" Foo echo "Bar" Bar echo "+Hello" +Hello ```
但是,如果我使用更复杂的多行代码(例如if语句、循环等),这种方法将失败。
在这种情况下,我得到了:
```
例如,如果我有这个脚本:
#!/bin/bash
set -x
echo "foo"
if [ "$ASD" == "QWE" ] ; then
echo "bar"
fi
我希望输出的结果类似于这样:
或者可能是这样的:echo "foo"
foo
echo "bar"
bar
而不是在加粗的命令前面打印"+"字符,我也不喜欢if语句出现像echo "foo"
foo
if [ "value_of_ASD" == "QWE" ] ; then
echo "bar"
bar
fi
'[' value_of_ASD == QWE ']'
这样的情况。如何使用bash实现这个目标?
此时输出看起来像这样:
+ echo foo
foo
+ '[' value_of_ASD == QWE ']'
+ echo bar
bar
编辑:
我有一个想法,就是编写一个脚本,在主脚本的一开始引用它,然后让被引用的脚本解析主脚本。类似这样:
source_me.sh
#!/bin/bash
SCRIPT_PATH="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )/$(basename $0)"
FORMAT_SET_BOLD='\033[0;1m'
FORMAT_RESET='\033[0m'
cat $SCRIPT_PATH | tail -n "+$START_LINE" | while read line; do
printf "${FORMAT_SET_BOLD}${line}${FORMAT_RESET}\n"
eval "${line}"
done
exit 0;
main.sh
#!/bin/bash
START_LINE=$((LINENO+1)) source ./source_me.sh
echo "Foo"
echo "Bar"
echo "+Hello"
在这种情况下的输出为:
``` echo "Foo" Foo echo "Bar" Bar echo "+Hello" +Hello ```
但是,如果我使用更复杂的多行代码(例如if语句、循环等),这种方法将失败。
#!/bin/bash
START_LINE=$((LINENO+1)) source ./source_me.sh
echo "Foo"
if [ "$FOOBAR" == "" ] ; then
echo "Bar"
fi
echo "+Hello"
在这种情况下,我得到了:
```
在这种情况下,我得到:
```echo "Foo"
Fooif [ "$FOOBAR" == "" ] ; then
./source_me.sh: eval: line 9: syntax error: unexpected end of file
echo "Bar"
Bar
fi
./source_me.sh: eval: line 8: syntax error near unexpected token 'fi'
./source_me.sh: eval: line 8: 'fi'echo "+Hello"
+Hello
set -x
输出来解释它,那么您可以编写一个执行相同操作的脚本。但是这并不会很美观。 - JNevill-x
输出的格式(至少没有内置的方法)。你可以编写一些轻量级的代码并将其管道传输到其中,它可能不完美,但它可能有助于减轻set -x
的视觉疲劳,例如./yourscript.sh | awk '/^\+/{printf "%c[1;32m %s\n",27, $0} /^[^\+]/{printf "%c[1;30m %s\n",27,$0}'
,其中它将以绿色突出显示以+
开头的行,并以可爱的灰色显示其余部分。 - JNevillbash
源代码并进行修改。它是可用的。 :) - lurker