Чтобы прочитать 1 символ, используйте вместо этого -N
, который всегда читает один символ и не выполняет $IFS
обработку:
read -rN1 var
read -rn1
читает одну запись до одного символа и по-прежнему выполняет $IFS
обработку (, а новая строка имеет значение по умолчанию $IFS
, что объясняет, почему вы получаете пустой результат, даже если вы читаете NUL -записи с разделителями ). Вы бы использовали его вместо этого, чтобы ограничить длину записи, которую вы читаете.
В вашем случае с записями с разделителями NUL -(с -d ''
), IFS= read -d '' -rn1 var
будет работать так же, как bash
в любом случае не может хранить символ NUL в своих переменных, поэтому printf '\0' | read -rN1 var
оставит $var
пустой и возвращает ненулевой статус выхода -.
Чтобы иметь возможность читать произвольные символы, включая NUL, вы должны использовать оболочку zsh
вместо синтаксиса:
read -k1 'var?Enter a character: '
(нет необходимости в -r
или IFS=
. Однако обратите внимание, что read -k
считывает с терминала(k
для клавиши ; Опция zsh -k
предшествует bash и даже ksh93 -N
на десятилетия ). Для чтения со стандартного ввода используйтеread -u0 -k1
).
Пример (здесь нажатие Ctrl+Пробел для ввода символа NUL):
$ read -k1 'var?Enter a character: '
Enter a character: ^@
$ printf '%q\n' $var
$'\0'
Обратите внимание, что для чтения символа , read
может потребоваться прочитать более одного байта. Если ввод начинается с первого байта многобайтового символа -, он будет считывать как минимум еще один байт, поэтому вы можете получить $var
, содержащее что-то, что оболочка считает длиной больше 1, если ввод содержит последовательности байтов, не образующие допустимых символов.
Например, в локали UTF -8:
$ printf '\xfc\x80\x80\x80\x80XYZ' | bash -c 'read -rN1 a; printf "<%q>\n" "$a" "${#a}"; wc -c'
<$'\374\200\200\200\200X'>
<6>
2
$ printf '\xfc\x80\x80\x80\x80XYZ' | zsh -c 'read -u0 -k1 a; printf "<%q>\n" $a $#a; wc -c'
<$'\374'$'\200'$'\200'$'\200'$'\200'X>
<6>
2
В UTF -8, 0xFC — это первый байт символа длиной 6 -байтов, 5 других означают, что 8-й бит установлен, а 7-й бит не установлен, однако мы предоставляем только 4. read
по-прежнему читает этот дополнительный X
, чтобы попытаться найти конец символа, который заканчивается в $var
, вместе с теми 5 байтами, которые не образуют допустимый символ и в конечном итоге считаются одним символом каждый.
Вы не установили JDK; чтобы установить JDK, который включает в себя jstat
, вам необходимо установить java-1.8.0-openjdk-devel
.