2013-08-22 4 views
0

мне нужно объяснение синтаксиса следующий: ввод командыВ чем смысл следующей команды?

while read -u3 -r f1 

почему -u, почему -r? и я знаю, что 3 является файловым дескриптором или идентификатором?

+0

На это легко можно ответить, прочитав документацию. – chepner

ответ

2

От 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.

+0

'help read' в bash показывает' -u fd читать из дескриптора файла FD вместо стандартного ввода'. – choroba

+0

Я начал с zsh manpages, так как сам использую это, но исправил ответ на информационные страницы bash. –

2

Он читает из дескриптора файла 3 без обработки обратных косых черт во входных данных в качестве управляющих символов. Каждой прочитанной строке присваивается имя f1.

От manual:

-r

Если эта опция задана, обратная косая черта не выступает в качестве экранирующего символа. Обратная косая черта считается частью линии. В частности, в пара обратной линии обратной линии не может использоваться как линия продолжение.

-u fd

Читать ввод из файла дескриптора FD.

1

Прежде всего, read - это встроенная оболочка (попробуйте type read). Вот почему вы не найдете его как одну страницу руководства.

Но, как bash встроенный, вы можете найти документацию в bashmanpage (или через 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.

+0

(Pedantic comment) 'f1' будет только переменной окружения при экспорте, иначе это просто переменная. – cdarke

+0

Не так педантично ... Я исправил это в своих объяснениях. – perror

Смежные вопросы