linux - Bash:执行前突出显示命令(set -x)

标签 linux bash shell sh

我有一个执行大约 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"
Foo

if [ "$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/

相关文章:

c - 如何在用 C 编写的 shell 中重定向 cd 的输出

java - 将 NetBeans 项目从 Windows 转移到 Linux VM 时 Ant 构建出错

linux - 放入文件 : index of line and total numbers of specific pattern

linux - 如何在 ls 输出中转义方括号

bash - 如何关闭命名管道的作者?

c++ - Boost Process 库 asynch_read 处理程序未调用

python - 向 DNS 查询时欺骗 src ip 地址

shell - 如何通过SSH在终端中执行多个命令?

mysql - 仅使用 root 密码访问 MySQL 数据库

linux - RabbitMQ 应用程序安装 -/usr/bin/env : escript: No such file or directory