Script de shell para pular o PPA se instalado

8

Eu gostaria de criar um script que adicionará um novo PPA ou pulará se já estiver instalado.

Alguém postou esta solução para uma pergunta diferente:

#!/bin/bash 

add_ppa() {
      for i in "$@"; do
        grep -h "^deb.*$i" /etc/apt/sources.list.d/* > /dev/null 2>&1
        if [ $? -ne 0 ]
        then
          echo "Adding ppa:$i"
          sudo add-apt-repository -y ppa:$i
        else
          echo "ppa:$i already exists"
        fi
      done
    }

script shell para adicionar condicionalmente o repositório apt

No meu caso, gostaria de adicionar ppa:otto-kesselgulasch/gimp-edge , mas não tenho certeza de onde devo adicionar isso no script.

Eu tentei add_ppa(ppa:otto-kesselgulasch/gimp-edge) , mas continuo recebendo um erro dizendo ( ppa é o nome do meu script):

ppa: 1: ppa: Syntax error: word unexpected (expecting ")")

Eu também tentei com um espaço entre ppa e sem o ()

ppa: 1: ppa: add_ppa: not found
ppa: 12: ppa: Syntax error: "}" unexpected

Alguém pode me dizer o que estou fazendo de errado, por favor?

    
por Giovanni Caligaris 28.03.2018 / 10:27

3 respostas

9

Essa é uma função bash, e para passar argumentos para funções bash, você não precisa de () . Além disso, a função adiciona o prefixo ppa: a seus argumentos, portanto, isso seria o caso:

add_ppa otto-kesselgulasch/gimp-edge

Adicionalmente, a função suporta múltiplos argumentos, então você pode executá-lo para múltiplos PPAs:

add_ppa otto-kesselgulasch/gimp-edge foo/bar a/b

Dado que você colocou a função em um script, você deve:

  • fonte como Zanna sugere para obter a função em seu shell e chamar a função, ou
  • use apenas o conteúdo da função como o script:

    #! /bin/bash
    for i in "$@"; do
      if grep -Rq "^deb.*$i" /etc/apt/sources.list.d/*.list
      then
        echo "Adding ppa:$i"
        sudo add-apt-repository -y ppa:$i
      else
        echo "ppa:$i already exists"
      fi
    done
    

    E chame o script com o nome ppa:

    ppa otto-kesselgulasch/gimp-edge
    
por muru 28.03.2018 / 10:31
6

Eu acho que você está executando o arquivo como um script, mas é apenas uma definição de função, então a função nunca é chamada quando é executada.

Você não precisa adicionar nada a ele; você não precisa adicionar o PPA em qualquer lugar dentro dele. Você pode source o arquivo e depois chamar a função no shell atual:

. ppa
add_ppa otto-kesselgulasch/gimp-edge

(assumindo que o arquivo em que você salvou é chamado ppa , está no diretório de trabalho atual e tem exatamente o mesmo conteúdo que o exemplo que você publicou)

Você também pode executá-lo como um script, se você adicionar uma linha que realmente chame a função. Você poderia codificar o PPA nele adicionando uma linha como esta no final:

add_ppa otto-kesselgulasch/gimp-edge

e, em seguida, execute o script. Mas dessa forma, você teria que editar o arquivo toda vez que quisesse adicionar um novo PPA ...

Em vez disso, você pode chamar a função em todos os argumentos passados para o script, adicionando uma linha como esta:

add_ppa "$@"

quando o script é chamado:

./ppa otto-kesselgulasch/gimp-edge thing/stuff etc/andSoOn
    
por Zanna 28.03.2018 / 10:39
3

Parece que você pode ter cometido um erro de digitação no seu script, especificamente na definição da função add_ppa .

A mensagem de erro:

ppa: 1: ppa: add_ppa: not found
ppa: 12: ppa: Syntax error: "}" unexpected

Indica que o add_ppa não está sendo reconhecido como uma função.

Parece que você pode ter usado ( no lugar de { ao definir a função. Corrija esse erro e a função deve funcionar corretamente, embora deva ser usada como indicado na resposta do muru.

    
por Arronical 28.03.2018 / 10:33