Se você tiver o bash 2.04 ou acima com o pseudo-dispositivo /dev/tcp
habilitado, você pode baixar um arquivo do próprio bash.
Cole o seguinte código diretamente em um bash shell (você não precisa salvar o código em um arquivo para execução):
function __wget() {
: ${DEBUG:=0}
local URL=$1
local tag="Connection: close"
local mark=0
if [ -z "${URL}" ]; then
printf "Usage: %s \"URL\" [e.g.: %s http://www.google.com/]" \
"${FUNCNAME[0]}" "${FUNCNAME[0]}"
return 1;
fi
read proto server path <<<$(echo ${URL//// })
DOC=/${path// //}
HOST=${server//:*}
PORT=${server//*:}
[[ x"${HOST}" == x"${PORT}" ]] && PORT=80
[[ $DEBUG -eq 1 ]] && echo "HOST=$HOST"
[[ $DEBUG -eq 1 ]] && echo "PORT=$PORT"
[[ $DEBUG -eq 1 ]] && echo "DOC =$DOC"
exec 3<>/dev/tcp/${HOST}/$PORT
echo -en "GET ${DOC} HTTP/1.1\r\nHost: ${HOST}\r\n${tag}\r\n\r\n" >&3
while read line; do
[[ $mark -eq 1 ]] && echo $line
if [[ "${line}" =~ "${tag}" ]]; then
mark=1
fi
done <&3
exec 3>&-
}
Você pode executá-lo a partir do shell da seguinte forma:
__wget http://example.iana.org/
Fonte: a resposta de Moreaki atualizando e instalando pacotes através da linha de comando do cygwin?
Atualização: como mencionado no comentário, a abordagem descrita acima é simplista:
- o
read
trash as barras invertidas e os principais espaços em branco. - O Bash não consegue lidar com bytes NUL muito bem, então os arquivos binários estão fora.
- sem coquete
$line
será glob.