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.