read - чтение строки ввода в переменные
Синтаксис
read [OPTIONS] [VARIABLE ...]
Описание
read считывает данные из стандартного ввода и либо записывает результат обратно в стандартный вывод (для использования в подстановке команд), либо сохраняет результат в одной или нескольких оболочечных переменных. По умолчанию, read считывает одну строку и разделяет её на переменные по пробелам или табуляции. В качестве альтернативы, для завершения ввода можно использовать нулевой символ или максимальное количество символов, а также другие разделители. В отличие от других оболочек, нет стандартной переменной (например, REPLY) для хранения результата - вместо этого он печатается в стандартный вывод.
Доступны следующие параметры:
- -c CMD или --command CMD
-
Устанавливает начальную строку в буфере команд в интерактивном режиме на CMD.
- -d или --delimiter DELIMITER
-
Разделяет по DELIMITER. DELIMITER будет использоваться как целая строка для разделения, а не набор символов.
- -g или --global
-
Делает переменные глобальными.
- -s или --silent
-
Маскирует символы, написанные в терминал, заменяя их звёздочками. Это полезно для чтения таких вещей, как пароли или другая конфиденциальная информация.
- -f или --function
-
Ограничивает область действия переменной текущей выполняемой функцией. Она удаляется по окончании функции.
- -l или --local
-
Ограничивает область действия переменной текущим выполняемым блоком. Она удаляется по окончании блока. Вне блока, это то же самое, что --function.
- -n или --nchars NCHARS
-
Заставляет
readвозвращаться после чтения NCHARS символов или конца строки, в зависимости от того, что произойдёт раньше. - -p или --prompt PROMPT_CMD
-
Использует вывод командной строки PROMPT_CMD в качестве приглашения для интерактивного режима. Команда приглашения по умолчанию -
set_color green; echo read; set_color normal; echo "> " - -P или --prompt-str PROMPT_STR
-
Использует PROMPT_STR в качестве приглашения для интерактивного режима. Это эквивалентно
echo $PROMPT_STRи предоставляется исключительно для исключения необходимости в оформлении приглашения в виде команды. Все специальные символы в строке автоматически экранируются перед передачей команде echo. - -R или --right-prompt RIGHT_PROMPT_CMD
-
Использует вывод командной строки RIGHT_PROMPT_CMD в качестве правого приглашения для интерактивного режима. Команда правого приглашения по умолчанию отсутствует.
- -S или --shell
-
Включает подсветку синтаксиса, автодополнение и завершение команд, подходящие для ввода кода shellscript в интерактивном режиме. ПРИМЕЧАНИЕ: До версии fish 3.0 короткая опция для --shell была -s, но она была изменена для совместимости с короткой опцией -s bash для --silent.
- -t или --tokenize
-
Принуждает read к разделению ввода на переменные по правилам токенизации оболочки. Это означает, что она будет учитывать кавычки и экранирование. Этот параметр, конечно, несовместим с другими параметрами управления разделением, такими как --delimiter, и не учитывает
IFS(как токенизатор fish). Она сохраняет токены таким образом, как они передаются командам в командной строке, так что, например,a\ bсохраняется какa b. Обратите внимание, что в настоящее время она оставляет подстановки команд и скобки нетронутыми. - -u или --unexport
-
Препятствует экспорту переменных в дочерние процессы (по умолчанию).
- -U или --universal
-
Делает указанную оболочечную переменную универсальной.
- -x или --export
-
Экспортирует переменные в дочерние процессы.
- -a или --list
-
Сохраняет результат в виде списка в одной переменной. Этот параметр также доступен как --array для обратной совместимости.
- -z или --null
-
Помечает конец строки символом NUL вместо новой строки. Это также отключает интерактивный режим.
- -L или --line
-
Читает каждую строку в последовательные переменные и останавливается после заполнения каждой переменной. Это нельзя комбинировать с параметром
--delimiter.
Без параметра --line, read считывает одну строку ввода из стандартного ввода, разбивает её на токены и затем присваивает один токен каждой переменной, указанной в VARIABLES. Если токенов больше, чем переменных, остаток полностью присваивается последней переменной.
Если не указан параметр для определения способа разделения, например, --delimiter, --line или --tokenize, используется переменная IFS в качестве списка символов для разделения. Ссылка на использование IFS устарела, и это поведение будет удалено в будущих версиях. Значение по умолчанию для IFS содержит пробелы, табуляции и символы новой строки. В качестве специального случая, если IFS установлено в пустую строку, каждый символ ввода рассматривается как отдельный токен.
С параметром --line, read считывает строку ввода из стандартного ввода в каждую предоставленную переменную, останавливаясь, когда каждая переменная будет заполнена. Строка не разбивается на токены.
Если имена переменных не указаны, read переходит в специальный случай, просто перенаправляя стандартный ввод в стандартный вывод, что полезно для подстановки команд. Например, команда оболочки fish ниже может использоваться для чтения данных, которые должны быть предоставлены в качестве аргумента командной строки с консоли вместо их жёсткого кодирования в самой команде, что позволяет повторно использовать команду в различных контекстах с разными значениями входных данных и предотвращает возможную конфиденциальную информацию от попадания в историю оболочки:
mysql -uuser -p(read)
При работе в этом режиме, read не разделяет ввод никоим образом и текст перенаправляется в стандартный вывод без дальнейшей обработки или манипуляций.
Если указан -a или --array, разрешено только одно имя переменной, и токены сохраняются в виде списка в этой переменной.
См. документацию по set для получения более подробной информации о правилах области действия переменных.
Когда read достигает конца файла (EOF) вместо терминатора, код возврата устанавливается в 1. В противном случае он устанавливается в 0.
Для защиты оболочки от избыточного потребления системных ресурсов, read будет потреблять не более 100 МБ (104857600 байт); если терминатор не будет достигнут до этого предела, то VARIABLE устанавливается в пустую строку, а код возврата - в 122. Этот предел можно изменить переменной fish_read_limit. Если значение установлено в 0 (ноль), ограничение удаляется.
Пример
Следующий код сохраняет значение «hello» в оболочечной переменной $foo.
echo hello|read foo
# This is a neat way to handle command output by-line:
printf '%s\n' line1 line2 line3 line4 | while read -l foo
echo "This is another line: $foo"
end
# Delimiters given via "-d" are taken as one string
echo a==b==c | read -d == -l a b c
echo $a # a
echo $b # b
echo $c # c
# --tokenize honors quotes and escaping like the shell's argument passing:
echo 'a\ b' | read -t first second
echo $first # outputs "a b", $second is empty
echo 'a"foo bar"b (command echo wurst)*" "{a,b}' | read -lt -l a b c
echo $a # outputs 'afoo bar' (without the quotes)
echo $b # outputs '(command echo wurst)* {a,b}' (without the quotes)
echo $c # nothing
© 2022 fish-shell developers
Licensed under the GNU General Public License, version 2.
https://fishshell.com/docs/3.5/cmds/read.html