Shell-One-Liner: Ist eine URL erreichbar?

Ob eine URL (http, ftp) erreichbar ist, ist schnell überprüft:

curl --head --fail --silent --output /dev/null www.google.at

(Original von http://stackoverflow.com/a/12199125/841033)

Der Reihe nach:

curl --head http://test.url

Das Programm curl holt sich nur die Kopf-Daten der URL, ohne die Daten selbst anzufordern. Das reicht, um herauszufinden, ob eine URL gültig ist, oder nicht. Die erste Zeile gibt bei http URLs z.B. den Status Code ("HTTP/1.1 200 OK" oder "HTTP/1.1 404 Not Found").

Bei FTP URLs gibt uns curl entweder Informationen über die Datei, oder einen Fehlercode.

curl --head --fail http://test.url

Mit --fail können die Ausgabe im Fehlerfall reduzieren. Der Unterschied zeigt sich vor allem bei HTTP Anfragen. Hier wird die Ausgabe einzeilig, z.B.

curl --head --fail www.google.at/notExistingURL
curl: (22) The requested URL returned error: 404
curl --head --fail www.google.tld
curl: (6) Couldn't resolve host 'www.google.tld'

Für noch besseren Script-Support, unterdrückt die Option --silent jegliche Fehlermeldung. Einzig der Returncode von curl kann jetzt verraten, warum es nicht geklappt hat (bei Erfolg werden nach wie vor die Kopfdaten ausgegeben):

curl --head --fail --silent www.google.tld; echo $?
6
curl --head --fail --silent www.google.at/notExisting; echo $?
22

Jetzt müssen wir nur noch die Ausgabe im Erfolgsfall unterdrücken. Dazu schicken wir den regulären Output mit --output /dev/nullins Nirvana:

curl --head --fail --silent --output /dev/null www.google.at; echo $?
0
curl --head --fail --silent --output /dev/null www.google.tld; echo $? 
6

Wer seine Scripte mit Fehlermeldungen garnieren will, dem sei aber lieber folgendes angeraten:

eval "$({ stderr=$({ stdout=$(curl --fail --head www.google.at); ret=$?; } 2>&1; declare -p stdout ret >&2); declare -p stderr; } 2>&1)";

Details dazu hier: https://www.psit.at/blogs/peter-schmidt/20150729-shell-one-liner-stdout-...