Como criar um arquivo de log de um comando (por meio de alias)

1

A chamada é simplesmente ud digitada em um terminal. ud é definido como o seguinte no meu ~/.bash_aliases :

alias ud='sudo apt-get update && sudo apt-get upgrade -y && sudo apt-get dist-upgrade -y && sudo apt-get clean -y'

Após uma pesquisa rápida, encontrei o seguinte método sugerido para a manutenção de arquivos de log (usando make install da postagem original):

$ make install > file.txt 2>&1

Aqui está o problema; se eu adaptar isso às minhas necessidades, não obtenho os resultados esperados da seguinte sintaxe:

$ ud > file.txt 2>&1

O que obtenho é que o comando é executado no stdout na tela e um arquivo de texto de 0 byte é produzido. O que desejo realizar é criar um arquivo de texto de saída semelhante ao seguinte para ls :

$ ls > file.txt 2>&1

Posso pedir a alguém que me explique o que está acontecendo?

Por fim, os itens a seguir produzem resultados que não posso explicar:

$ $(ud) > file.txt
La commande « Ign » est introuvable, vouliez-vous dire :
 La commande « tgn » du paquet « tgn » (universe)
Ign : commande introuvable

$ echo $(ud) > file.txt
    
por Tfb9 02.05.2015 / 02:11

1 resposta

2

Execute o comando em um subshell:

(ud) > file.txt 2>&1

Isto terá os comandos no alias ud para executar em um subshell e o STDOUT e STDERR de todos os comandos serão direcionados para o shell pai para que possamos redirecionar o STDOUT e o STDERR de todos os comandos para o mesmo arquivo de nosso shell pai de uma vez.

Ou como @steeldriver sugeriu que você também poderia definir o alias da seguinte forma para que todos os comandos fossem agrupados e seus STDOUT e STDERR fossem redirecionados de uma só vez:

alias ud='{ sudo apt-get update && sudo apt-get upgrade -y && sudo apt-get dist-upgrade -y && sudo apt-get clean -y ;}'

Agora você pode executar o comando como:

ud > file.txt 2>&1

Agora, vamos entender o que você estava fazendo de errado:

Você definiu o alias como:

alias ud='sudo apt-get update && sudo apt-get upgrade -y && sudo apt-get dist-upgrade -y && sudo apt-get clean -y'

Agora, enquanto você corre:

ud > file.txt 2>&1

Somente o STDOUT e (ou) STDERR do último êxito ou falha são redirecionados para file.txt , todos os comandos anteriores são executados e, dependendo do código de saída desse comando (success && ), o próximo comando será executado. Portanto, no seu caso, todos os comandos foram bem-sucedidos e, como sudo apt-get clean -y remove todos os arquivos .deb de /var/cache/apt/archives silenciosamente sem mostrar nenhum STDOUT, você está recebendo um arquivo vazio.

    
por heemayl 02.05.2015 / 02:34