O que significa “exec 1 / var / opt / log / my_logs / MYPROG_'date '+% Y% m% d_% H% M% S' '. log 2 & 1” do?

2

Estou tentando entender o que a parte inferior do script de shell está fazendo. Eu sei que exec sem nenhum argumento redireciona a saída do shell atual, mas não sou capaz de entender o que o comando abaixo faz:

exec 1>/var/opt/log/my_logs/MYPROG_'date '+%Y%m%d_%H%M%S''.log 2>&1
    
por IA39 23.04.2018 / 16:00

1 resposta

7

Na verdade, existem 4 importantes informações que estão acontecendo:

  1. O exec integrado é usado para redirecionar todas as saídas para a sessão de linha de comando para um arquivo

  2. O 1><FILENAME> diz ao shell para redirecionar o stdout stream padrão , ou seja, sem erro A saída dos comandos irá para <FILENAME> . O > criará se <FILENAME> não existir ou truncar se <FILENAME> já existir.

  3. O nome do arquivo redirecionado é criado por meio de acréscimos adicionados com o comando date '+%Y%m%d_%H%M%S' . Backticks são forma de Substituição de Comando e são funcionalmente equivalentes a $(date '+%Y%m%d_%H%M%S') form e, atualmente, $(...) é o preferido para legibilidade e porque este formulário pode ser facilmente aninhado (ou seja, ter vários níveis). Portanto, a saída de date com o formato especificado '+%Y%m%d_%H%M%S' criará um nome de arquivo com timestamping. Se seu comando foi executado em 2018, 4 de julho, 4:20:20, a saída será /var/opt/log/my_logs/MYPROG_20180704_042020.log .

  4. 2>&1 redireciona stderr stream para esse arquivo também, é um formato padrão, compatível com POSIX (o que significa que os shells parecidos com Bourne, com exceção de bash entendem). Isso é funcionalmente equivalente a &> sintaxe específica do bash. A ordem dos redirecionamentos especificados no shell é importante, portanto, por que isso aparece depois do redirecionamento 1> .

Em conclusão, não deve haver saída deste comando em si. Ele deve apenas religar dois fluxos de saída de todos os comandos sucessivos para entrar no arquivo que você especificou.

Curiosamente, com este comando meu bash 4.4 envia tudo para o arquivo, e isso inclui o prompt e qualquer coisa que eu digite (então aqui eu digitei cegamente echo hello world e pressione Ctrl + D para sair depois):

$ bash --posix
bash-4.4$ exec 1>./mylog_'date '+%Y%m%d_%H%M%S''.log 2>&1
$ cat ./mylog_20180424_010800.log 
bash-4.4$ echo hello world
hello world
bash-4.4$ exit

Fazendo isso peça por peça, revela que as saídas bash são solicitadas para stderr stream e, surpreendentemente, junto com qualquer coisa que eu digite:

bash-4.4$ exec 1> ./mylog.txt
bash-4.4$ echo Hello World
bash-4.4$ cat ./mylog.txt
cat: ./mylog.txt: input file is output file
bash-4.4$ exec 2>&1

No caso de ksh , a mesma coisa acontece, mas eu posso ver o que está sendo digitado, somente o prompt vai para o arquivo, ou seja, o stdin não é redirecionado:

bash-4.4$ ksh
$ exec 1>./mylog 2>&1
echo hello askubuntu
bash-4.4$ cat ./mylog
$ hello askubuntu
$ 
bash-4.4$ 

Portanto, aqui podemos ver que os shells podem optar por enviar o prompt PS1 para um dos fluxos padrão, de modo que seja incluído em um arquivo.

    
por Sergiy Kolodyazhnyy 23.04.2018 / 16:55