Como anexar automaticamente um comando a um arquivo quando chamado em um shell?

0

Eu gostaria de acompanhar todos os programas que estou instalando, então toda vez que um comando contiver pacman -S (espaço importante após -S) eu gostaria que o bash acrescentasse a string de comando a um arquivo. Atualmente estou usando uma função, mas é chato porque eu tenho que ir ao histórico e manter a linha com a função e aspas. Eu poderia aproveitar a história, mas a solução de propósito geral seria útil.

Existe uma maneira de fazer isso automaticamente em uma única etapa de instalação & registro?

    
por ChiseledAbs 24.07.2016 / 01:28

3 respostas

3

Acho que o que você está tentando realizar é muito difícil, se não impossível, mesmo quando você pode criar uma função de invólucro para fazer o que quiser e um apelido para chamar o invólucro em vez do comando real. execute sudo pacman -S e sudo quebra todas as funções e aliases alternando contextos.

Mas nem tudo está perdido, você pode listar todos os pacotes explicitamente instalados com pacman -Qe , então se a qualquer momento você desejar reinstalar o sistema ou copiar o ambiente para outra máquina, você pode obter a lista em um arquivo, arquivo para a máquina de destino e execute o pacman para instalar todos os pacotes.

Para criar o arquivo:

pacman -Qe | cut -d ' ' -f 1 | tr "\n" " " >the-file.txt
  • pacman -Qe : lista todos os pacotes explicitamente instalados.
  • cut -d ' ' -f 1 : é remover as versões do pacote e manter apenas os nomes.
  • tr "\n" " " : é alterar as novas linhas para espaços.
  • >the-file.txt : é redirecionar a saída para um arquivo, sinta-se à vontade para alterar o nome do arquivo e o caminho de acordo com suas necessidades.

Isto produzirá uma lista separada por espaços para o arquivo -.txt, você transferirá o arquivo para a máquina de destino e executará:

sudo pacman -Sy - <the-file.txt

Voila, o pacman está instalando todos os pacotes da lista e você obterá o mesmo resultado.

Você também pode adicionar o argumento --needed ao pacman para que ele não reinstale pacotes atualizados pacman -S --needed ... .

E se você estiver fazendo a nova máquina remotamente, você pode pular a transferência de arquivos e apenas canalizar os resultados para o ssh e ele irá para a máquina remota:

pacman -Qe | cut -d ' ' -f 1 | tr "\n" " " | ssh -t user@host "sudo pacman -S --needed -"
  • Com -t ssh aloca um pseudo terminal, caso contrário, o sudo falhará.

Boa sorte.

    
por 24.07.2016 / 06:26
0

Se você estiver usando bash :

trap 'echo $BASH_COMMAND | fgrep "pacman - S" >> /home/logfile

Você também o desejará no seu .bash_profile ou similar, para que ele seja executado em todos os shell interativos.

Claro, isso captura apenas as coisas que você digitou em bash , e não qualquer coisa que tenha sido executada de alguma outra forma, como um front-end executando pacman em segundo plano.

Tenha em mente que isso pode realmente prejudicar o desempenho (executando um fgrep para todos os outros comandos executados), portanto, embora isso responda à sua pergunta, não é necessariamente a melhor maneira de atingir seu objetivo de rastrear pacotes.

Veja também: link

Se você estiver usando zsh , procure a função preexec no manual zsh .

    
por 24.07.2016 / 08:08
-1

Dê uma olhada em sudosh2 para registrar todo o seu histórico de comandos com o replay. Isso pode fazer o que você quiser.

    
por 24.07.2016 / 07:47