Es gibt keine Möglichkeit, den Inhalt einer Pipe mit den allgemein verfügbaren Shell-Dienstprogrammen zu überprüfen, noch gibt es eine Möglichkeit, ein Zeichen in die Pipe einzulesen und es dann zurückzusetzen. Die einzige Möglichkeit zu erkennen, dass eine Pipe Daten enthält, besteht darin, ein Byte zu lesen und dieses Byte dann an sein Ziel zu bringen.
Tun Sie einfach Folgendes: Lesen Sie ein Byte. Wenn Sie ein Dateiende erkennen, tun Sie, was Sie tun möchten, wenn die Eingabe leer ist. Wenn Sie ein Byte lesen, geben Sie an, was Sie tun möchten, wenn die Eingabe nicht leer ist, leiten Sie dieses Byte hinein und leiten Sie den Rest der Daten.
first_byte=$(dd bs=1 count=1 2>/dev/null | od -t o1 -A n | tr -dc 0-9)
if [ -z "$first_byte" ]; then
# stuff to do if the input is empty
else
{
printf "\\$first_byte"
cat
} | {
# stuff to do if the input is not empty
}
fi
Das ifne
Hilfsprogramm aus Joey Hess 'moreutils führt einen Befehl aus, wenn seine Eingabe nicht leer ist. Es wird normalerweise nicht standardmäßig installiert, sollte jedoch verfügbar sein oder auf den meisten Unix-Varianten einfach aufzubauen sein. Wenn die Eingabe leer ist, ifne
wird nichts ausgeführt und der Status 0 zurückgegeben, der nicht von dem Befehl unterschieden werden kann, der erfolgreich ausgeführt wird. Wenn Sie etwas tun möchten, wenn die Eingabe leer ist, müssen Sie dafür sorgen, dass der Befehl keine 0 zurückgibt. Dies kann erfolgen, indem der Erfolgsfall einen erkennbaren Fehlerstatus zurückgibt:
ifne sh -c 'do_stuff_with_input && exit 255'
case $? in
0) echo empty;;
255) echo success;;
*) echo failure;;
esac
test -t 0
hat nichts damit zu tun; Es wird geprüft, ob die Standardeingabe ein Terminal ist. Auf die eine oder andere Weise sagt es nichts darüber aus, ob ein Eingang verfügbar ist.