Нет возможности посмотреть содержимое канала с помощью общедоступных утилит оболочки, а также нет способа прочитать символ в канал и затем вернуть его обратно. Единственный способ узнать, что канал имеет данные, - это прочитать байт, а затем вы должны доставить этот байт к месту назначения.
Так что просто сделайте это: прочитайте один байт; если вы обнаружите конец файла, то делайте то, что хотите, когда ввод пуст; если вы действительно читаете байт, тогда выполните форк то, что вы хотите сделать, когда ввод не пустой, направьте в него этот байт и передайте остальные данные.
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
Утилита от moreutils Джои Гесса запускает команду , если ее ввод не пуст. Обычно он не устанавливается по умолчанию, но он должен быть доступен или прост в сборке на большинстве вариантов Unix. Если вход пуст, ifne
ничего не делает и возвращает статус 0, который нельзя отличить от успешно выполненной команды. Если вы хотите что-то сделать, если ввод пуст, вам нужно сделать так, чтобы команда не возвращала 0, что можно сделать, если в успешном случае вернуть различимый статус ошибки:
ifne sh -c 'do_stuff_with_input && exit 255'
case $? in
0) echo empty;;
255) echo success;;
*) echo failure;;
esac
test -t 0
не имеет к этому никакого отношения; он проверяет, является ли стандартный ввод терминалом. Это не говорит ничего так или иначе относительно того, доступен ли какой-либо вход.