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