BASH - Перевірте, чи невідома труба порожня


4

Моя проблема полягає в тому, що я хочу, щоб сценарій, який читає вміст з труби, перевіряв, чи він порожній, і виводив його, якщо ні, як показано тут:

#!/bin/bash
var=$(cat -)
if [ -n "$var" ]
then
    echo "$var"
else
    echo "Pipe was empty"
fi

Проблема в тому, що кішка читає зі stdin, якщо труба порожня. Чи є якийсь спосіб завадити коту робити це? Або кішка невірний інструмент для використання тут?

Відповіді:


5

Використовуйте read -t 0 -N 0для виявлення наявності даних на stdin. Використовуйте test -t 0або ttyспробуйте визначити, чи підключена труба до stdin.


1
Я вірю -t 0і -N 0є зайвими.
Привіт71

Будь-який спосіб скласти це разом у сценарій, тому що я не впевнений, як це усвідомити. Вибачте, але я читаю не дуже часто (читаю лише -n чи читаю як є)
MechMK1

if test -t 0; then echo "None"; else echo "$(cat -)"; fiЩойно з'ясували шляхом спроб та помилок
MechMK1

1

test -t 0, не працював у моєму випадку, і люди тут кажуть, що це "недетерміновано" чи щось таке. Мені подобається рішення wc -c(рахувати байти), приємне і просте. Порожній вхід має 1 байт, тоді як один символ, наприклад, echo "a" | wc -cдає 2

| (read line; if [ $(echo "$line" | wc -c) -gt 1 ]; then echo "$line"; fi) |

Цей висновок залишається здатним працювати в трубі, завдяки дужкам навколо read; if ...Дивіться цю запитання


Вам також знадобиться опція -t(тайм-аут), інакше readбуде чекати введення користувачем у разі порожньої труби.
Сузана
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.