set -x在Dockerfile中有什么作用?

z6psavjg  于 2023-06-29  发布在  Docker
关注(0)|答案(2)|浏览(144)

我正在从现有的Dockerfile中学习,以开始创建我自己的Dockerfile。我注意到大多数时候,命令都是以

RUN set -x ...

RUN set -ex; ...

为什么这样做,为什么这是必要的?有必要吗?

yqkkidmi

yqkkidmi1#

-e会导致命令在出现任何错误时停止。更典型的语法是用&&分隔命令,以在出现任何错误时停止。
-x使shell输出正在运行的每个命令。这对于调试脚本很有用。
从bash手册页set下:
-e如果管道(可能由单个简单命令组成)、列表或复合命令(参见上面的SHELL GRAMMAR)以非零状态退出,则立即退出。如果失败的命令是紧跟while或until关键字的命令列表的一部分,是if或elif保留字之后的测试的一部分,是在&&或||除了最后一个&&或之后的命令||,管道中除最后一个命令以外的任何命令,或者命令的返回值与!。如果由于忽略-e时命令失败,而子shell以外的复合命令返回非零状态,则shell不会退出。如果设置了ERR上的陷阱,则在shell退出之前执行。此选项分别应用于shell环境和每个子shell环境(请参阅上面的命令执行环境),并可能导致子shell在执行子shell中的所有命令之前退出。
如果复合命令或shell函数在忽略-e的上下文中执行,则在复合命令或函数体中执行的任何命令都不会受到-e设置的影响,即使设置了-e并且命令返回失败状态。如果复合命令或shell函数在忽略-e的上下文中执行时设置了-e,则在复合命令或包含函数调用的命令完成之前,该设置不会有任何效果。
...
-x展开每个简单命令后,对于command、case command、select command或arithmetic for command,显示PS4的展开值,后面是命令及其展开参数或相关单词列表。

sr4lhrrt

sr4lhrrt2#

Set在shell上设置标志。因此,基本上这个命令是说,在使用shell执行以下操作之前,让shell在出现错误(-e)时退出,并在运行时回显命令(-x)。

相关问题