Este redirecionamento é válido? '2 e 1'

0

Eu encontrei anotações de um servidor em que costumava trabalhar no passado, mas o redirecionamento não parece correto. Talvez alguém possa confirmar?

Estas foram entradas no meu crontab inseridas por um fornecedor terceirizado que mantinha o aplicativo / banco de dados executado neste servidor HP-UX.

15 21 * * 0-6 /usr/sys/bin/stop  q  >/stopout   2<&1 #
30 21 * * 0-6 /usr/sys/force     q  >/out       2<&1 #
55 23 * * 0-6 /usr/sys/start     q  >/startout  2<&1 #

Eu encontrei isso no manual de Bash, mas isso significa que stderr e stdout estão saindo para > / {stopout, out, startout} enquanto stderr está copiando stdout (o que significa stdout duas vezes sendo gravado para stopout, out, startout ?) Estou confuso:)

3.6.8 Duplicating File Descriptors
The redirection operator

[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 jes516 23.04.2018 / 05:42

1 resposta

2

É muito provável que seja um erro de digitação para 2>&1 ; >foo 2>&1 é muito comum em crontabs como uma maneira simples de manter a saída e erro de cronjobs (veja SO , U & L , AU , ...).

Observe que:

  • fd 1 aqui foi aberto para gravação ( >/stopout , etc. equivalente a 1>/stopout )
  • se você usa 2>&1 ou 2<&1 , o fd 2 obtém dup2 (pelo menos no Linux, mas presumivelmente em outras plataformas também) para fd 1, então ele pode ser usado da mesma maneira que o fd 1 pode ser.
    • Isso não significa que os dados gravados em fd 1 serão enviados para fd 2 como entrada, mas que os fds 1 e 2 apontam para a mesma coisa.
  • então, escrever para o fd 2 não falhará e será enviado para /stopout da mesma forma que os dados gravados no fd 1.

No entanto, se o fd 1 foi originalmente aberto para leitura, a gravação falhará:

$ strace -e write bash -c 'echo bar 1<foo 2<&1'
write(1, "bar\n", 4)                    = -1 EBADF (Bad file descriptor)
write(2, "bash: line 0: echo: write error:"..., 53) = -1 EBADF (Bad file descriptor)
+++ exited with 1 +++
    
por 23.04.2018 / 06:06