`test -s` для stdin отличается в Ubuntu Bash 4.4 от macOS bash 4.4, есть ли портативная альтернатива? - PullRequest
0 голосов
/ 18 октября 2018

У меня есть крошечный скрипт, который должен читать со стандартного ввода, пока он открыт, но я получаю другое поведение, когда запускаю его на bash 4.4 в Ubuntu (из образа Docker) и на bash 4.4 macOS (устанавливается вместе с brew))

Сценарий:

$ cat test.sh
#!/bin/bash
while test -s /dev/stdin; do read A; echo "-- $A --"; done

В macOS:

$ (echo one; echo two) | ./test.sh
-- one --
-- two --

В Ubuntu:

$ (echo one; echo two) | ./test.sh
# empty output

Есть ли другой способ проверить, что stdin открыт и непуст?Я тоже играл с read, но он тоже не казался портативным.

1 Ответ

0 голосов
/ 18 октября 2018

Вы можете изменить цикл чтения всего стандартного ввода на этот, чтобы он работал в обеих системах:

[[ ! -t 0 ]] && while IFS= read -r A; do echo "-- $A --"; done

[[ ! -t 0 ]]: Проверяет, поступают ли данные с терминала.

Тесты:

$> { echo one; echo two; } | ./test.sh
-- one --
-- two --

$> ./test.sh <<< $'abc\nfoo'
-- abc --
-- foo --

$> ./test.sh
$>
...