exec - 调用子进程(es)
概要
exec ? 开关 ? arg ? arg ... ?
描述
该命令将其参数视为要执行的一个或多个子进程的规范。 参数采用标准外壳管道的形式,其中每个参数都成为命令的一个单词,并且每个不同的命令都变为一个子进程。
如果exec的初始参数以-开头,那么它们被视为命令行开关,不属于管道规范的一部分。 目前支持以下开关:
-keepnewline
在管道输出中保留一个尾随的换行符。 通常一个尾随的换行符将被删除。
-
标记开关的结束。 在这一个之后的论点将被视为第一个arg,即使它以-开头。
如果arg (或arg对)具有下面描述的形式之一,那么exec使用它来控制子进程之间的输入和输出流。 这些参数不会传递给子进程。 在诸如``< fileName '之类的形式中, fileName可以与``<''分开,或者在没有中间空格的同一个参数中(即``< fileName '')。
|
分离流水线中不同的命令。 上一个命令的标准输出将被传送到下一个命令的标准输入中。
|&
分离流水线中不同的命令。 前一个命令的标准输出和标准错误都将输入到下一个命令的标准输入中。 这种重定向形式覆盖了诸如2>和>&的形式。
< 文件名
由fileName命名的文件将被打开并用作管道中第一个命令的标准输入。
<@ fileId
FileId必须是打开文件的标识符,例如先前要打开的调用的返回值。 它用作流水线中第一个命令的标准输入。 FileId必须已经打开才能阅读。
<< 价值
值作为其标准输入传递给第一个命令。
> fileName
最后一个命令的标准输出重定向到名为fileName的文件,覆盖其以前的内容。
2> fileName
管道中所有命令的标准错误将重定向到名为fileName的文件,并覆盖其之前的内容。
>& fileName
最后一个命令的标准输出和所有命令的标准错误都被重定向到名为fileName的文件,覆盖其以前的内容。
>> 文件名
最后一个命令的标准输出被重定向到名为fileName的文件,附加到文件而不是覆盖它。
2 >> fileName
管道中所有命令的标准错误将重定向到名为fileName的文件,并附加到该文件而不是覆盖它。
>>& fileName
最后一个命令的标准输出和所有命令的标准错误都被重定向到名为fileName的文件,追加到它而不是覆盖它。
> @ fileId
FileId必须是打开文件的标识符,例如先前要打开的调用的返回值。 最后一个命令的标准输出重定向到fileId的文件,该文件必须已经打开才能写入。
2> @ fileId
FileId必须是打开文件的标识符,例如先前要打开的调用的返回值。 管道中所有命令的标准错误都会重定向到fileId的文件。 该文件必须已经打开才能写入。
>&@ fileId
FileId必须是打开文件的标识符,例如先前要打开的调用的返回值。 最后一个命令的标准输出和所有命令的标准错误都被重定向到fileId的文件。 该文件必须已经打开才能写入。
如果标准输出没有被重定向,那么exec命令将返回管道中最后一个命令的标准输出。 如果管道中的任何命令异常退出或被终止或挂起,那么exec将返回一个错误,并且错误消息将包含管道输出,随后是描述异常终止的错误消息; errorCode变量将包含有关最近遇到的异常终止的附加信息。 如果任何命令写入其标准错误文件并且标准错误未被重定向,则exec将返回错误; 错误消息将包括管道的标准输出,后面是关于异常终止的消息(如果有),然后是标准错误输出。
如果结果或错误消息的最后一个字符是换行符,那么该字符通常会从结果或错误消息中删除。 这与其他Tcl返回值一致,通常不会以换行符结尾。 但是,如果指定了-keepnewline ,则保留了换行符。
如果标准输入没有使用“<”或“<<”或“<@”重定向,则管道中第一个命令的标准输入来自应用程序的当前标准输入。
如果最后一个参数是“&”,那么管道将在后台执行。 在这种情况下, exec命令将返回一个列表,其元素是流水线中所有子进程的进程标识符。 如果管道中的最后一个命令的标准输出未被重定向,则它将转到应用程序的标准输出,并且流水线中所有命令的错误输出将转到应用程序的标准错误文件,除非重定向。
每个命令中的第一个字作为命令名; 对它执行代字符替换,如果结果不包含斜杠,则PATH环境变量中的目录将按给定名称搜索可执行文件。 如果名称包含斜线,则它必须引用从当前目录可访问的可执行文件。 对命令的参数不执行“glob”扩展或其他类似shell的替换。
可移植性问题
Windows (所有版本)
使用`` fileId ''表示法读取或写入套接字不起作用。 从套接字读取时,16位DOS应用程序将挂起,32位应用程序将立即返回文件结束。 当任何一种类型的应用程序写入套接字时,信息都会发送到控制台(如果存在或丢弃)。
Tk控制台文本小部件不提供真正的标准IO功能。 在Tk下,当从标准输入重定向时,所有应用程序将立即看到文件结束; 重定向到标准输出或标准错误的信息将被丢弃。
无论是向前还是向后的斜杠都被接受为Tcl命令参数的路径分隔符。 在执行应用程序时,为应用程序指定的路径名称也可能包含正向或反向斜杠作为路径分隔符。 但请记住,大多数Windows应用程序只接受正斜杠参数作为选项分隔符和反斜杠,只能在路径中使用。 指定具有正斜杠的路径名的应用程序的任何参数都不会自动转换为使用反斜杠字符。 如果参数包含正斜杠作为路径分隔符,则根据程序的不同,它可能会也可能不会被识别为路径名称。
此外,在调用16位DOS或Windows 3.X应用程序时,所有路径名都必须使用简短,隐蔽的路径格式(例如,使用“applba〜1.def”而不是“applbakery.default” )。
路径中一行中的两个或多个向前或向后斜杠指的是网络路径。 例如,根目录c:/与一个子目录/ windows / system的简单连接将产生c:// windows / system (两个斜杠在一起),它指称为windows的称为系统的安装点(和c:/被忽略),并不等同于c:/ windows / system ,它描述了当前计算机上的一个目录。 文件连接命令应该用于连接路径组件。
Windows NT
当试图执行应用程序时, exec首先搜索指定的名称。 然后,按顺序将.com , .exe和.bat附加到指定名称的末尾,并搜索更长的名称。 如果未指定目录名称作为应用程序名称的一部分,则在尝试查找应用程序时,会按顺序自动搜索以下目录:
从中加载Tcl可执行文件的目录。
当前目录。
Windows NT 32位系统目录。
Windows NT 16位系统目录。
Windows NT主目录。
路径中列出的目录。
为了执行像dir和copy这样的shell内建命令,调用者必须在命令前加上`` cmd.exe / c ''。
Windows 95
当试图执行应用程序时, exec首先搜索指定的名称。 然后,按顺序将.com , .exe和.bat附加到指定名称的末尾,并搜索更长的名称。 如果未指定目录名称作为应用程序名称的一部分,则在尝试查找应用程序时,会按顺序自动搜索以下目录:
从中加载Tcl可执行文件的目录。
当前目录。
Windows 95系统目录。
Windows 95主目录。
路径中列出的目录。
为了执行像dir和copy这样的shell内建命令,调用者必须在命令前加上`` command.com / c ''。
一旦16位DOS应用程序从控制台读取标准输入并退出,随后运行的所有16位DOS应用程序都将看到标准输入已关闭。 即使在16位DOS应用程序认为标准输入已关闭后,32位应用程序也不会出现此问题并能正常运行。 目前还没有针对此错误的已知解决方法。
NUL:设备和16位应用程序之间的重定向并不总是有效。 当从NUL重定向时,某些应用程序可能会挂起,其他应用程序将获得无限的“0x01”字节流,其中一些实际上会正确地获得立即的文件结束; 行为似乎取决于编译到应用程序本身的东西。 将NUL重定向到4K以上时,某些应用程序将挂起。 上述问题在32位应用程序中不会发生。
所有的DOS 16位应用程序都是同步运行的。 从管道到16位DOS应用程序的所有标准输入都被收集到临时文件中; 在16位DOS应用程序开始执行之前,管道的另一端必须关闭。 从16位DOS应用程序到管道的所有标准输出或错误都会收集到临时文件中; 应用程序必须在临时文件重定向到管道的下一个阶段之前终止。 这是由于管道实现中的Windows 95错误的解决方法,而标准Windows 95 DOS外壳是如何处理管道本身的。
某些应用程序(如command.com )不应交互执行。 直接访问控制台窗口的应用程序,而不是读取其标准输入并写入其标准输出可能会失败,挂起Tcl,甚至挂起系统,如果他们自己的专用控制台窗口不可用。
苹果
执行命令未实现,并且在Macintosh下不存在。
Unix的
exec命令功能齐全,并按照描述工作。
也可以看看
错误 (n),打开(n)
关键词
执行,管道,重定向,子进程
重要提示:使用man命令( %man )查看特定计算机上的命令使用方式。