- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
当我还为详细模式设置详细时,我正在尝试配置 PS4 以获得更好的 xtrace 输出。我想做的一些事情会生成子 shell,但我希望看到这些操作的任何 -x 或 -v 输出,因为它们会为每一行打印。
我还想去掉嵌套/间接深度级别指示符 (+),因为我希望跟踪输出对齐。
我最初的想法是:
BACKSPACES=$'\b\b\b\b\b\b\b\b'
PS4='+`printf "%s[\t] %-16.16s:%03d (%-16.16s) $ " ${BACKSPACES:0:$BASH_SUBSHELL} $(basename $BASH_SOURCE) $LINENO ${FUNCNAME[0]:+${FUNCNAME[0]}}`'
我遇到的第一个问题是 $BASH_SUBSHELL 似乎并不总是与要打印的 + 的数量相同。查看 $SHLVL 也无济于事。
echo $X
+ 0 2 $ echo x <-- toplevel prints one + and $BASH_SUBSHELL is 0, as expected
x
( echo subshell )
+ 1 2 $ echo subshell <-- $BASH_SUBSHELL increments to 1 as expected, but why only one + instead of two ++?
source ./test2.sh
+ 0 2 $ source ./test2.sh
echo $X$X$X$X
++ 0 2 $ echo xxxx <-- ??? is $BASH_SUBSHELL relative to the current file or something but the + indicators are not???
xxxx
subshell
我想我已经通过忘记使用 $BASH_SUBSHELL 并将 PS4 中的第一个字符设置为不可打印的字符来解决这个问题,但我仍然想知道为什么 $BASH_SUBSHELL 不是我所期望的。
为了解决在 PS4 中创建子 shell 的问题,我查看了 PS1 的 PROMPT_COMMAND 的等价物,但除了一些关于如何自己实现它的指示之外没有找到任何东西。
我认为我找到的最好方法是捕获 DEBUG 信号。
trap 'debugfun $BASH_SOURCE' DEBUG
当然,-vx 选项也适用于对 debugfun 的调用。我抑制该输出的解决方案是将函数的步骤包装在 set +vx 和 set -vx 中。
debugfun() {
set +vx
VAR=`basename $1 .sh`
set -vx
}
现在...我不得不处理每个调用打印的问题:
debugfun $BASH_SOURCE <-- from -v
++ debugfun ./test.sh <-- from -x
++ set +vx <-- from -x
我不确定为什么 -v 也不会导致在“set +vx”行上打印。我认为 -T 选项可能会这样做,但事实并非如此。
无论如何,我认为输出总是一致的,所以我所要做的就是从 debugfun 中删除这 3 行。我丑陋的解决方案是在“set +vx”之后添加这一行:
printf "\b\r\033[K\b\r\033[K\b\r\033[K" # clear previous 3 lines
成功了!
...除非我管道不止一次。
我将删除 printf 行以说明原因:
echo $X$X | sed 's/x/y/' # pipe once... debugfun is called every time before each pipe component
debugfun $BASH_SOURCE
++ debugfun ./test.sh
++ set +vx
debugfun $BASH_SOURCE
++ debugfun ./test.sh
++ set +vx
+ echo xx
+ sed s/x/y/
echo $X$X$X | sed 's/x/y/' | sed 's/y/x/' # pipe twice
debugfun $BASH_SOURCE
++ debugfun ./test.sh
++ set +vx
debugfun $BASH_SOURCE
++ debugfun ./test.sh
++ set +vx
+ echo xxx
+ sed s/x/y/ # because this line is here, clearing 3 previous lines from the next "set +vx" would clear it
debugfun $BASH_SOURCE
++ debugfun ./test.sh
++ set +vx
+ sed s/y/x/
xxx
我确实最终提出了这个解决方案,但我认为它真的很难看,虽然接近,但并不是我想要的:
SPACES=" "
PS4='^@\[\e[31m\]+ [\t] \
${SPACES:0:$((${#BASH_SOURCE} > 24 ? 0 : 24 - ${#BASH_SOURCE}))}${BASH_SOURCE:$((${#BASH_SOURCE} < 24 ? 0 : -24))}:\
${SPACES:0:$((3-${#LINENO}))}$LINENO \
${FUNCNAME:-${SPACES:0:20}}${FUNCNAME:+${SPACES:0:$((20 - ${#FUNCNAME}))}} \
$ \[\e[0m\]'
我不喜欢的主要事情是我不能嵌套 bash 字符串操作,不仅要反向截断 $BASH_SOURCE,还要在没有子 shell 的情况下获取它的基本名称(即与 echo ${BASH_SOURCE##*/结合使用) })
我没有想法,希望得到有关如何完成我正在尝试做的事情的澄清和提示。
GNU bash, version 4.1.2(1)-release (x86_64-redhat-linux-gnu)
最佳答案
我建议放弃 PS4 并在 DEBUG 陷阱中进行所有跟踪输出。大多数,如果并非所有 -x 打印的信息都可以在别处获得。参见 BASH_SOURCE,BASH_LINENO、FUNCNAME 和 BASH_COMMAND。
像这样:
function trace()
{
echo "TRACE" \
"${BASH_SOURCE[1]}:${BASH_LINENO[0]}:${FUNCNAME[1]}:" \
"$BASH_COMMAND"
}
set -o functrace
shopt -s extdebug
trap trace DEBUG
关于bash - 使用 verbose 和 xtrace (set -vx) 记录 bash 脚本并自定义 PS4,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14639125/
pod update --verbose 未完成,挂起。 CDN: trunk Relative path: Specs/7/4/b/GoogleToolboxForMac/2.1.2/Googl
我正在导入 Carbon进入我的 PowerShell 脚本;但是,当使用 -Verbose 运行我的脚本时,Carbon 也会输出很多 VERBOSE 语句。 是否可以静默导入模块,以便我可以忽略导
我正在创建一个调用Write-Verbose的.ps1脚本。我希望能够启用/禁用这些功能。 我希望调用脚本时可以传递-Verbose标志,并且一切正常。不幸的是,事实并非如此。 详细消息不会写出到主机
我们正在尝试用我们的 WAS(Websphere 应用程序服务器)实例调试一些严重的类加载器问题。 为此,我们提供了选项 -verbose:class 以查看 WAS 从何处加载哪个类。 对于大多数类
Powershell 中详细输出的默认颜色(例如 Write-Verbose 或 -Verbose 开关)是黄色的。这使其看起来像警告,尽管它并不重要。 如何更改详细输出的默认颜色? 最佳答案 这是可
根据回答like this one和我自己的经验,Powershell 可以自动传播 -Verbose(和 -Debug),非常方便。但是,当我想要将详细程度传播到的函数位于模块中时,这将停止工作。用
有没有一种简单的方法可以让 -Verbose 切换到 Powershell 中的其他函数调用“直通”? 我知道我可以在 $PSBoundParameters 中搜索标志并执行 if 语句: [Cmdl
也许在 PowerShell 中没有办法做到这一点。 如果我有文件 verboseTest.ps1 [CmdletBinding()] # CmdletBinding attribute ena
考虑重新设计数据库。想知道与以下内容有什么区别/注意事项: users fields ----- ------ id id user_id
我有一个冗长的 (re.X) 标记的正则表达式抛出异常,即使它看起来等同于它的压缩版本。 (我从后者构建了前者。) 精简版: import re test = 'catdog' test2 = 'do
我运行了这个测试脚本: use strict; use warnings; use Test::More tests => 3; use Carp; ok(1<2); pass(); fail();
我正在制作一个小型系统,我希望能够在整个系统中切换“详细”文本输出。 我创建了一个名为 globals.h 的文件: namespace REBr{ extern bool console_v
因此,我有一个包含大量调试输出的脚本,我可以使用 -v 标志打开/关闭这些输出。我当前的代码如下所示: def vprint( obj ): if args.verbose:
我知道 ansible -vvv 选项,但我不想看到所有命令的详细输出,我只想在任务失败时查看详细信息。 我怎样才能做到这一点? 附言。请提供可扩展的解决方案,必须编辑每个任务没有任何意义。 最佳答案
我正在使用 ant -f build.xml 运行一个 ant 脚本。该脚本应该编译我的项目并生成一个 jar 文件,但是在 ant 开始生成 jar 文件几秒钟后,该项目被终止,我在控制台中看到的只
我刚刚开始构建我的第一个 Rakefile(makefile 的 Ruby 版本),我想使用详细模式(如 makefile -V 或 bash -x)轻松调试我的脚本,是否有这样做的选项 ruby ?
本文整理了Java中org.zeromq.ZLoop.verbose()方法的一些代码示例,展示了ZLoop.verbose()的具体用法。这些代码示例主要来源于Github/Stackoverflo
我希望我的 ROS 包中的特定节点在 DEBUG 详细级别显示输出,而其他节点在 INFO 级别显示。我知道 rosconsole configuration file ,并且能够为包设置详细程度:
MS SQL Server 是否有一些配置选项可以启用更详细的错误消息。 具体示例:我想查看在插入期间违反约束的插入记录的实际字段值,以帮助追踪我无法重现的存储过程中的错误。 最佳答案 我不相信有任何
我正在学习 Coq 和我正在学习的书,( CPDT )大量使用了 auto在证明中。 由于我正在学习,因此我认为了解确切内容可能对我有帮助 auto在幕后做(越早越好)。有没有办法强制它准确显示它用来
我是一名优秀的程序员,十分优秀!