gcc делает это как часть своей трехфазной сборки: см. Обсуждение компиляторов фазы 2 и фазы 3 в Установка GCC: Сборка
"$@"
в Bourne -подобно оболочкам, в контекстах списка расширяется до всех позиционных параметров как отдельных аргументов.
В скрипте изначально позиционные параметры являются аргументами, которые получил сам скрипт.
exec
— запустить команду в том же процессе, что и оболочка. Это последняя команда, которую выполнит сценарий, потому что после этого процесс будет выполнять другую команду, а не оболочку.
Итак, если ваш скрипт
#! /bin/sh -
exec "$@"
И вы вызываете свой скрипт, используя командную строку оболочки, например:
/path/to/your-script 'echo' "some test" 'x y'
Он вызовет exec
с echo
, some test
и x y
в качестве аргументов, которые будут выполнятьecho
(в большинстве sh
реализаций, /bin/echo
в отличие от echo
встроенной оболочки )в том же процессе, который ранее запускал оболочку, интерпретирующую ваш скрипт с some test
и x y
в качестве аргументов.
Бит "$@"
будет расширяться до списка позиционных параметров (обычно это аргументы командной строки ), заключенные в кавычки, чтобы избежать разделения слов и генерации имени файла ("подстановки" ).
exec
заменит текущий процесс процессом, полученным в результате выполнения его аргумента.
Короче говоря, exec "$@"
запустит команду, заданную параметрами командной строки, таким образом, что текущий процесс будет заменен ею (, если exec
вообще сможет выполнить команду ).