" কেবল বাশ এবং অন্য কিছুই নয় " কঠোরভাবে গ্রহণ করা, এখানে পূর্বের উত্তরগুলির একটি রূপান্তর ( @ ক্রিস , @ 131 এর ) যা কোনও বাহ্যিক ইউটিলিটিগুলি (এমনকি মানকগুলি নয়) কল করে না তবে বাইনারি ফাইলগুলির সাথেও কাজ করে:
#!/bin/bash
download() {
read proto server path <<< "${1//"/"/ }"
DOC=/${path// //}
HOST=${server//:*}
PORT=${server//*:}
[[ x"${HOST}" == x"${PORT}" ]] && PORT=80
exec 3<>/dev/tcp/${HOST}/$PORT
# send request
echo -en "GET ${DOC} HTTP/1.0\r\nHost: ${HOST}\r\n\r\n" >&3
# read the header, it ends in a empty line (just CRLF)
while IFS= read -r line ; do
[[ "$line" == $'\r' ]] && break
done <&3
# read the data
nul='\0'
while IFS= read -d '' -r x || { nul=""; [ -n "$x" ]; }; do
printf "%s$nul" "$x"
done <&3
exec 3>&-
}
সাথে ব্যবহার করুন download http://path/to/file > file
।
আমরা NUL বাইট সঙ্গে ডিল read -d ''
। এটি এনএলইউ বাইট না হওয়া পর্যন্ত পড়ে এবং যদি এটি পাওয়া যায় তবে সত্যটি ফিরে আসে, যদি তা না পাওয়া যায় তবে তা মিথ্যা। বাশ স্ট্রিংগুলিতে NUL বাইটগুলি পরিচালনা করতে পারে না, সুতরাং যখন read
সত্য দিয়ে ফিরে আসে, আমরা মুদ্রণের সময় ম্যানুয়ালি NUL বাইট যুক্ত করি এবং যখন এটি মিথ্যা ফিরে আসে, আমরা জানি যে কোনও NUL বাইট নেই আর এটি ডেটার শেষ টুকরো হওয়া উচিত ।
সঙ্গে মাঝখানে NULs সঙ্গে ফাইল ব্যাশ 4.4 সঙ্গে পরিক্ষিত এবং শূন্য, এক বা দুই NULs শেষ হওয়া, এবং এছাড়াও wget
এবং curl
ডেবিয়ান থেকে বাইনেরিতে। 373 কেবি wget
বাইনারি ডাউনলোড করতে প্রায় 5.7 সেকেন্ড সময় নিয়েছিল। প্রায় 65 কেবি / গুলি গতি বা 512 কেবি / সেকেন্ডের থেকে কিছুটা বেশি।
তুলনায়, @ 131 এর বিড়াল-দ্রবণটি 0.1 s এর কম বা প্রায় একশগুণ দ্রুত শেষ হয়। সত্যিই খুব অবাক হওয়ার কিছু নেই।
এটি স্পষ্টতই নির্বোধ, যেহেতু বাহ্যিক ইউটিলিটিগুলি ব্যবহার না করে, ডাউনলোড করা ফাইলের সাথে আমরা তেমন কিছু করতে পারি না, এমনকি এটি সম্পাদনযোগ্যও করে তুলি না।
gawk