Script Bash que não grava

4

Então, aqui estou, jogando com alguns scripts bash, e há algo que não funciona:

#!/bin/bash

script -c \
sudo apt-get update &&
sudo apt-get upgrade &&

exit

echo "(Not important for the question)"

Eu quero rodar o update usual e atualizar coisas, e também gravar a saída, mas quando eu executo o script, ele só diz que o script começou a gravar no apt-get, mostra o uso do sudo ( usage: sudo -h é a primeira linha), e diz que o sript está pronto. Depois disso, começa o material do sudo.

O que preciso fazer para registrar a saída da tarefa de atualização e atualização? Em geral, como posso gravar a saída de um script de shell inteiro?

    
por macacomen98 14.02.2016 / 20:35

3 respostas

9

Se eu entendi sua pergunta corretamente, você pode usar o seguinte:

#!/bin/bash

apt-get update &> update.log
apt-get -y upgrade &> upgrade.log

echo "all done"

Salve este script como run_updates.sh , torne-o executável com chmod 755 run_updates.sh e execute-o com sudo ./run_updates.sh .
Se você quiser salvar todas as saídas em um arquivo, remova o &> updates.log e &> upgrades.log do script e execute o script como sudo./run_updates.sh &> run_updates.log

Explicação do script:

  • apt-get update &> update.log runs apt-get update e salva a saída em update.log
  • apt-get -y upgrade &> upgrade.log runs apt-get upgrade e salva a saída em upgrade.log . O -y impede o apt de pedir para continuar (assume "sim")

Uma observação sobre redirecionamentos:
Você pode usar os redirecionamentos abaixo para "enviar" a saída de um comando ou script para um arquivo.

  • &> redireciona STDOUT e STDERR
  • > ou 1> redireciona STDOUT
  • 2> redireciona STDERR

Uma nota sobre o sudo:
Esta é provavelmente a razão pela qual você tem erros. Ao executar um comando que precisa de sudo em um script, é uma boa ideia colocar o comando sem sudo no script e executar o script com sudo . Caso contrário, você teria que dar sua senha sudo para o script de alguma forma, o que é ruim.

Editar:
No código a seguir, a saída de ambos os comandos apt é redirecionada para update.log . O% > ( >> ) duplo é usado para anexar dados a um arquivo (em vez de substituí-lo)

#!/bin/bash

apt-get update &> update.log
apt-get -y upgrade &>> update.log

echo "all done"
    
por Wayne_Yux 14.02.2016 / 20:53
4

Em geral, para registrar a saída do script inteiro, redirecione a saída do script inteiro:

exec &> some.log
# Or, when using '/bin/sh':
# exec >some.log 2>&1

O exec builtin é frequentemente usado para alterar os descritores de arquivos abertos ou adicionar novos descritores de arquivos (as fontes e destinos de entrada e saída) para o shell.

Por exemplo, dado example.sh :

#! /bin/bash
exec &> some.log
ls foo
echo foo

Na execução:

$ ./example.sh
$ cat some.log
ls: foo: No such file or directory
foo

Se você quiser que a saída seja exibida e seja um arquivo, use tee com a substituição do processo:

exec &> >(tee some.log)
    
por muru 15.02.2016 / 00:18
3

Não há necessidade de um script, basta fazê-lo em uma linha usando os redirecionamentos Bash e tee :

{ sudo apt-get update && sudo apt-get upgrade ; } |& tee output.txt

Caso você queira anexar a saída a um arquivo de log existente, adicione a opção -a após tee .

Para explicar o que acontece:

  • { ... ; } agrupa os comandos ... , de modo que os redirecionamentos de saída que executaremos se aplicam a todos os comandos e não apenas ao último. Por favor, preste atenção no espaço depois de { e antes de } , assim como no ponto e vírgula ; depois de todos os comandos! (obrigado @kos por me dizer para evitar gerar um subshell)
  • sudo apt-get update && sudo apt-get upgrade são os comandos de exemplo que queremos executar e gravar aqui. Você pode trocar essa parte inteira com o que quiser.
  • |& (o "pipe") redireciona os dois fluxos de saída (STDERR / erro padrão e STDOUT / saída padrão) do comando à esquerda dele para STDIN (entrada padrão) do comando à direita. (obrigado @muru por me ensinar sobre o & para redirecionar STDOUT e STDERR)
  • tee output.txt copia tudo o que lê de STDIN para STDOUT e também salva em output.txt . Se o arquivo de destino já existir, ele será substituído silenciosamente. Você pode acrescentar ao arquivo se usar tee -a output.txt .
por Byte Commander 14.02.2016 / 20:55