![當 shell 執行外部命令/程式時 - 該程式是否有檔案描述符?](https://rvso.com/image/88791/%E7%95%B6%20shell%20%E5%9F%B7%E8%A1%8C%E5%A4%96%E9%83%A8%E5%91%BD%E4%BB%A4%2F%E7%A8%8B%E5%BC%8F%E6%99%82%20-%20%E8%A9%B2%E7%A8%8B%E5%BC%8F%E6%98%AF%E5%90%A6%E6%9C%89%E6%AA%94%E6%A1%88%E6%8F%8F%E8%BF%B0%E7%AC%A6%EF%BC%9F.png)
有很多關於shell的文件描述符以及如何操作這些文件描述符以進行重定向等的文檔rsync
和cat
討論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。