open(3tcl) | Tcl Built-In Commands | open(3tcl) |
open - 開啟基於檔案或命令管道的一個通道
open fileName
open fileName access
open fileName access permissions
這個命令開啟一個檔案、串列埠、或命令管道並返回一個 通道識別符號用於將來被命令如 read、puts、和close 呼叫。如果 fileName 的第一個字元不是“|”則命令開啟一個檔案: fileName 給出要開啟的檔案的名字,並且它必須符合在 filename 手冊條目中描述的規範。
如果存在 access 引數,則它指示以何種方式訪問檔案(或命令管道)。在第一種形式下 access 可以是下列值:
在第二種形式下,access 由某些下列標誌的一個列表構成,所有這些都有標準的 POSIX 意義。 必須有一個標誌是 RDONLY、WRONLY 或 RDWR 中的一個。
如果作為開啟過程的一部分而建立了一個新檔案,使用 permissions (一個整數)並聯合程序的檔案模式建立掩碼為新檔案設定許可權。Permissions 預設為 0666。
Note that if you are going to be reading or writing binary data from the channel created by this command, you should use the fconfigure command to change the -translation option of the channel to binary before transferring any binary data. This is in contrast to the ``b'' character passed as part of the equivalent of the access parameter to some versions of the C library fopen() function.
如果 fileName is 的第一個字元是“|”,則把 fileName 的餘下的字元被作為描述要呼叫的一個命令管道的引數的一個列表來對待,與 exec 對待引數的方式相同。在這種情況下,依賴於 access 的值,使用由 open 返回的通道識別符號來向這個命令的輸入管道寫或從它的輸出管道讀。如果使用了只寫訪問(例如, access 是 w),則除非被這個命令所屏棄(override),這個(命令)管道的標準輸出被定向到當前的標準輸出上。如果使用了只讀訪問(例如,access 是 r),則除非被這個命令所屏棄(override),這個(命令)管道的標準輸入接受當前的標準輸入。
譯註
開啟用來寫的命令管道 Tcl ==> Pipeline ==> command +--------+ +--------+ +--------+ +--------+ | stdin |<------+ stdin | +-->| pipein | +--+ stdin | +--------+ +--------+ | +--------+ | +--------+ | stdout |<--+---+ stdout | | | pipeout|<--+ | stdout +--+ +--------+ | +--------+ | +--------+ +--------+ | | | stderr | | | stderr | | | +--------+ | +--------+ | | | channel+--+ | | +--------+ | +-----------------------------------------------+ 開啟一個用來讀的命令管道 +-----------------------------------------------+ | | +--------+ | +--------+ +--------+ +--------+ | | stdin |<--+---+ stdin | | pipein |<--+ | stdin +--+ +--------+ +--------+ +--------+ | +--------+ | stdout |<------+ stdout | +-->| pipeout| +--+ stdout | +--------+ +--------+ | +--------+ +--------+ | stderr | | | stderr | +--------+ | +--------+ | channel+--+ +--------+ Tcl <== Pipeline <== command
如果 fileName 參照一個串列埠,則開啟特定的串列埠並以依賴於平臺的方式初始化。給 fileName 用以開啟一個串列埠的可接受的值在移植要點中描述。
使用 fconfigure 命令來為開啟的串列埠查詢和設定下列選項:
在互動執行 Tcl 的時候,如果存在一個控制檯,則在真實的控制檯和使用標準輸入或輸出的一個命令管道之間可能有一些奇怪的相互作用。如果為從一個 32-bit 應用程式讀而開啟一個命令管道,在這個控制檯鍵入的一些擊鍵將被髮送到命令管道而一些擊鍵將別傳送到 Tcl 求值器。如果為向一個 32-bit 應用程式寫而開啟一個命令管道,在管道關閉之前,在控制檯中將一直沒有輸出是可見的。這些問題只發生在 Tcl 和子應用程式同時競爭這個控制檯的時候。如果命令管道是從一個指令碼中啟動的,所以 Tcl 不訪問控制檯,或者命令管道不使用標準輸出或輸出,而是重定向(從或)到一個檔案,那麼上述問題不發生。
不論 Tcl 是否在互動的執行,如果為從一個 16-bit DOS 應用程式讀而開啟一個命令管道,在從命令管道的標準輸出收到檔案結束之前,對 open 的呼叫一直不返回。如果為向一個 16-bit DOS 應用程式寫而開啟一個命令管道,在管道實際上被關閉之前,沒有資料被髮送到命令管道的標準輸出。象上面描述的那樣,這個問題發生的原因是 16-bit DOS 應用程式同步執行。
在 Macintosh 不支援開啟命令管道,原因是應用程式不支援標準輸入或輸出的概念。
在互動執行 Tcl 的時候,如果存在一個控制檯,則在真實的控制檯和使用標準輸入或輸出的一個命令管道之間可能有一些奇怪的相互作用。如果為讀而開啟一個命令管道,在這個控制檯鍵入的一些行將被髮送到命令管道而一些行將別傳送到 Tcl 求值器。這些問題只發生在 Tcl 和子應用程式同時競爭這個控制檯的時候。如果命令管道是從一個指令碼中啟動的,所以 Tcl 不訪問控制檯,或者命令管道不使用標準輸出或輸出,而是重定向(從或)到一個檔案,那麼上述問題不發生。
關於在不同平臺上執行應用程式請參見 exec 命令的移植要點章節來得到不特定於命令管道的額外的資訊。
file(n), close(n), filename(n), fconfigure(n), gets(n), read(n), puts(n), exec(n), fopen(1)
access mode, append, create, file, non-blocking, open, permissions, pipeline, process, serial
寒蟬退士
2001/10/16
http://cmpp.linuxforum.net
本頁面中文版由中文
man 手冊頁計劃提供。
中文 man
手冊頁計劃:https://github.com/man-pages-zh/manpages-zh
7.6 | Tcl |