Что такое форма оболочки и форма exec?

что такое форма оболочки и форма exec команд?
Я прошел через несколько документов, чтобы получить четкое представление о форме оболочки и exec форма. Но все это меня смущало. Может ли кто - нибудь помочь выяснить, в чем разница между этими двумя формами?

PS: хотя я столкнулся с этими терминами, когда я просматривал инструкции по файлу docker (ex: RUN, CMD, ENTRYPOINT), Я хочу знать разницу между ними в целом, а не в контексте докера.

1 ответов


синтаксис оболочки docker (который является просто строкой как RUN, ENTRYPOINT и CMD) будет запускать эту строку в качестве параметра /bin/sh -c. Это дает вам оболочку для расширения переменных, суб-команд, вывода трубопроводов, связывания команд вместе и других удобств оболочки.

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

синтаксис exec просто запускает двоичный файл, который вы предоставляете с включенными вами args, но без каких-либо функций синтаксического анализа оболочки. В docker вы указываете это с помощью форматированного json матрица.

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

преимуществом синтаксиса exec является удаление оболочки из запущенного процесса, что может препятствовать обработке сигналов. Переформатирование команды с помощью /bin/sh -c в синтаксисе оболочки также может нарушить конкатенацию вашей точки входа и cmd вместе.