Pagina 1 di 1

problema con bash e flusso dello script

Inviato: gio 23 mag 2019, 11:09
da conraid
PErdonate il titolo ma non sapevo che mettere, e anche a cercare online non so cosa cercare.
Scrivo il problema qui, cercando di spiegarlo che mica è semplice, o forse sì, e magari anche se non sapete rispondere se potete darmi delle dritte su cosa cercare.
Vi spiego.
Ho uno script in bash per compilare in sequenza i miei script.
Prende il file .info, installa le dipendenze e compila il pacchetto.
Anche se scritto male (e per questo non l'ho messo su github) funziona a dovere, ma ha un problema.
Vi faccio un esempio:
ho Pippo che richiede la libreria Palla da compilare.
Quindi lancio lo script che compila (che si chiama blankpkg) di Pippo e prima cerca nella directory di sviluppo e poi in quella del repository la libreria Palla, la installa e poi lancia la compilazione.
Quindi

Codice: Seleziona tutto

# blankpkg 
nella directory Pippo funziona. Se Palla è nella directory di sviluppo prende quella, altrimenti la prende dal repository.
Se però lancio il tutto tramite script automatico, cioè un banale script che fa

Codice: Seleziona tutto

for i in *; do cd $i; blankpkg ; cd -; done
funziona anch'esso, compilando prima Palla e poi Pippo, ma, e qui arriva il problema, prende Palla dal repository e non quella appena compilata.
Come posso forzare la cosa? è come se prendesse quel che c'è al momento del lancio dello script con for e non quello al momento in cui lancia blankpkg.

Spero di essermi spiegato.

Re: problema con bash e flusso dello script

Inviato: gio 23 mag 2019, 20:25
da targzeta
Ma la directory di sviluppo qual'è? Quella in cui lanci il ciclo for?

Lo script blankpkg come cerca la directory di sviluppo? Con un path assoluto o relativo?

Che test fa per capire se la directory Palla esiste nella directory sviluppo?

Emanuele

Re: problema con bash e flusso dello script

Inviato: ven 24 mag 2019, 8:00
da conraid
targzeta ha scritto:Ma la directory di sviluppo qual'è? Quella in cui lanci il ciclo for?
Sì, lo lancio dalla directory di sviluppo
targzeta ha scritto: Lo script blankpkg come cerca la directory di sviluppo? Con un path assoluto o relativo?
In realtà ricordavo male, blankpkg chiama a suo volta uno script che si chiama installdep con il nome del pacchetto.
blankpkg fa controlli

Quindi in blankpkg ho

Codice: Seleziona tutto

      
      slackpkg -batch=on -default_answer=y clean-system
      installdep $NAME
sono in chroot, quindi prima di ogni compilazione pulisco la slackware dai pacchetti non originali e poi installo quelli che servono.

installdep è questo

Codice: Seleziona tutto

#!/bin/sh
set -eu

if [ "$(id -u)" != "0" ]; then
   echo "This script must be run as root" 1>&2
   exit 1
fi

CWD=$(pwd)
ROOTDIR=/opt/slackers/
REPODIR=$ROOTDIR/repository
DEVELDIR=$ROOTDIR/devel
BUILDIR=$DEVELDIR/SlackBuilds
WORKDIR=$DEVELDIR/working
READYDIR=$DEVELDIR/ready
DEPS=()

if [ -z ${1:=''} ]; then
  echo "Manca il nome del pacchetto"
  exit 1
fi

NAMEPKG=$(echo $1 | sed 's|/$||' | sed 's|\.$||' )

if ! [ -d $REPODIR/$NAMEPKG -o -d $READYDIR/$NAMEPKG -o -d $WORKDIR/$NAMEPKG ]; then
  echo "$NAMEPKG non è il nome di un pacchetto presente nel repository"
  exit 1
fi

INST=${2:-n}

_instpkg() {
  if [ "x$INST" = "xn" ]; then
    if [ "x$1" != "x$NAMEPKG" ]; then
      _installpkg $1
    fi
  else
    _installpkg $1
  fi
}

_installpkg() {

  if [ -e $WORKDIR/$1/${1}*cf.txz ]; then
    upgradepkg --install-new $WORKDIR/$1/${1}*cf.txz
  elif [ -e $READYDIR/$1/${1}*cf.txz ]; then
    upgradepkg --install-new $READYDIR/$1/${1}*cf.txz
  elif [ -e $REPODIR/$1/${1}*cf.txz ]; then
    upgradepkg --install-new $REPODIR/$1/${1}*cf.txz
  else
    echo "ERROR. Manca $1"
    exit 1
  fi

}

_findep() {

if [ -d $WORKDIR/$1 ]; then
  cd $WORKDIR/$1
elif [ -d $READYDIR/$1 ]; then
  cd $READYDIR/$1
elif [ -d $BUILDIR/$1 ]; then
  cd $BUILDIR/$1
else
  cd $CWD
fi

if [ -e slack-required ]; then
  DEP=($(cat slack-required | cut -d" " -f1))
else
  source ./$1.info
  REQA=$(echo $REQUIRES | sed 's/,//g')
  DEP=($REQA)
fi

if [[ ${DEP[@]} ]]; then
  for pkg in "${DEP[@]}"; do
    if ! echo ${DEPS[@]} | tr - _ | grep -q -w "$(echo $pkg | tr - _)"; then
      if [ $pkg != $NAMEPKG ]; then
        DEPS+=($pkg)
        _findep $pkg
      fi
    fi
  done
fi
_instpkg $1
}

_findep $NAMEPKG
la directory ready è la directory dove appoggio i pacchetti pronti in modo poi da lanciare vari script che mi creano il changelog.


targzeta ha scritto: Che test fa per capire se la directory Palla esiste nella directory sviluppo?
[/quote]

Codice: Seleziona tutto

if [ -d $WORKDIR/$1 ]; then
  cd $WORKDIR/$1
elif [ -d $READYDIR/$1 ]; then
  cd $READYDIR/$1
elif [ -d $BUILDIR/$1 ]; then
  cd $BUILDIR/$1
else
  cd $CWD
fi

Re: problema con bash e flusso dello script

Inviato: dom 26 mag 2019, 0:44
da targzeta
Quando lanci il ciclo, l'* viene sostituito dall'insieme delle directory presenti attualmente. Però i comandi che lanci ogni volta sono indipendenti. Quindi se poi la directory si popola con nuove directory, lo script blankpkg dovrebbe vederle. Sei sicuro che quando compila Pippo, la directory Palla sia presente? L'unica è mettere qualche "echo" nello script che cerca la dipendenza nel fs locale.

Emanuele

Re: problema con bash e flusso dello script

Inviato: lun 27 mag 2019, 12:24
da conraid
targzeta ha scritto:Quando lanci il ciclo, l'* viene sostituito dall'insieme delle directory presenti attualmente. Però i comandi che lanci ogni volta sono indipendenti. Quindi se poi la directory si popola con nuove directory, lo script blankpkg dovrebbe vederle. Sei sicuro che quando compila Pippo, la directory Palla sia presente? L'unica è mettere qualche "echo" nello script che cerca la dipendenza nel fs locale.

Emanuele
Sì, son sicuro, perché per esempio, se formo lo script e lo rilancio la riconosce bene. È come se prendesse solo i pacchetti presenti al momento del lancio del primo script. Cercherò di fare qualche debug. Thanks-