exec(3tcl)

NAME
exec - 呼叫子程序

總覽 SYNOPSIS
exec ?switches? arg ?arg ...?

描述 DESCRIPTION

這個命令把它的引數作為對要執行的一個或多個子程序的指定來對待。引數接受標準的 shell 管道的格式(form)，即每個 arg 都變成某個命令的一個字，並且每個不同的命令都變成一個子程序。

如果給 exec的初始的引數以 - 開始，則它們被作為命令列開關而不是管道指定的一部分來對待。當前支援下列開關:

-keepnewline
    在管道的輸出中保持尾隨的換行符。通常要刪除尾隨的換行符。

--  標誌開關(部分)的結束。此後的引數即使以-開頭仍被作為第一個 arg 來對待。

如果一個 arg (或成對的 arg)有象下面描述的格式個某一種，則exec 用它來控制子程序間的輸入和輸出流(flow)。將不把這樣的引數傳遞給子程序。在象“< fileName”這樣的格式中 fileName 可以要麼是一個與“<”分離的引數，要麼是在同一個引數中而沒有間隔的空格(例如 “<fileName”)。

|   分隔在管道中不同的命令。前面的命令的標準輸出將被輸送給後面命令的標準輸入中。

|&  分隔在管道中不同的命令。前面命令的標準輸出和標準錯誤輸出都被輸送到後面的標準輸入中。這種重定向格式取代象 2> 和 >& 這樣的格式。

< fileName
    開啟由 fileName 指名的檔案並作為在管道中的第一個命令的標準輸入來使用。

<@ fileId
    FileId 必須是一個打開了的檔案的識別符號，比如是從以前的 open 呼叫的返回值。作為在管道中的第一個命令的標準輸入來使用。FileId
     必須用讀模式來開啟。

<< value
    Value 被傳遞給第一個命令來作為它的標準輸入。

> fileName
    最後的命令的標準輸出被重定向到叫 fileName 的檔案中，覆蓋它以前的內容。

2> fileName
    把管道中所有命令的標準錯誤輸出重定向到叫 fileName 的檔案中，覆蓋它以前的內容。

>& fileName
    最後的命令的標準輸出和所有命令的標準錯誤輸出都被重定向到叫 fileName的檔案中，覆蓋它以前的內容。

>> fileName
    最後的命令的標準輸出被重定向到叫 fileName 的檔案中，對它進行新增而不是覆蓋它。

2>> fileName
    在管道中的所有的命令的標準錯誤輸出都被重定向到叫 fileName的檔案中，對它進行新增而不是覆蓋它。

>>& fileName
    最後的命令的標準輸出和所有命令的標準錯誤輸出被重定向到叫 fileName 的檔案中，對它進行新增而不是覆蓋它。

>@ fileId
    FileId 必須是一個打開了的檔案的識別符號，比如是從以前的 open呼叫的返回值。最後的命令的標準輸出被重定向到 fileId(指定)的檔案中。檔案必須用讀模式來開啟。

2>@ fileId
    FileId 必須是一個打開了的檔案的識別符號，比如是從以前的 open呼叫的返回值。在管道中的所有命令的標準錯誤輸出都被重定向到 fileId(指定)的檔案中。檔案必須用寫模式來開啟。

>&@ fileId
    FileId 必須是一個打開了的檔案的識別符號，比如是從以前的 open呼叫的返回值。最後的命令的標準輸出和所有命令的標準錯誤輸出被重定向到 fileId(指定)的檔案中。檔案必須用寫模式來開啟。

如果標準輸出沒有被重定向，則 exec 命令返回在管道中最後的命令的標準輸出。如果在管道中的任何命令不正常退出或被殺死或被掛起，則 exec 將返回一個錯誤和並且錯誤資訊將包含管道的輸出和隨後的描述不正常終止的錯誤資訊；errorCode 變數將包括關於最近所遭遇的不正常終止的額外的資訊。如果任何命令寫它的標準錯誤檔案而這個標準錯誤未被重定向，則 exec 將返回一個錯誤；錯誤訊息將包含管道的標準輸出，跟著是關於不正常終止的資訊(如果有的話)，隨後是標準錯誤輸出。

如果結果或錯誤資訊的最後的字元是一個換行符，則這個換行符通常被從結果或錯誤資訊中刪除。這是與其他 Tcl 返回值相一致的，它們通常不用換行(作為)結束。但是，如果指定了 -keepnewline則保持尾隨的換行符。

如果標準輸入未使用 “<” 、“<<” 或 “<@” 來重定向，則把應用的當前的標準輸入作為第一個命令的標準輸入。

如果最後的 arg 是“&”，則管道將在後臺執行。在這種情況下 exec命令將返回一個列表，列表的元素是在管道中所有子程序的程序識別符號。如果在管道中最後的命令的標準輸出未被重定向，則輸出到應用的標準輸出中，並且如果管道中所有的命令的錯誤輸出未被重定向，則錯誤輸出到應用的標準錯誤中。

每個命令中的第一個字被接受為命令的名字；在它上面進行“~”(tilde)替換，如果結果不包含斜槓，則在 PATH 環境變數中的目錄裡查詢給定名字的可執行檔案。如果名字包含斜槓，則它必須參照一個從當前目錄可到達的可執行檔案。在給命令的引數上不進行萬用字元 (glob) 擴充套件或其他的 shell 式的替換。

移植要點 PORTABILITY ISSUES

Windows (所有版本)
    從/向一個套介面讀或寫，使用“@ fileId”記號(notation)，不能工作。在從一個套介面讀的時候，一個16位 DOS 應用程式將掛起(hang) 而一個32位應用程式將立即返回檔案結束(end-of-file)。在任意型別的應用向一個套介面寫的時候，如果控制檯存在的話，資訊轉而傳送到控制檯，否則就丟棄資訊。

    Tk 控制檯文字元件不提供真實的標準 IO 功能。在 Tk 下，從標準輸入重定向的時候，所有的應用將看到一個立即的檔案結束；重定向到標準輸出或標準錯誤輸出的資訊將被丟棄。

    要麼是正斜槓要麼是反斜槓被接受為給 Tcl 命令的引數的路徑分隔符。在執行一個應用的時候，對應用的路徑名指定也可以包含正或反斜槓作為路徑分隔符。但是必須記住，多數 Windows 應用接受有正斜槓的引數作為選項分界符(delimiter)而反斜槓只在路徑中。指定了有正斜槓的一個路徑名的給應用的任何引數將不被自動的轉換成使用反斜槓字元。如果一個引數包括作為路徑分隔符的正斜槓，它可以被識別成路徑名，也可以不被識別成路徑名，這依賴於(具體)程式。

    額外的，在呼叫一個16位 DOS 或 Windows 3.X 應用時，所有路徑名必須使用短的、神秘的(cryptic)的路徑格式(例如，使用“applba~1.def”來替代 “applbakery.default”)。

    在一個路徑中在一行的兩個或更多的正或反斜槓參照一個網路路徑。例如，根目錄c:/ 和一個子目錄/windows/system的一個簡單的連線將產生c://windows/system (兩個斜槓在一起)，這參照的是在叫 windows 的那臺機器上的叫 system 的掛裝點(而 c:/ 被忽略)，這並不等價於 c:/windows/system，它描述的是在當前計算機上的一個目錄。應使用 file join 命令來連線路徑的成員。

Windows NT
    在嘗試執行一個應用時，exec 首先查詢指定的那個名字。接著按 .com、 .exe, 和 .bat 的次序把它們新增到指定的名字的後面並查詢這個加長了的名字。如果沒有指定一個目錄名作為應用(程式)名的一部分，在嘗試定位應用(程式)時，依次在下列目錄中自動查詢:

        裝載 Tcl 可執行檔案的目錄。
        當前目錄
        Windows NT 32位系統目錄。
        Windows NT 16位系統目錄。
        Windows NT 主目錄。
        在 path 中列出的目錄。

    要執行 shell 內建命令象 dir 和 copy, 呼叫者必須為想用的命令加上“cmd.exe /c ”前導 (prepend)。

Windows 95
    在嘗試執行一個應用時，exec首先查詢指定的那個名字。接著按 .com、 .exe, 和 .bat 的次序把它們新增到指定的名字的後面並查詢這個加長了的名字。如果沒有指定一個目錄名作為應用(程式)名的一部分，在嘗試定位應用(程式)時，依次在下列目錄中自動查詢:

        裝載 Tcl 可執行檔案的目錄。
        當前目錄。
        Windows 95 系統目錄。
        Windows 95 主目錄。
        在 path 中列出的目錄。

    要執行 shell 內建命令象 dir 和 copy, 呼叫者必須為想用的命令加上“command.exe /c ”前導(prepend)。

    一旦一個 16位 DOS 應用程式從一個控制檯讀標準輸入接著退出，所以後來執行的 16位 DOS 應用程式將看到標準輸入已經被關閉了。32位應用程式沒有這個問題並將正確執行，即使在一個 16位 DOS 應用程式認為標準輸入已經被關閉之後。此時還沒有針對這個缺陷的已知的工作專案(workaround)。

    NUL: </B> 裝置和一個 16位應用程式之間的重定向不總是工作。在從 NUL: 重定向時 一些應用程式可能掛起，另一些將得到永無窮盡(infinite)的“0x01”位元組流(stream)，而有一些實際上將正確的得到立即的檔案結束；這些行為象是依賴於編譯到應用程式自身中的某些東西。在到 NUL:的重定向大於或等於4K 時, 一些應用將掛起(hang)。在32位應用程式中不發生上述問題。

    所有 DOS 16位應用程式都是同步執行的。從一個管道到一個 16位 DOS 應用程式的所有標準輸入被蒐集到一個臨時檔案中；在這個16位 DOS 應用程式開始執行之前，管道的其他端點(end)必須被關閉。從一個16位 DOS應用程式到一個管道的所有標準輸出或錯誤輸出被蒐集到一個臨時檔案中；在臨時檔案被重定向到管道的下一個階段之前，這個應用程式必須終止。這源於一個針對 Windows 95在實現管道中的一個缺陷的工作專案，也是標準的 Windows 95 DOS shell 自身處理管道的方式。

    特定的應用程式，象 command.com ，不應該互動的執行。不從標準輸入讀和向標準輸出寫，而是直接訪問控制檯視窗的應用程式可能會失敗，並掛起Tcl，如果它們自己的私有控制檯視窗不可使用甚至可能掛起系統。

Macintosh
    在 Macintosh 下 exec 命令未被實現而不存在。

Unix
     exec 命令是全功能的並象上面描述的那樣工作。

參見 SEE ALSO
error(n), open(n)

關鍵字 KEYWORDS
execute, pipeline, redirection, subprocess

[中文版維護人]
寒蟬退士

[中文版最新更新]
2001/07/11

《中國 Linux 論壇 man 手冊頁翻譯計劃》:
http://cmpp.linuxforum.net

跋
本頁面中文版由中文 man 手冊頁計劃提供。
中文 man 手冊頁計劃：https://github.com/man-pages-zh/manpages-zh