Redirecionamento. O que é "", "&" e "& -"?

1

"< >" Esse operador que vi há poucos meses no site, mas não me lembro o que isso significa. Talvez eu esteja errado e o ksh não tenha "< >".

"a < & b" Eu sei que esse operador mescla o fluxo de entrada a com o fluxo de saída b . Estou certo? Mas não sei onde posso usá-lo. Você pode me dar exemplos?

> & - Eu não sei nada sobre isso. Por exemplo, o que significa 2>&- ?

    
por Nikolay Bildeyko 18.01.2015 / 13:43

1 resposta

6

De link :

   <>word        Open file word for reading and writing as  standard  out-
                 put.

   <&digit       The standard input is  duplicated  from  file  descriptor
                 digit  (see  dup(2)).   Similarly for the standard output
                 using >&digit.

   <&-           The standard input is closed.  Similarly for the standard
                 output using >&-.

Você encontrará todos esses detalhes digitando man ksh .

Especialmente 2>&- significa: fechar o fluxo de erro padrão, isto é, o comando não pode mais gravar em STDERR, o que quebrará o padrão que exige que seja gravável.

Para entender o conceito de descritores de arquivos, (se em um sistema Linux) você pode dar uma olhada em /proc/*/fd (e / ou /dev/fd/* ) :

$ ls -l /proc/self/fd
insgesamt 0
lrwx------ 1 michas users 1 18. Jan 16:52 0 -> /dev/pts/0
lrwx------ 1 michas users 1 18. Jan 16:52 1 -> /dev/pts/0
lrwx------ 1 michas users 1 18. Jan 16:52 2 -> /dev/pts/0
lr-x------ 1 michas users 1 18. Jan 16:52 3 -> /proc/2903/fd

O descritor de arquivo 0 (também conhecido como STDIN) é usado por padrão para leitura, o fd 1 (também conhecido como STDOUT) é o padrão para gravação e o fd 2 (também conhecido como STDERR) é o padrão para mensagens de erro. (fd 3 é usado neste caso por ls para realmente ler esse diretório.)

Se você redirecionar as coisas, pode ficar assim:

$ ls -l /proc/self/fd 2>/dev/null </dev/zero 99<>/dev/random |cat
insgesamt 0
lr-x------ 1 michas users 1 18. Jan 16:57 0 -> /dev/zero
l-wx------ 1 michas users 1 18. Jan 16:57 1 -> pipe:[28468]
l-wx------ 1 michas users 1 18. Jan 16:57 2 -> /dev/null
lr-x------ 1 michas users 1 18. Jan 16:57 3 -> /proc/3000/fd
lrwx------ 1 michas users 1 18. Jan 16:57 99 -> /dev/random

Agora, os descritores padrão não apontam mais para o seu terminal, mas para os redirecionamentos correspondentes. (Como você vê, você também pode criar novos fds.)

Mais um exemplo para <> :

echo -e 'line 1\nline 2\nline 3' > foo # create a new file with three lines
( # with that file redirected to fd 5
  read <&5            # read the first line
  echo "xxxxxx">&5    # override the second line
  cat <&5             # output the remaining line
) 5<>foo  # this is the actual redirection

Você pode fazer essas coisas, mas raramente tem que fazer isso.

    
por 18.01.2015 / 14:44