Unter dem „ nur Bash und nichts anderes “ streng, hier ist eine Anpassung der früherer Antworten ( @ Chris , @ 131 ist ) , die keine externen Versorgungs nicht nennen (auch nicht Standard ist) , sondern arbeitet auch mit binären Dateien:
#!/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>&-
}
Verwenden Sie mit download http://path/to/file > file
.
Wir beschäftigen uns mit NUL Bytes mit read -d ''
. Es liest bis zu einem NUL-Byte und gibt true zurück, wenn es eines gefunden hat, false, wenn dies nicht der Fall ist. Bash kann keine NUL-Bytes in Strings verarbeiten. Wenn also read
true zurückgegeben wird, wird das NUL-Byte beim Drucken manuell hinzugefügt. Wenn false zurückgegeben wird, wissen wir, dass keine NUL-Bytes mehr vorhanden sind. Dies sollte das letzte Datenelement sein .
Getestet mit Bash 4.4 für Dateien mit NULs in der Mitte und endend mit null, einer oder zwei NULs sowie mit den Binärdateien wget
und curl
von Debian. Das wget
Herunterladen der 373-kB- Binärdatei dauerte etwa 5,7 Sekunden. Eine Geschwindigkeit von ca. 65 kB / s oder etwas mehr als 512 kB / s.
Im Vergleich dazu ist die cat-solution von @ 131 in weniger als 0,1 s oder fast hundertmal schneller fertig. Eigentlich nicht sehr überraschend.
Das ist natürlich albern, da wir ohne externe Dienstprogramme nicht viel mit der heruntergeladenen Datei anfangen können, nicht einmal, um sie ausführbar zu machen.
gawk