我有一个执行大约 20 个命令的 bash 脚本,出于调试目的,我发现自己经常滚动查看输出。 不幸的是,bash 没有告诉我输出的哪一部分是什么命令的一部分。 当我在脚本中使用“set -x”时,它至少会打印一些关于它刚刚执行的内容的信息,但我不太喜欢它生成的输出。
例如,如果我有这个脚本:
#!/bin/bash
set -x
echo "foo"
if [ "$ASD" == "QWE" ] ; then
echo "bar"
fi
我希望输出是这样的:
echo "foo"
foo
echo "bar"
bar
或者也许:
echo "foo"
foo
if [ "value_of_ASD" == "QWE" ] ; then
echo "bar"
bar
fi
不用粗体打印命令,用颜色突出显示也可以。但我不只是希望在命令前面有“+”字符,而且我也不喜欢 if 语句显示为 '[' 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;
主.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
最佳答案
我想延长 rubo77's answer举几个我认为值得单独回答的例子:
纯文本前缀
所以基本的例子是将 PS4
设置为一些纯文本,例如:
PS4="# "; set -x
这将导致:
颜色和额外的行文本前缀
但是因为您可以使用特殊字符和 ANSI 转义码,例如您可以在每个新命令前添加一个新行并以颜色打印前缀,例如:
PS4="\n\033[1;33m>>>\033[0m "; set -x
结果:
动态颜色前缀
最后你可以让命令前缀调用其他程序每次使用,你可以用它来添加时间戳,例如:
# yes, there have to be single quotes below, not double!
PS4='\033[1;34m$(date +%H:%M:%S)\033[0m '; set -x
结果:
关于linux - Bash:执行前突出显示命令(set -x),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50989501/