我正在从现有的Dockerfile
学习,开始创建自己的Dockerfile
。我注意到大多数时候,命令都以
RUN set -x ...
或
RUN set -ex; ...
为什么这样做,为什么这是必要的?有必要吗?
答案 0 :(得分:11)
-e
导致命令停止任何错误。更典型的语法是使用&&
分隔命令以停止任何错误。
-x
导致shell输出正在运行的每个命令。这对于调试脚本非常有用。
来自set
下的bash手册页:
-e如果管道(可能由一个管道组成)立即退出 单个简单命令),列表或者 复合命令(参见上面的SHELL GRAMMAR),以非零状态退出。外壳确实如此 如果失败的命令在一段时间后立即成为命令列表的一部分,则不退出 或直到关键字,if或elif保留字后面的测试的一部分,任何com-的一部分 在&&和或||列表除了最后一个&&之后的命令或||,任何命令 在管道中但是最后一个,或者如果命令的返回值与!相反。如果一个 子shell以外的复合命令返回非零状态,因为命令失败 当-e被忽略时,shell不会退出。 ERR上的陷阱(如果已设置)将被执行 在shell退出之前。此选项适用于shell环境和每个子shell环境 单独使用ronment(参见上面的COMMAND EXECUTION ENVIRONMENT),并可能导致子shell退出 在执行子shell中的所有命令之前。
如果复合命令或shell函数在忽略-e的上下文中执行,则为none 复合命令或函数体内执行的命令将受到影响 -e设置,即使设置了-e并且命令返回失败状态。如果是复合命令 或shell函数集-e在忽略-e的上下文中执行时,该设置将 在复合命令或包含函数调用的命令之前没有任何影响 完成。
...
-x扩展每个简单命令后,对于命令,case 命令,选择命令或算术 对于命令,显示PS4的扩展值,然后是命令及其扩展 参数或相关单词列表。