Bash - skrypcik do kompilacji źródeł Slackware

Problemy dotyczące programowania.

Moderatorzy: Moderatorzy, Administratorzy

vitos
Użytkownik
Posty: 104
Rejestracja: 2005-10-30, 09:13
Lokalizacja: Pszów
Kontakt:

Bash - skrypcik do kompilacji źródeł Slackware

Post autor: vitos » 2017-01-21, 11:19

Napisałem sobie oto taki skrypcik do kompilacji ze źródeł Slackware'owskich paczek. W podrzędnych katalogach znajdują się źódła paczek wraz ze skryptami Slackbuild.

Kod: Zaznacz cały

#!/bin/sh

export CPU="pentium3" ARCH="i686" FLAGS="-mtune=pentium3 -fomit-frame-pointer" TMP="/tmp/a"

INPLACE_UPGRADE="yes"
FAILDIR="$TMP/__failures__"

PACKAGES="bash"

mkdir -p $FAILDIR

for i in ./$PACKAGES/*.SlackBuild;
do
  cd $(dirname $i)
  if [ $INPLACE_UPGRADE = "yes" ]; then
    sh $(basename $i) && ( upgradepkg --install-new $TMP/$(basename $i .SlackBuild)*.txz; ldconfig ) || touch $FAILDIR/$(basename $i .SlackBuild).failed
  else
    sh $(basename $i) || touch $FAILDIR/$(basename $i .SlackBuild).failed
  fi
  cd ..
  sleep 1
done

unset CPU ARCH FLAGS TMP
Skrypt ma tworzyć paczkę wpisaną do zmiennej PACKAGES. Niestety kiedy chcę skompilować sobie kilka paczek i do zmiennej PACKAGES przypiszę parę katalogów w postaci np. PACKAGES="{bash,util-linux}", skrypt nie działa i wypisuje błąd o treści:

Kod: Zaznacz cały

./a.build: line 14: cd: ./{bash,util-linux}: No such file or directory
sh: *.SlackBuild: No such file or directory
Jeśli wpiszę bezpośrednio zamiast użycie zmiennej PACKAGES do pętli for nazwy paczek w postaci

Kod: Zaznacz cały

for i in ./{bash,util-linux}/*.SlackBuild; do
  działaj
done
to skrypt przechodzi bez błędów. Nie za bardzo wiem, jak zdefiniować zmienną PACKAGES, żeby bash nie wywalał błędu.

Będę bardzo wdzięczny za pomoc :-)

vitos
Użytkownik
Posty: 104
Rejestracja: 2005-10-30, 09:13
Lokalizacja: Pszów
Kontakt:

Re: Bash - skrypcik do kompilacji źródeł Slackware

Post autor: vitos » 2017-01-22, 10:02

Obszedłem problem w taki sposób, troszkę upraszczając skrypcik.

Kod: Zaznacz cały

#!/bin/sh

export CPU="i686" ARCH="i686" FLAGS="-mtune=pentium3 -fomit-frame-pointer" TMP="/tmp/a"

INPLACE_UPGRADE="yes"
FAILDIR="$TMP/__failures__"

PACKAGES="bash"

mkdir -p $FAILDIR

for i in $PACKAGES;
do
  cd $i
  if [ $INPLACE_UPGRADE = "yes" ]; then
    sh $i.SlackBuild && ( upgradepkg --install-new $TMP/$i*.txz; ldconfig ) || touch $FAILDIR/$i.failed
  else
    sh $i.SlackBuild || touch $FAILDIR/$i.failed
  fi
  cd ..
  sleep 1
done

unset CPU ARCH FLAGS TMP
Teraz wszystko działa :-)

Awatar użytkownika
Lizard
Moderator
Posty: 2571
Rejestracja: 2005-05-21, 15:48
Lokalizacja: miasto w mieście

Re: Bash - skrypcik do kompilacji źródeł Slackware

Post autor: Lizard » 2017-01-22, 14:36

Kiedy stosujesz konstrukcje Basha, to nie wywołuj powłoki sh, tylko bash (#!/bin/bash). Po drugie konstrukcje typu "PACKAGES=./{bash,utilplinux}" nie są zamieniane przez powłokę na odrębne ścieżki, więc nie zadziałają.
vitos pisze:

Kod: Zaznacz cały

    sh $i.SlackBuild && ( upgradepkg --install-new $TMP/$i*.txz; ldconfig ) || touch $FAILDIR/$i.failed
Tutaj nie wiesz, czy niepowodzeniem zakończyło się tworzenie pakiety, czy aktualizacja. Spróbuj czego takiego:

Kod: Zaznacz cały

for i in $PACKAGES;
do
  (
  cd $i
  if [ $INPLACE_UPGRADE = "yes" ]; then
    if ! sh $i.SlackBuild; then
      touch $FAILDIR/$i-SlackBuild.failed
      exit
    fi
    if ! upgradepkg --install-new $TMP/$i*.txz; then
      touch $FAILDIR/$i-upgradepkg.failed
      exit
    fi
    ldconfig
  else
    sh $i.SlackBuild || touch $FAILDIR/$i.failed
  fi
  )
  sleep 1
done
Error 404 - footer not found

vitos
Użytkownik
Posty: 104
Rejestracja: 2005-10-30, 09:13
Lokalizacja: Pszów
Kontakt:

Re: Bash - skrypcik do kompilacji źródeł Slackware

Post autor: vitos » 2017-01-22, 15:03

...konstrukcje typu "PACKAGES=./{bash,utilplinux}" nie są zamieniane przez powłokę na odrębne ścieżki, więc nie zadziałają.
Tego nie wiedziałem, że bash ich nie zamienia. Mógłbym kombinować nad tym do świąt :-) Super, bardzo Ci dziękuję.
Kiedy stosujesz konstrukcje Basha, to nie wywołuj powłoki sh, tylko bash
W SlackWare 14.1 do sh mam podlinkowane polecenie bash, więc zawsze wywoła się bash. No chyba, że ktoś ma zainstalowane inne powłoki. Ale je używam tylko bash'a. Ale masz rację #!/bin/bash jest bardziej eleganckim rozwiązaniem.

Bardzo dziękuję za pomoc :-)

Awatar użytkownika
Lizard
Moderator
Posty: 2571
Rejestracja: 2005-05-21, 15:48
Lokalizacja: miasto w mieście

Re: Bash - skrypcik do kompilacji źródeł Slackware

Post autor: Lizard » 2017-01-22, 15:40

Na wszelki wypadek lepiej podać dokładnie co ma być użyte do wykonania skryptu. Zmienisz powłokę domyślną, podzielisz się z kimś skryptem i będzie kłopot. Jeszcze jedna ciekawostka: "sh skrypt" zawsze wywoła powłokę domyślną niezależnie od tego, co będzie za '#!', więc lepiej skrypty wywoływać bezpośrednio przez: /ścizęka/skrypt (np: ./skrypt).
Error 404 - footer not found

ODPOWIEDZ