
我正在編寫一個 C++ 應用程序,需要在 Bash shell 中處理進程替換。
我正在嘗試找到一種方法來驗證作為參數傳遞給我的程式的路徑,其中一些路徑指向由進程替換創建的 FIFO 檔案。
是否有 shell(或 C++)方法可以檢查系統是否建立這些檔案/dev/fd
或它們是否在其他地方建立?
答案1
簡短的回答是你不能這樣做。僅僅因為 bash 預設放置 fifo 路徑的目錄,並不意味著該目錄中的特定 fifo 是由 bash 創建的,或者它是由 bash 作為參數傳遞給命令的。
從更大的角度看你的問題。你真正想解決什麼問題?
如果您試圖解決「我的程式的輸出必須始終透過管道傳輸到另一個程式」的問題,那麼就不需要用戶使用 bash 的晦澀的進程替換。如果系統上的預設 shell 是 zsh 怎麼辦?伯恩外殼?科恩殼?
相反,讓您的程式建立一個管道、分叉並執行另一個程式。
那麼,你真正想做什麼?如果您(上帝禁止)將輸出寫入程式使用者傳遞的檔案而不是 bash 創建的 fifo 中,會發生什麼?
答案2
使用該-p
選項來確定test
文件是否為管道:
#!/bin/bash
file="$1"
if [ -p "$file" ]
then
echo "$file is a pipe"
fi
演示:
$ myscript.sh <(echo hello)
/dev/fd/63 is a pipe