read - чтение строки входных данных в переменные
Синопсис
read [OPTIONS] [VARIABLE ...]
Описание
read считывает данные из стандартного ввода и либо записывает результат обратно в стандартный вывод (для использования в подстановке команд), либо сохраняет результат в одной или нескольких оболочковых переменных. По умолчанию read считывает одну строку и разделяет ее на переменные по пробелам или табуляциям. В качестве альтернативы, можно использовать нулевой символ или максимальное количество символов для завершения ввода, а также задавать другие разделители. В отличие от других оболочек, нет по умолчанию переменной (например, REPLY) для хранения результата — вместо этого он выводится на стандартный вывод.
Доступны следующие параметры:
-
-c CMDили--command=CMDустанавливает начальную строку в буфере команд интерактивного режима вCMD. -
-d DELIMITERили--delimiter=DELIMITERразделяет по DELIMITER. DELIMITER будет использоваться как целая строка для разделения, а не набор символов. -
-gили--globalделает переменные глобальными. -
-sили--silentмаскирует символы, записанные в терминал, заменяя их звездочками. Это полезно для чтения таких вещей, как пароли или другая конфиденциальная информация. -
-lили--localделает переменные локальными. -
-n NCHARSили--nchars=NCHARSзаставляетreadвозвращаться после чтения NCHARS символов или конца строки, в зависимости от того, что произойдет раньше. -
-p PROMPT_CMDили--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_CMDили--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 shell ниже может использоваться для считывания данных, которые должны быть предоставлены в качестве аргумента командной строки из консоли вместо жесткой кодировки в самой команде, позволяя команде как быть повторно использована в разных контекстах с разными значениями входных данных, и предотвращая включение, возможно, конфиденциального текста в историю оболочки:
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
© 2020 fish-shell developers
Licensed under the GNU General Public License, version 2.
https://fishshell.com/docs/3.2/cmds/read.html