O que '& -' faz?

20

Eu copiei um trecho de Bash para o plano de fundo de um comando ssh executado remotamente:

ssh user@remote <<CMD
some process <&- >log 2>error &
CMD

O que o <&- faz?
Meu palpite é que é o mesmo que < /dev/null

Meu próximo entendimento é que os três principais descritores de arquivo ( stdin , stdout , stderr ) precisam ser fechados para evitar:

  1. O trabalho sendo contextualizado e o script saindo - conflitante de alguma forma?
  2. Quando o terminal fecha, todos os processos que são aceitar stdin do terminal está fechado?
por Eric Francis 17.09.2015 / 17:58

3 respostas

30

<&- não é bastante a mesma coisa que < /dev/null . <&- fecha fd 0, enquanto < /dev/null a redireciona do dispositivo /dev/null , que nunca fornece dados e sempre fornece EOF na leitura. A diferença é principalmente que uma chamada read(2) de um FD fechado (o caso <&- ) terá erro com EBADF, enquanto uma chamada de um FD redirecionado por nulo não retornará nenhum byte lido (condição de fim de arquivo). Se o seu programa nunca lê stdin, a distinção não importa.

Fechar os FDs é uma boa prática se você estiver fazendo algo em segundo plano, já que um processo em segundo plano será interrompido se ele tentar ler qualquer coisa de TTY. Este exemplo não lida totalmente com tudo o que deveria, no entanto; de preferência, haveria uma invocação de nohup ou setsid em algum lugar para desassociar completamente o processo em segundo plano.

    
por 17.09.2015 / 18:11
7

Veja man bash :

  [n]<&word

is used to duplicate input file descriptors. If word expands to one or more digits, the file descriptor denoted by n is made to be a copy of that file descriptor. If the digits in word do not specify a file descriptor open for input, a redirection error occurs. If word evaluates to -, file descriptor n is closed. If n is not specified, the standard input (file descriptor 0) is used.

    
por 17.09.2015 / 18:07
7

<&- fecha a entrada padrão.

A forma geral, definida por POSIX , é:

[n]<&word

Sua finalidade de fazer descritor de arquivo n é uma cópia do descritor de arquivo denotado por word . O padrão é assumido se n for omitido e se word for - , o descritor de arquivo n será fechado.

Não é o mesmo que </dev/null , pois quando no caso de </dev/null , a entrada padrão ainda é aberta e redirecionada para outro local.

Você precisa fechar todos os descritores de arquivos dos processos que foram anexados ao ssh socket, caso contrário, a sessão ssh não pode fechar.

Você pode executar o comando na máquina remota sem anexá-lo à sessão ssh, usando a tela ou tmux :

ssh user@remote 'screen -S test -d -m command'
    
por 17.09.2015 / 18:15