Bash 如何在set-x生效的情况下从shell脚本获得干净的消息
这个问题是由Jenkins jobs及其Execute shell构建步骤提出的。默认情况下,Jenkins使用Bash 如何在set-x生效的情况下从shell脚本获得干净的消息,bash,shell,jenkins,echo,Bash,Shell,Jenkins,Echo,这个问题是由Jenkins jobs及其Execute shell构建步骤提出的。默认情况下,Jenkins使用-x开关调用sh,这会导致响应它执行的命令。这绝对是一种良好的行为。然而,除了有效地使用set-x之外,能够很好地打印消息将是非常好的。例如: 如果在构建步骤脚本中有echo Next,我们将修复一个SNAFU,那么构建的控制台输出将具有 + echo Next we fix a SNAFU Next we fix a SNAFU 最好只有一条线 Next we fix a SNAF
-x
开关调用sh
,这会导致响应它执行的命令。这绝对是一种良好的行为。然而,除了有效地使用set-x
之外,能够很好地打印消息将是非常好的。例如:
如果在构建步骤脚本中有echo Next,我们将修复一个SNAFU
,那么构建的控制台输出将具有
+ echo Next we fix a SNAFU
Next we fix a SNAFU
最好只有一条线
Next we fix a SNAFU
如何做到这一点?理想的解决方案是一般的sh
解决方案,但詹金斯特定的解决方案也可以。解决方案在shell脚本源代码中也应该非常好看,因为回音的双重用途是记录脚本,并使输出更加清晰
所以就这样把每一个回声都包围起来
set +x
echo Message
set -x
不是很好,因为它将在每条消息之前打印+set+x
,并且它还占用脚本中的3行。set+x
set-x
这将禁用打印
我发现了两种解决方案,两者都不理想,但都还可以
我更喜欢第一个。不要使用
回显消息
,而是使用
true Message
它将显示
+ true Message
这是可行的,因为(大部分)。缺点是消息之前的+true
杂乱无章,对于以后阅读脚本的其他人来说,可能会混淆使用true
命令。此外,如果echo已关闭,则不会显示该消息
另一种方法是这样做:
( set +x;echo Message )
哪个会打印
+ set +x
Message
这是可行的,因为
()
中的命令是无效的,所以像set
这样的更改不会影响父shell。这样做的缺点是,它使脚本有点难看,编写起来更加繁琐,而且还有一行额外的输出。此外,这会产生一个额外的子shell,这可能会稍微影响构建性能(特别是在Windows上以Cygwin进行构建时)。积极的一面是,如果echo关闭,它也会打印消息,而且对于那些了解shell脚本的人来说,他们的意图可能马上就清楚了。我不清楚您的问题有什么不同。您是在谈论echo的特定行为吗?我想这可以通过使用函数/别名来实现。让我们看看吧@TomFenech写了一个答案并整理了评论。