[обновлено]
Это задание будет висеть бесконечно, если в трубе ничего нет ...
var="$(< /dev/stdin)"
Мы можем предотвратить это, сделав тайм-аут read
для первого символа. Если время ожидания истекло, код возврата будет больше 128, и мы будем знать, что канал STDIN (a.k.a /dev/stdin
) пуст.
В противном случае мы получим остаток STDIN ...
- установка
IFS
в NULL только для команды read
- отключение выходов с помощью
-r
- устранение разделителя чтения с помощью
-d ''
.
- и, наконец, добавив, что к персонажу мы получили изначально
Таким образом ...
__=""
_stdin=""
read -N1 -t1 __ && {
(( $? <= 128 )) && {
IFS= read -rd '' _stdin
_stdin="$__$_stdin"
}
}
В этом методе не используется var="$(command ...)"
Подстановка команд, которая, по замыслу, всегда удаляет любые завершающие символы новой строки.
Если предпочтительна подстановка команд, чтобы сохранить завершающие символы новой строки, мы можем добавить один или несколько символов-разделителей к выводу внутри $()
, а затем удалить их снаружи.
Например (примечание $(parens)
в первой команде и ${braces}
во второй) ...
_stdin="$(awk '{print}; END {print "|||"}' /dev/stdin)"
_stdin="${_stdin%|||}"