Spec-Zone.ru › Fish 3.3

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

Spec-Zone.ru

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