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
-
Включает подсветку синтаксиса, автодополнение и завершение команд, подходящие для ввода кода оболочки в интерактивном режиме. ПРИМЕЧАНИЕ: До версии fish 3.0, короткий параметр для --shell был -s, но он был изменён для совместимости с коротким параметром bash -s для --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, ограничение снимается.
Пример
read имеет несколько отдельных применений.
Следующий код сохраняет значение ‘hello’ в оболочечной переменной foo.
echo hello|read foo
Хотя это удобный способ обработки выходных данных команды построчно:
printf '%s\n' line1 line2 line3 line4 | while read -l foo
echo "This is another line: $foo"
end
Разделители, заданные с помощью «-d», воспринимаются как одна строка:
echo a==b==c | read -d == -l a b c echo $a # a echo $b # b echo $c # c
--tokenize обрабатывает кавычки и экранирование так же, как передача аргументов оболочки:
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
Пример интерактивного использования см. в Запрос пользовательского ввода.
© 2005-2009 Axel Liljencrantz, 2009-2023 fish-shell contributors
Licensed under the GNU General Public License, version 2.
https://fishshell.com/docs/3.6/cmds/read.html