Na verdade, existem 4 importantes informações que estão acontecendo:
-
O
exec
integrado é usado para redirecionar todas as saídas para a sessão de linha de comando para um arquivo -
O
1><FILENAME>
diz ao shell para redirecionar ostdout
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. -
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 dedate
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
. -
2>&1
redirecionastderr
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 debash
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 redirecionamento1>
.
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.