# exec

Команда запускает подпроцессы.

## СИНТАКСИС

          exec ?switches? arg ?arg...?

## ОПИСАНИЕ

Аргументы команды определяют один или нескольких подпроцессов, которые необходимо выполнить. Аргументы принимают форму конвейера, в котором каждый arg задает одно слово команды, а каждая отдельная команда порождает подпроцесс.

Если первые аргументы команды начинаются со знака "-", они считаются ключами команды, а не частью описания конвейера.

Возможные ключи:

-keepnewline
  Сохраняет конечные пробелы в выходных данных конвейера. Обычно они отсекаются.
-
  Отмечает конец ключей. Аргумент, следующий за этим ключом, рассматривается как первый аргумент arg, даже если он начинается со знака "-".

Перечисленные ниже аргументы (пары аргументов) используют не для определения подпроцессов, а для перенаправления потоков ввода и вывода между ними. В выражения типа "<fileName" fileName может писаться как отдельно, так и слитно ("<fileName>").

| | разделяет команды в конвейере. Стандартный вывод предыдущей команды направляется на стандартный вход следующей команды.
|& | разделяет команды в конвейере. Стандартный вывод и стандартный вывод ошибок предыдущей команды направляются на стандартный вход следующей команды. Такое выражение перебивает выражения типа 2> и >&.
< fileName | файл fileName отрывается и используется как стандартный ввод для первой команды конвейера.
<@ fileId | в этой форме fileId это идентификатор файла, открытого с помощью команды open. Он используется как стандартный ввод для первой команды конвейера. Файл должен быть открыт для чтения.
<< value | value используется как стандартный ввод для первой команды конвейера.
> fileName | Стандартный вывод последней команды перенаправляется в файл fileName и перезаписывает его содержимое.
2> fileName | Стандартный вывод ошибок всех команд в конвейере перенаправляется в файл fileName и перезаписывает его содержимое.
>& fileName | Стандартный вывод последней команды и стандартный вывод ошибок всех команд в конвейере перенаправляется в файл fileName и перезаписывает его содержимое.
>>fileName | Стандартный вывод последней команды перенаправляется в файл fileName и добавляется к его прежнему содержимому.
2>>fileName | Стандартный вывод ошибок всех команд в конвейере перенаправляется в файл fileName и добавляется к его прежнему содержимому.
>>& fileName | Стандартный вывод последней команды и стандартный вывод ошибок всех команд в конвейере перенаправляется в файл fileName и добавляется к его прежнему содержимому.
>@ ileId | В этой форме fileId это идентификатор файла, открытого с помощью команды open. Стандартный вывод последней команды перенаправляется в файл fileName и перезаписывает его содержимое. Файл должен быть открыт для записи.
2>@ fileId | В этой форме fileId это идентификатор файла, открытого с помощью команды open. Стандартный вывод ошибок всех команд в конвейере перенаправляется в файл fileName и перезаписывает его содержимое. Файл должен быть открыт для записи.
>&@ fileId | В этой форме fileId это идентификатор файла, открытого с помощью команды open. Стандартный вывод последней команды и стандартный вывод ошибок всех команд в конвейере перенаправляется в файл fileName и перезаписывает его содержимое. Файл должен быть открыт для записи.

Если стандартный вывод последней команды конвейера не был перенаправлен, то команда exec возвращает его значение. Если одна из команд конвейера вернула код ошибки, была прервана или приостановлена, то команда exec вернет код ошибки. При этом сообщение об ошибке будет включать стандартный вывод конвейера и сообщение об ошибке. В переменной errorCode будет записана дополнительная информация о последней встреченной ошибке. Если хотя бы одна из команд конвейера пишет информацию об ошибках в файл и стандартный вывод ошибок не перенаправлен, команда exec вернет ошибку, сообщение об ошибке будет включать в себя стандартный вывод конвейера, дополненный сообщениями об ошибках (если их было несколько) и стандартным выводом ошибок.

Если последний символ результата исполнения конвейера или сообщения об ошибке - перевод каретки, то он будет удален из результата или сообщения соответственно. Это соответствует общему правилу Tcl, по которому возвращаемая величина, как правило, не оканчивается символом перевода каретки. Однако, если указана опция -keepnewline, символ перевода каретки в конце сохраняется.
Если стандартный ввод конвейера не перенаправлен с помощью символов "<", "<<" или "<@", стандартный ввод в первую команду конвейера осуществляется со стандартного ввода приложения.

Если последним аргументом конвейера является "&", конвейер выполняется в фоновом режиме. В этом случае команда exec возвращает список идентификаторов всех процессов конвейера. Стандартный вывод последней команды конвейера, если он не перенаправлен, выводится на стандартный вывод приложения. Стандартный вывод ошибок, если он не перенаправлен, осуществляется в стандартный вывод ошибок приложения.

Первое слово в каждой команде считается именем команды. В нем выполняются тильда - подстановки. Если получившийся при этом результат не содержит слэшей, соответствующая команда ищется в каталогах, перечисленных в переменной окружения PATH. Если имя команды после подстановок содержит слэши, оно должно указывать на исполняемый файл, доступный из текущего каталога. Никакие другие подстановки в командах, например, принятые в shell подстановки * и ?, не выполняются.

## ВОПРОСЫ ПЕРЕНОСИМОСТИ НА ДРУГИЕ ПЛАТФОРМЫ

Windows (все версии)

  Чтение и запись с использование @ fileId'' не работают. Исполнение 16- и 32-разрядных приложений различается между собой и отличается от описанного выше. Tk консоль не реализует всех стандартных возможностей ввода/вывода.

  В командах допускается использование как прямых, так и обратных слэшей при указании пути команды. Однако, если путь является аргументом команды, это может оказаться и не так.

  Двойной слэш в путях указывает на сетевой адрес.

Windows NT
  Для выполнения встроенных команд shell, таких, как dir или copy, перед ними необходимо указать "cmd.exe /c".
Windows 95
  Для выполнения встроенных команд shell, таких, как dir или copy, перед ними необходимо указать "command.com /c".
Windows 3.X
  Возможности команды exec сильно ограничены.
Macintosh
  Команда exec не реализована.
Unix
  Команда exec позволяет исполнять любые приложения и действует как описано выше.