Как узнать, есть ли что прочитать перед вызовом во время чтения?

То, что вы хотите сделать, противоречит стандарту, потому что стандарт определяет, что расширение макроса оболочки происходит до того, как будет настроена конкретная среда.

Существует еще способ делать то, что вам нравится, поскольку POSIX требует, чтобы операторы среды перед special shell builtinвоздействовали на всю оболочку. Команда :является такой special shell builtin.

Попробуйте:

(x="foo" :; a) | (x="bar" :; b)

Это необходимо сделать в подоболочке, чтобы предотвратить влияние основного процесса оболочки. Если вы замените aи bна echo $x,, теперь будет напечатано то, что ожидал ОП в своем комментарии :

.
(x="foo" :; echo $x) | (x="bar" :; echo $x)

Ну, выход с левой стороны трубы пропал...

Но так как вам уже нужно использовать подоболочку, вы можете использовать:

 (x="foo"; echo $x) | (x="bar"; echo $x)

, который использует синтаксис, чтобы сначала установить переменную оболочки в подоболочке, а затем использовать ее. Если вам нужно xв качестве среды в командах, вам нужно export xв последнем примере.

1
31.12.2019, 15:02
1 ответ

В частности, с bash, read -t0вернет true, если есть что-то для чтения или на стандартный ввод, или был достигнут конец ввода, и false в противном случае.

if read -t0; then
  echo "there's something to be read on stdin, or end-of-file is reached"
else
  echo "there's nothing that may be read from stdin at the moment"
fi

Обратите внимание, что он вернет true, даже если то, что нужно прочитать, не является полной строкой или даже полным символом, поэтому последующий readвсе еще может зависнуть в ожидании неэкранированного разделителя строк.

Если стандартный ввод находится в неблокирующем -режиме или если стандартный ввод недоступен для чтения, read -t0всегда будет возвращать true.

2
28.04.2021, 23:26

Теги

Похожие вопросы