read - чтение строки ввода в переменные
Синопсис
read [OPTIONS] [VARIABLE ...]
Описание
read считывает данные со стандартного ввода и либо выводит результат на стандартный вывод (для использования в подстановке команд), либо сохраняет результат в одной или нескольких оболочечных переменных. По умолчанию, read считывает одну строку и разделяет её на переменные по пробелам или табуляциям. В качестве альтернативы, для завершения ввода можно использовать нулевой символ или максимальное количество символов, а также другие разделители. В отличие от других оболочек, нет стандартной переменной (например, REPLY) для хранения результата; вместо этого он печатается на стандартный вывод.
Доступны следующие опции:
-
-c CMDили--command=CMDустанавливает начальную строку в буфере команд интерактивного режима вCMD. -
-d 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, но он был изменён для совместимости с коротким вариантом опции-sbash'a для--silent. -
-t-или--tokenizeзаставляет read разделять ввод на переменные по правилам токенизации оболочки. Это означает, что будут учтены кавычки и экранирование. Эта опция, конечно, несовместима с другими опциями управления разделением, такими как--delimiter, и не учитывает $IFS (как токенизатор fish). Она сохраняет токены так, как они передавались бы командам в командной строке, поэтому, например,a\ bхранится какa b. Обратите внимание, что в настоящее время она оставляет подстановки команд и скобки без изменений. -
-uили--unexportпредотвращает экспорт переменных в дочерние процессы (поведение по умолчанию). -
-Uили--universalделает указанную переменную оболочки универсальной. -
-xили--exportэкспортирует переменные в дочерние процессы. -
-aили--listсохраняет результат в виде списка в одной переменной. Эта опция также доступна как--arrayдля обратной совместимости. -
-zили--nullотмечает конец строки символом NULL вместо новой строки. Это также отключает интерактивный режим. -
-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
© 2021 fish-shell developers
Licensed under the GNU General Public License, version 2.
https://fishshell.com/docs/3.3/cmds/read.html