Script de shell para omitir PPA si está instalado

8

Me gustaría crear un script que agregará un nuevo PPA o se saltará si ya está instalado.

Alguien publicó esta solución a una pregunta 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 de shell para agregar condicionalmente el repositorio apt

En mi caso, me gustaría agregar ppa:otto-kesselgulasch/gimp-edge, pero no estoy seguro de dónde se supone que debo agregar esto en el script.

Lo intenté add_ppa(ppa:otto-kesselgulasch/gimp-edge)pero sigo recibiendo un error que dice ( ppaes el nombre de mi script):

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

También probé con un espacio entre ppa y sin el ()

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

¿Alguien puede decirme qué estoy haciendo mal, por favor?

Giovanni Caligaris
fuente
2
Sería útil editar su pregunta para incluir su secuencia de comandos, lo que facilita el diagnóstico de dónde se encuentran los problemas.
Arronical

Respuestas:

9

Esa es una función bash, y para pasar argumentos a las funciones bash, no es necesario (). Además, la función agrega el ppa:prefijo a sus argumentos, por lo que esto sería suficiente:

add_ppa otto-kesselgulasch/gimp-edge

Además, la función admite múltiples argumentos, por lo que puede ejecutarla para múltiples PPA:

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

Dado que ha puesto la función en un script, debería:

  • fuente como Zanna sugiere obtener la función en su shell y llamar a la función, o
  • solo use el contenido de la función como 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
    

    Y la llamada al script con el nombre de ppa:

    ppa otto-kesselgulasch/gimp-edge
muru
fuente
3
Como una nota al margen, puede soltar el in "$@"; for i; dorecorre los parámetros posicionales.
Kevin
6

Creo que está ejecutando el archivo como un script, pero es solo una definición de función, por lo que la función nunca se llama cuando se ejecuta.

No necesita agregarle nada; no necesita agregar el PPA en ningún lugar dentro de él. Puede sourcearchivar y luego llamar a la función en el shell actual:

. ppa
add_ppa otto-kesselgulasch/gimp-edge

(suponiendo que el archivo en el que lo guardó se llama ppa, está en el directorio de trabajo actual y tiene exactamente el mismo contenido que el ejemplo que publicó)

También puede ejecutarlo como un script, si agrega una línea que realmente llama a la función. Puede codificar el PPA en él agregando una línea como esta al final:

add_ppa otto-kesselgulasch/gimp-edge

y luego ejecuta el script. Pero de esa manera, tendría que editar el archivo cada vez que quisiera agregar un nuevo PPA ...

En su lugar, puede llamar a la función en todos los argumentos pasados ​​al script agregando una línea como esta:

add_ppa "$@"

entonces cuando se llama el script:

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

Parece que puede haber cometido un error tipográfico en su script, específicamente en la definición de la add_ppafunción.

El mensaje de error:

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

Indica que add_ppa no se reconoce como una función.

Parece que puede haber utilizado (en lugar de {al definir la función. Corrija este error y la función debería funcionar correctamente, aunque debería usarse como se indica en la respuesta de muru .

Arronico
fuente