當 shell 執行外部命令/程式時 - 該程式是否有檔案描述符?

當 shell 執行外部命令/程式時 - 該程式是否有檔案描述符?


有很多關於shell的文件描述符以及如何操作這些文件描述符以進行重定向等的文檔rsynccat討論curl。外殼一樣嗎?
舉一個具體的例子,如果我在終端機提示字元下執行這個命令

% cat << EOF | php
<?php
echo "hello". PHP_EOL;
echo "another line" . PHP_EOL;
EOF

我假設這個heredoc的內容被輸入到STDIN,但是是哪個流程呢? shell,或者是否cat有一個文件描述符0並且heredoc的內容被直接提供給cat's fd0

答案1

首先我們要說的是,所有 I/O 無論是基於文件、互動式或任何其他方式都需要唯一的文件描述符。

互動式檔案描述符的標準化允許重定向和管道。

shell 是標準 I/O 操作的專家。

在您的範例中,cat被調用,其 STDIN 設定為代表 HEREDOC 腳本的 shell 輸出(透過 發送popen()),並將其 STDOUT 透過管道(使用 popen())連接到php的 STDIN。 php的輸出沒有被重定向,指向 shell 的初始 STDOUT。

相關內容