3

Моя проблема в том, что мне нужен скрипт, который читает содержимое из канала, проверяет, является ли он пустым, и выводит его, если нет, как показано здесь:

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

Проблема в том, что cat читает из stdin, если канал пуст. Есть ли способ помешать этому? Или кошка не тот инструмент для использования здесь?

2 ответа2

4

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

1

test -t 0 , в моем случае не сработало, и люди здесь говорят, что это "недетерминированный" или что-то в этом роде. Мне нравится решение wc -c (count bytes), красивое и простое. Пустой ввод имеет 1 байт, тогда как один символ, например, echo "a" | wc -c дает 2

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

Этот вывод остается пригодным для использования благодаря скобкам вокруг read; if ... Смотрите этот Q & A

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .