Como fazer um comando executar uma vez que um determinado comando termine?

0

O que eu quero fazer: Sempre que o comando apt-get install for executado e finalizado, execute outro comando imediatamente sem qualquer envolvimento na parte do usuário. No meu caso, quero executar um script, mas como posso substituir um comando por um comando, seria preferível um exemplo.

A propósito, eu não quero rodar um script que execute dois comandos, já que ele deve ser executado manualmente, o que não é o que eu quero. A finalização do comando apt-get install deve solicitar a execução de outro comando.

OBSERVAÇÃO: Isso pode parecer uma duplicata da pergunta e, embora eu saiba tenho uma resposta, quero deixar clara minha intenção no caso de haver outras soluções possíveis, ao mesmo tempo em que clarifico minhas exigências para outros possíveis leitores para essa questão.

Editar:

Para esclarecer: Estou tentando obter um comando que executa dois!
Por quê? Eu quero gerar um arquivo contendo uma lista de todas as dependências instaladas e software na minha distro, que é atualizado toda vez que o comando apt-get install é usado.

    
por TellMeWhy 25.11.2015 / 22:16

2 respostas

3

A parte difícil é analisar os argumentos corretamente. Você pode manipular facilmente apt-get install pkgname casos simples, mas assim que você quiser manipular apt-get -y install pkgname além disso, de repente você precisa de um analisador de opções completo.

Assumindo que os casos simples são bons o suficiente, algo como este script wrapper pode ser suficiente:

#!/bin/bash

/usr/bin/apt-get "$@"
status=$?

if [[ $1 = install ]]; then
    read -rp 'Run this other thing too [Y/n]? ' ans
    if [[ ${ans:-y} = [Yy] ]]; then 
        other-thing
        exit # exit with other-thing's exit status.
    fi
fi

exit "$status" # exit with apt-get's exit status.
    
por geirha 25.11.2015 / 22:34
1

Existem algumas maneiras, dependendo da sua intenção.

Execução sequencial pode ser feita com ; separador. Isso será feito em seqüência, cada comando é executado independentemente do status de saída do comando anterior. Exemplo:

echo hello; printf "\n\n%s" WORLD

A execução condicional pode ser feita com os operadores booleanos || e && . Com estes, a execução do segundo programa, depende do status de saída do primeiro (primeira e segunda leitura da esquerda para a direita).

Para && , o comportamento é assim: COMMAND1 && COMMAND2 , se COMMAND1 terminar com êxito, COMMAND2 será executado. Você pode se lembrar disso como "se a esquerda for bem-sucedida, a direita será executada; se falhar, a direita não será executada"     [-f / etc / passwd] & amp; & amp; echo "/ etc / passwd existe"

Para || , é o oposto "Se a esquerda for bem-sucedida, a direita não será executada; se a esquerda falhar, a direita será executada"

[ -d /etc/passwd ] || echo "/etc/passwd is not a directory"

Para colocá-los em um único comando, há algumas opções. Um obviamente é o script, mas como você pediu, você não quer um script. Alternativa para isso é função bash OU alias .

A função Bash é preferida, já que você pode passar argumentos para eles, se assim desejar.

No seu caso específico, você deseja apt-get install , o que pode exigir vários parâmetros

function installStuff
{
  apt-get install "$@"
  command2
}

Coloque isso no seu .bashrc , em algum lugar no topo, feche .bashrc e execute source .bashrc . Agora você tem uma função bash que sempre executa apt-get install primeiro, com qualquer número de pacotes solicitados, e imediatamente command2

Como assim

installStuff package1 package2 package3

Para a execução condicional do comando2, use os operadores && e || que já mencionei.

    
por Sergiy Kolodyazhnyy 25.11.2015 / 22:26