Nie ma sposobu, aby zajrzeć do zawartości potoku za pomocą powszechnie dostępnych narzędzi powłoki, ani nie ma sposobu, aby odczytać znak do potoku, a następnie odłożyć go z powrotem. Jedynym sposobem, aby dowiedzieć się, że potok ma dane, jest odczytanie bajtu, a następnie musisz doprowadzić ten bajt do miejsca docelowego.
Więc zrób tak: przeczytaj jeden bajt; jeśli wykryjesz koniec pliku, zrób to, co chcesz, gdy wejście jest puste; jeśli czytasz bajt, rozwidlaj to, co chcesz zrobić, gdy dane wejściowe nie są puste, wstaw do niego ten bajt i potokuj pozostałe dane.
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
ifne
Narzędziowy z moreutils Joey Hessa wykonuje polecenie, jeśli jego wejście nie jest pusta. Zwykle nie jest instalowany domyślnie, ale powinien być dostępny lub łatwy do zbudowania na większości wariantów Uniksa. Jeśli dane wejściowe są puste, ifne
nic nie robi i zwraca stan 0, czego nie można odróżnić od komendy uruchomionej pomyślnie. Jeśli chcesz coś zrobić, jeśli dane wejściowe są puste, musisz ustawić komendę, aby nie zwracała 0, co można zrobić, zwracając rozróżnienie statusu błędu:
ifne sh -c 'do_stuff_with_input && exit 255'
case $? in
0) echo empty;;
255) echo success;;
*) echo failure;;
esac
test -t 0
nie ma z tym nic wspólnego; sprawdza, czy standardowe wejście jest terminalem. Nie mówi w żaden sposób, czy dane wejściowe są dostępne.