Na verdade, existem 4 importantes informações que estão acontecendo:
-
O
execintegrado é 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 ostdoutstream 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 dedatecom 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>&1redirecionastderrstream 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 debashentendem). 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.