निम्नलिखित फ़ंक्शन का उपयोग करके परीक्षण किया गया था 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 हाई सिएरा था। यह फ़ंक्शन एक अस्थायी निर्देशिका में नाम 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 में बदल जाता है।
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>&-"
संदर्भ:
बाद
में सार्वजनिक रूप से लिखने योग्य निर्देशिकाओं में फ़ाइलों का उपयोग करने के लिए एक अनाम पाइप बनाना खतरनाक
शैल स्क्रिप्ट सुरक्षा है