我正在从现有的Dockerfile中学习,以开始创建我自己的Dockerfile。我注意到大多数时候,命令都是以
Dockerfile
RUN set -x ...
或
RUN set -ex; ...
为什么这样做,为什么这是必要的?有必要吗?
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的展开值,后面是命令及其展开参数或相关单词列表。
-e
&&
-x
set
sr4lhrrt2#
Set在shell上设置标志。因此,基本上这个命令是说,在使用shell执行以下操作之前,让shell在出现错误(-e)时退出,并在运行时回显命令(-x)。
2条答案
按热度按时间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的展开值,后面是命令及其展开参数或相关单词列表。
sr4lhrrt2#
Set在shell上设置标志。因此,基本上这个命令是说,在使用shell执行以下操作之前,让shell在出现错误(-e)时退出,并在运行时回显命令(-x)。