Script de shell para ignorar o PPA, se instalado

8

Eu gostaria de criar um script que adicione um novo PPA ou pule 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
    }

shell script para adicionar condicionalmente 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?

Giovanni Caligaris
fonte
2
Seria útil editar sua pergunta para incluir seu script, facilitando o diagnóstico de onde estão os problemas.
Arronical 28/03

Respostas:

9

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

add_ppa otto-kesselgulasch/gimp-edge

Além disso, a função suporta vários argumentos, para que você possa executá-la para vários PPAs:

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

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

  • forneça-a como Zanna sugere para obter a função no seu shell e chamar a função, ou
  • basta usar 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
muru
fonte
3
Como uma nota lateral, você pode soltar o in "$@"; for i; doloops sobre os parâmetros posicionais.
Kevin
6

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

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

. ppa
add_ppa otto-kesselgulasch/gimp-edge

(supondo que o arquivo em que você o salvou seja chamado ppa, esteja no diretório de trabalho atual e tenha exatamente o mesmo conteúdo do exemplo que você postou)

Você também pode executá-lo como um script, se adicionar uma linha que realmente chama a função. Você pode 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 for chamado:

./ppa otto-kesselgulasch/gimp-edge thing/stuff etc/andSoOn
Zanna
fonte
3

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

A mensagem de erro:

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

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

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

Arronical
fonte