Spec-Zone.ru › Fish 3.1

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, но он был изменён для совместимости с коротким вариантом параметра 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

Команда read поддерживала флаги -m и --mode-name в версиях fish до 2.7.0 для указания альтернативного файла истории read. Эти флаги теперь устарели и игнорируются. Вместо этого установите переменную fish_history для указания идентификатора сессии истории. Это повлияет на файл истории read и файл истории команд fish. Вы можете установить его в пустую строку, чтобы указать, что история не должна считываться или записываться. Это полезно для презентаций, где вы не хотите, чтобы, возможно, конфиденциальная история была показана аудитории, но хотите иметь доступ к истории, относящейся к презентации.

Пример

Следующий код сохраняет значение '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

© 2019 fish-shell developers
Licensed under the GNU General Public License, version 2.
https://fishshell.com/docs/3.1/cmds/read.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API