мне нужно объяснение синтаксиса следующий: ввод командыВ чем смысл следующей команды?
while read -u3 -r f1
почему -u, почему -r? и я знаю, что 3 является файловым дескриптором или идентификатором?
мне нужно объяснение синтаксиса следующий: ввод командыВ чем смысл следующей команды?
while read -u3 -r f1
почему -u, почему -r? и я знаю, что 3 является файловым дескриптором или идентификатором?
От info "(bash)Bash Builtins"
(web mirror):
read [-ers] [-a aname] [-d delim] [-i text] [-n nchars] [-N nchars] [-p prompt] [-t timeout] [-u fd] [name …]
Read a line from the standard input and split it into fields.
Reads a single line from the standard input, or from file descriptor FD
if the -u option is supplied. The line is split into fields as with word
splitting, and the first word is assigned to the first NAME, the second
word to the second NAME, and so on, with any leftover words assigned to
the last NAME. Only the characters found in $IFS are recognized as word
delimiters.
If no NAMEs are supplied, the line read is stored in the REPLY variable.
Options:
[...]
-r
Raw mode: a `\' at the end of a line does not signify line continuation and backslashes in the line don't quote the following character and are not removed.
[...]
-u fd
Read input from file descriptor fd.
Итак, ваша команда считывает из файла дескриптора 3, не обращая внимания обратных слеш для продолжения строки и побегов. Для каждой из строк содержимое строки помещается в $f1
и вызывается одна итерация цикла while.
'help read' в bash показывает' -u fd читать из дескриптора файла FD вместо стандартного ввода'. – choroba
Я начал с zsh manpages, так как сам использую это, но исправил ответ на информационные страницы bash. –
Он читает из дескриптора файла 3 без обработки обратных косых черт во входных данных в качестве управляющих символов. Каждой прочитанной строке присваивается имя f1
.
От manual:
-r
Если эта опция задана, обратная косая черта не выступает в качестве экранирующего символа. Обратная косая черта считается частью линии. В частности, в пара обратной линии обратной линии не может использоваться как линия продолжение.
-u fd
Читать ввод из файла дескриптора FD.
Прежде всего, read
- это встроенная оболочка (попробуйте type read
). Вот почему вы не найдете его как одну страницу руководства.
Но, как bash
встроенный, вы можете найти документацию в bash
manpage
(или через help read
, help
быть другой bash
встроенный). Таким образом, со ссылкой на адекватном части страницы руководства, здесь:
read [-ers] [-a aname] [-d delim] [-i text] [-n nchars] [-N nchars]
[-p prompt] [-t timeout] [-u fd] [name ...]
One line is read from the standard input, or from the file descriptor fd
supplied as an argument to the -u option, and the first word is assigned
to the first name, the second word to the second name, and so on, with
leftover words and their intervening separators assigned to the last name.
If there are fewer words read from the input stream than names, the
remaining names are assigned empty values.
The characters in IFS are used to split the line into words. The backslash
character (\) may be used to remove any special meaning for the next
character read and for line continuation. Options, if supplied, have the
following meanings:
-a aname
The words are assigned to sequential indices of the array variable
aname, starting at 0. aname is unset before any new values are
assigned. Other name arguments are ignored.
-d delim
The first character of delim is used to terminate the input line,
rather than newline.
-e If the standard input is coming from a terminal, readline (see
READLINE above) is used to obtain the line. Readline uses the
current (or default, if line editing was not previously active)
editing settings.
-i text
If readline is being used to read the line, text is placed into
the editing buffer before editing begins.
-n nchars
read returns after reading nchars characters rather than waiting
for a complete line of input, but honor a delimiter if fewer than
nchars characters are read before the delimiter.
-N nchars
read returns after reading exactly nchars characters rather than
waiting for a complete line of input, unless EOF is encountered
or read times out. Delimiter characters encountered in the
input are not treated specially and do not cause read to return
until nchars characters
are read.
-p prompt
Display prompt on standard error, without a trailing newline,
before attempting to read any input. The prompt is displayed only
if input is coming from a terminal.
-r Backslash does not act as an escape character. The backslash is
considered to be part of the line. In particular, a
backslash-newline pair may not be used as a line continuation.
-s Silent mode. If input is coming from a terminal, characters are
not echoed.
-t timeout
Cause read to time out and return failure if a complete line of
input is not read within time‐out seconds. timeout may be a
decimal number with a fractional portion following the decimal
point. This option is only effective if read is reading input from
a terminal, pipe, or other special file; it has no effect when
reading from regular files. If timeout is 0, read returns success
if input is available on the specified file descriptor, failure
otherwise. The exit status is greater than 128 if the timeout is
exceeded.
-u fd Read input from file descriptor fd.
If no names are supplied, the line read is assigned to the variable REPLY.
The return code is zero, unless end-of-file is encountered, read times out
(in which case the return code is greater than 128), or an invalid file
descriptor is supplied as the argument to -u.
В вас случае, давайте сначала посмотрим на варианты и аргумент read -u3 -r f1
:
-u3
: Прочитайте информацию от дескриптор файла 3
(помните, что 0
является stdin
, 1
является stdout
и 2
является stderr
. 3
не что-то особенное, просто файл).-r
: Обратная косая черта не действует как символ эвакуации.f1
: Является ли целевая переменная строки считанной от fd 3
.Таким образом, это означает, что вы перекручивание вокруг чтения до тех пор, как вы можете извлечь строку из fd 3
, не обращая внимания на обратную косую черту и копирование текущей строки в f1
.
На это легко можно ответить, прочитав документацию. – chepner