什么是shellforms和execforms?

什么是命令的shellforms和execforms? 我已经通过了几个文件来了解壳体和执行forms。 但是,所有人都对我感到困惑。 任何人都可以帮助弄清楚这两种forms有什么区别?
PS:虽然我在通过Docker文件指令(例如:RUN,CMD,ENTRYPOINT)时遇到了这些术语,但我想知道它们之间的区别,而不是在docker上下文中。

docker shell语法(它只是一个string,如RUNENTRYPOINTCMD )将运行该string作为/bin/sh -c的参数。 这给你一个shell来扩展variables,子命令,pipe道输出,一起链接命令,和其他shell的便利。

 RUN ls * | grep $trigger_filename || echo file missing && exit 1 

exec语法简单地运行你提供的二进制文件,但是没有任何shellparsingfunction。 在docker中,你用一个json格式的数组表示这个。

 RUN ["/bin/app", "arg1", "arg2"] 

exec语法的优点是从启动的进程中删除shell,这可能会禁止信号处理。 在shell语法中使用/bin/sh -c重新格式化命令也可能会破坏入口点和cmd的连接。