GNU bash, version 4.4.19(1)-release (x86_64-pc-linux-gnu)
ฟังก์ชั่นดังต่อไปนี้ได้รับการทดสอบโดยใช้ ระบบปฏิบัติการคือ Ubuntu 18 ฟังก์ชั่นนี้ใช้พารามิเตอร์เดียวซึ่งเป็นตัวบ่งชี้ไฟล์ที่ต้องการสำหรับ FIFO ที่ไม่ระบุชื่อ
MakeFIFO() {
local "MakeFIFO_upper=$(ulimit -n)"
if [[ $# -ne 1 || ${#1} -gt ${#MakeFIFO_upper} || -n ${1%%[0-9]*} || 10#$1 -le 2
|| 10#$1 -ge MakeFIFO_upper ]] || eval ! exec "$1<> " <(:) 2>"/dev/null"; then
echo "$FUNCNAME: $1: Could not create FIFO" >&2
return "1"
fi
}
GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin17)
ฟังก์ชั่นดังต่อไปนี้ได้รับการทดสอบโดยใช้ ระบบปฏิบัติการคือ macOS High Sierra ฟังก์ชั่นนี้จะเริ่มออกโดยการสร้างชื่อ FIFO ในไดเรกทอรีชั่วคราวที่รู้จักกันเฉพาะกระบวนการที่สร้างมันขึ้นมา จากนั้นตัวอธิบายไฟล์จะถูกเปลี่ยนเส้นทางไปยัง FIFO ท้ายที่สุด FIFO จะถูกยกเลิกการเชื่อมโยงจากชื่อไฟล์โดยการลบไดเรกทอรีชั่วคราว สิ่งนี้ทำให้ไม่ระบุชื่อ FIFO
MakeFIFO() {
MakeFIFO.SetStatus() {
return "${1:-$?}"
}
MakeFIFO.CleanUp() {
local "MakeFIFO_status=$?"
rm -rf "${MakeFIFO_directory:-}"
unset "MakeFIFO_directory"
MakeFIFO.SetStatus "$MakeFIFO_status" && true
eval eval "${MakeFIFO_handler:-:}'; true'"
}
local "MakeFIFO_success=false" "MakeFIFO_upper=$(ulimit -n)" "MakeFIFO_file="
MakeFIFO_handler="$(trap -p EXIT)"
MakeFIFO_handler="${MakeFIFO_handler#trap -- }"
MakeFIFO_handler="${MakeFIFO_handler% *}"
trap -- 'MakeFIFO.CleanUp' EXIT
until "$MakeFIFO_success"; do
[[ $# -eq 1 && ${#1} -le ${#MakeFIFO_upper} && -z ${1%%[0-9]*}
&& 10#$1 -gt 2 && 10#$1 -lt MakeFIFO_upper ]] || break
MakeFIFO_directory=$(mktemp -d) 2>"/dev/null" || break
MakeFIFO_file="$MakeFIFO_directory/pipe"
mkfifo -m 600 $MakeFIFO_file 2>"/dev/null" || break
! eval ! exec "$1<> $MakeFIFO_file" 2>"/dev/null" || break
MakeFIFO_success="true"
done
rm -rf "${MakeFIFO_directory:-}"
unset "MakeFIFO_directory"
eval trap -- "$MakeFIFO_handler" EXIT
unset "MakeFIFO_handler"
"$MakeFIFO_success" || { echo "$FUNCNAME: $1: Could not create FIFO" >&2; return "1"; }
}
ฟังก์ชั่นด้านบนสามารถรวมเข้ากับฟังก์ชั่นเดียวที่จะทำงานกับทั้งสองระบบปฏิบัติการ ด้านล่างเป็นตัวอย่างของฟังก์ชั่นดังกล่าว ที่นี่มีความพยายามในการสร้าง FIFO ที่ไม่ระบุชื่ออย่างแท้จริง หากไม่สำเร็จระบบจะสร้างและแปลง FIFO ที่มีชื่อเป็น FIFO แบบไม่ระบุชื่อ
MakeFIFO() {
MakeFIFO.SetStatus() {
return "${1:-$?}"
}
MakeFIFO.CleanUp() {
local "MakeFIFO_status=$?"
rm -rf "${MakeFIFO_directory:-}"
unset "MakeFIFO_directory"
MakeFIFO.SetStatus "$MakeFIFO_status" && true
eval eval "${MakeFIFO_handler:-:}'; true'"
}
local "MakeFIFO_success=false" "MakeFIFO_upper=$(ulimit -n)" "MakeFIFO_file="
MakeFIFO_handler="$(trap -p EXIT)"
MakeFIFO_handler="${MakeFIFO_handler#trap -- }"
MakeFIFO_handler="${MakeFIFO_handler% *}"
trap -- 'MakeFIFO.CleanUp' EXIT
until "$MakeFIFO_success"; do
[[ $# -eq 1 && ${#1} -le ${#MakeFIFO_upper} && -z ${1%%[0-9]*}
&& 10#$1 -gt 2 && 10#$1 -lt MakeFIFO_upper ]] || break
if eval ! exec "$1<> " <(:) 2>"/dev/null"; then
MakeFIFO_directory=$(mktemp -d) 2>"/dev/null" || break
MakeFIFO_file="$MakeFIFO_directory/pipe"
mkfifo -m 600 $MakeFIFO_file 2>"/dev/null" || break
! eval ! exec "$1<> $MakeFIFO_file" 2>"/dev/null" || break
fi
MakeFIFO_success="true"
done
rm -rf "${MakeFIFO_directory:-}"
unset "MakeFIFO_directory"
eval trap -- "$MakeFIFO_handler" EXIT
unset "MakeFIFO_handler"
"$MakeFIFO_success" || { echo "$FUNCNAME: $1: Could not create FIFO" >&2; return "1"; }
}
นี่คือตัวอย่างของการสร้าง FIFO แบบไม่ระบุชื่อจากนั้นเขียนข้อความบางส่วนไปที่ FIFO เดียวกัน
fd="6"
MakeFIFO "$fd"
echo "Now is the" >&"$fd"
echo "time for all" >&"$fd"
echo "good men" >&"$fd"
ด้านล่างเป็นตัวอย่างของการอ่านเนื้อหาทั้งหมดของ FIFO นิรนาม
echo "EOF" >&"$fd"
while read -u "$fd" message; do
[[ $message != *EOF ]] || break
echo "$message"
done
สิ่งนี้สร้างผลลัพธ์ต่อไปนี้
Now is the
time for all
good men
คำสั่งด้านล่างปิด FIFO นิรนาม
eval exec "$fd>&-"
การอ้างอิง:
การสร้างไปป์ที่ไม่ระบุชื่อเพื่อใช้
ในภายหลังไฟล์ในไดเรกทอรีที่เขียนได้สาธารณะมีความปลอดภัยของเชลล์สคริปต์อันตราย