Exec - Linux命令 - UNIX命令

exec - 調用子進程(es)

概要

exec開關argarg ...

描述

該命令將其參數視為要執行的一個或多個子進程的規範。 參數採用標準外殼管道的形式,其中每個參數都成為命令的一個單詞,並且每個不同的命令都變為一個子進程。

如果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主目錄。
路徑中列出的目錄。

為了執行像dircopy這樣的shell內建命令,調用者必須在命令前加上`` cmd.exe / c ''。

Windows 95

當試圖執行應用程序時, exec首先搜索指定的名稱。 然後,按順序將.com.exe.bat附加到指定名稱的末尾,並蒐索更長的名稱。 如果未指定目錄名稱作為應用程序名稱的一部分,則在嘗試查找應用程序時,會按順序自動搜索以下目錄:

從中加載Tcl可執行文件的目錄。
當前目錄。
Windows 95系統目錄。
Windows 95主目錄。
路徑中列出的目錄。

為了執行像dircopy這樣的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 )查看特定計算機上的命令使用方式。