有很多關於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。