Немає можливості зазирнути до вмісту труби, використовуючи загальнодоступні утиліти оболонки, а також немає способу прочитати символ до труби, а потім повернути її назад. Єдиний спосіб дізнатися, що труба має дані, - це прочитати байт, і тоді ви повинні дістати цей байт до місця призначення.
Тож робіть саме так: прочитайте один байт; якщо ви виявите кінець файлу, тоді робіть те, що ви хочете зробити, коли вхід порожній; якщо ви читаєте байт, то розщеліть те, що ви хочете зробити, коли вхід не порожній, вставте цей байт і передайте решту даних.
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
не має нічого спільного з цим; він перевіряє, чи є стандартним входом термінал. Він нічого не говорить так чи інакше про те, чи є якісь дані.