Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 如何在set-x生效的情况下从shell脚本获得干净的消息_Bash_Shell_Jenkins_Echo - Fatal编程技术网

Bash 如何在set-x生效的情况下从shell脚本获得干净的消息

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

这个问题是由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 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写了一个答案并整理了评论。