" बस बैश और कुछ नहीं " को सख्ती से लेते हुए , यहां पहले के उत्तरों ( @ क्रिस , @ 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
।
हम एनयूएल बाइट्स के साथ सौदा करते हैं read -d ''
। यह एक एनयूएल बाइट तक पढ़ता है, और अगर यह एक नहीं मिला, तो यह सच है कि अगर यह नहीं मिला, तो यह सही है। बैश स्ट्रिंग्स में एनयूएल बाइट्स को संभाल नहीं सकते हैं, इसलिए जब read
सच के साथ रिटर्न होता है, तो हम प्रिंटिंग करते समय मैन्युअल रूप से एनयूएल बाइट जोड़ते हैं, और जब यह गलत हो जाता है, तो हम जानते हैं कि कोई एनयूएल बाइट्स नहीं हैं और यह डेटा का अंतिम टुकड़ा होना चाहिए। ।
के साथ बीच में NULs साथ फाइलों पर बैश 4.4 के साथ परीक्षण किया गया, और शून्य, एक या दो NULs में समाप्त होने वाले हैं, और भी wget
और curl
डेबियन से बाइनरी। 373 kB wget
बाइनरी को डाउनलोड करने में लगभग 5.7 सेकंड का समय लगा। लगभग 65 kB / s की गति या 512 kb / s से थोड़ा अधिक।
इसकी तुलना में, @ 131 का कैट-सॉल्यूशन 0.1 एस से कम या लगभग सौ गुना तेज है। बहुत आश्चर्य की बात नहीं, वास्तव में।
यह स्पष्ट रूप से मूर्खतापूर्ण है, क्योंकि बाहरी उपयोगिताओं के बिना, हम डाउनलोड की गई फ़ाइल के साथ बहुत कुछ नहीं कर सकते हैं, इसे निष्पादन योग्य भी नहीं बनाते हैं।
gawk