Kesinlikle " sadece Bash ve başka hiçbir şey " ibaresini alarak, daha önceki cevapların ( @ Chris'in , @ 131'sinin ) herhangi bir harici yardımcı programı (standart olanları bile değil) çağıran, aynı zamanda ikili dosyalarla çalışan bir uyarlaması :
#!/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>&-
}
İle kullanın download http://path/to/file > file
.
NUL baytlarıyla anlaşma yaptık read -d ''
. Bir NUL baytına kadar okur ve eğer bulursa doğru, false ise doğru döndürür. Bash, NUL baytlarını dizelerde işleyemez, bu nedenle read
true olduğunda , NUL baytını yazdırırken elle ekleriz ve false döndürdüğünde, artık NUL baytı olmadığını biliyoruz ve bu, son veri parçası olmalı. .
Ortada NUL bulunan dosyalar üzerinde Bash 4.4 ile test edildi ve sıfıra, bir veya iki NUL ile ve ayrıca Debian'dan gelen wget
ve curl
ikili dosyalara kadar bitti . 373 kB'lik wget
ikili dosyayı indirmek yaklaşık 5.7 saniye sürdü. Yaklaşık 65 kB / s veya 512 kb / s'den biraz daha yüksek bir hız.
Buna karşılık, @ 131'in kedi çözeltisi, 0.1 s'den daha az bir sürede veya neredeyse yüz kat daha hızlı sonuç verir. Çok şaşırtıcı değil, gerçekten.
Bu aptalca aptalca, çünkü harici programları kullanmadan indirilen dosya ile yapabileceğimiz pek bir şey yok, çalıştırılabilir bile yapmıyoruz.
gawk