নিম্নলিখিত ফাংশনটি ব্যবহার করে পরীক্ষা করা হয়েছিল GNU bash, version 4.4.19(1)-release (x86_64-pc-linux-gnu)
। অপারেটিং সিস্টেমটি ছিল উবুন্টু 18 This এই ফাংশনটিতে একটি একক প্যারামিটার লাগে যা বেনামে ফিফোর জন্য পছন্দসই ফাইল বর্ণনাকারী।
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)
। অপারেটিং সিস্টেমটি ছিল ম্যাকওএস হাই সিয়েরা। এই ফাংশনটি কেবলমাত্র তৈরি করা প্রক্রিয়াটির জন্য পরিচিত একটি অস্থায়ী ডিরেক্টরিতে একটি নামী ফিফো তৈরি করে শুরু হয় । এরপরে, ফাইল বর্ণনাকারী ফিফোর কাছে পুনঃনির্দেশিত হয়। অবশেষে, অস্থায়ী ডিরেক্টরিটি মোছার মাধ্যমে ফিফোর ফাইল নাম থেকে লিঙ্কমুক্ত করা হয়। এটি ফিফোর বেনামে পরিণত করে।
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"; }
}
উপরের ফাংশনগুলি একটি একক ফাংশনে একত্রিত হতে পারে যা উভয় অপারেটিং সিস্টেমে কাজ করবে। নীচে যেমন একটি ফাংশন উদাহরণ। এখানে, সত্যিকার অর্থে একটি বেনামে ফিফো তৈরির চেষ্টা করা হয়েছে। যদি ব্যর্থ হয়, তবে একটি নামী ফিফো তৈরি করা হবে এবং একটি বেনামে ফিফায় রূপান্তর করা হবে।
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"; }
}
এখানে বেনামে ফিফো তৈরির উদাহরণ রয়েছে, তারপরে একই ফিফোতে কিছু পাঠ্য লেখা।
fd="6"
MakeFIFO "$fd"
echo "Now is the" >&"$fd"
echo "time for all" >&"$fd"
echo "good men" >&"$fd"
বেনামে ফিফোর সম্পূর্ণ বিষয়বস্তু পড়ার উদাহরণ নীচে দেওয়া হয়েছে।
echo "EOF" >&"$fd"
while read -u "$fd" message; do
[[ $message != *EOF ]] || break
echo "$message"
done
এটি নিম্নলিখিত আউটপুট উত্পাদন করে।
Now is the
time for all
good men
নীচের কমান্ডটি বেনামে ফিফো বন্ধ করে দেয়।
eval exec "$fd>&-"
তথ্যসূত্র:
পরে ব্যবহারের জন্য বেনামে পাইপ তৈরি করা
জনসাধারণের জন্য লিখিতযোগ্য ডিরেক্টরিতে ফাইলগুলি বিপজ্জনক
শেল স্ক্রিপ্ট সুরক্ষা