[Bash] Izrada skripte za podešavanje nakon instalacije

C, C++, Java, PHP, Ruby...

Moderator/ica: Moderatori/ce

Pravila foruma
U naslovu teme unutar uglatih zagrada navesti o kojem jeziku je riječ. Primjer: [Java]
Avatar
stefan
Moderator
Postovi: 4366
Pridružen/a: 28 sij 2009, 18:46
Spol: M
OS: openSUSE Leap KDE

Re: [Bash] Izrada skripte za podešavanje nakon instalacije

Post Postao/la stefan »

rkaracic je napisao/la:
Jedno pitanje za svu ekipu.

Da li je moguće, npr., iz piton skripte pozvati neku bash skriptu ? Pošto mi se čini da bi se neke stvari moglo dosta jednostavnije u bashu izvesti.
Da!

Vrlo jednostavno možeš izvršiti program/naredbu/skriptu

Sent from my HTC Sensation using Tapatalk 2
Like some other animals, the gecko can perform a neat trick when threatened by a predator: it can amputate its own tail. The dropped tail serves to distract the predator, and by losing it, the lizard can run faster.
Avatar
shrike
Moderator
Postovi: 10322
Pridružen/a: 07 pro 2007, 18:07
Spol: Y
OS: utuntu 19.10
Kontakt:

Re: [Bash] Izrada skripte za podešavanje nakon instalacije

Post Postao/la shrike »

rkaracic je napisao/la:@shrike

Daj mi molim te u primjeru objasni kako si mislio to izvesti. Nisam te baš skužio na što točno misliš (još sam noob u ovom području )

recimo ovako:

INSTALL=evince

onda neki if

pa INSTALL+=" geeqie"

onda neki if pa

INSTALL+=" vlc"

echo $INSTALL ti onda da
evince geeqie vlc

dakle, u tom trenu da kažeš aptitude install $INSTALL, to bi instaliralo ta 3 paketa

u biti, imaš array od programa :) Uoči navodnike i jedno prazno mjesto. to je zato jer nemreš napisati INSTALL+= vlc ispravno, tako da staviš navodnike da uključe razmak jer će ići u apt-get. fora, ha? tako u biti samo izvrtiš petlju koja pita za koje programe želiš i onda to instalira. u biti to možeš za gro programa napraviti u par redova, samo izlistaš koje programe želi u jednoj for petlji koja onda nadodaje na INSTALL.
Es gibt keinen Gott, kein Universum, keine menschliche Rasse, kein irdisches Leben, keinen Himmel, keine Hölle. Es ist alles ein Traum - ein grotesker und dummer Traum. Nichts existiert außer dir. Und du bist nur ein Gedanke - ein vagabundierender Gedanke, ein nutzloser Gedanke, ein heimatloser Gedanke, der verloren in der leeren Ewigkeit wandelt!
rkaracic
Postovi: 42
Pridružen/a: 08 svi 2014, 02:17
Spol: M
OS: Ubuntu 14.04

Re: [Bash] Izrada skripte za podešavanje nakon instalacije

Post Postao/la rkaracic »

Ahaaaa

Zakon. Zapravo kreiram jedan string sa imenima svih programa i samo kačim na njega programe koje želi. Super fora :D

Zahvaljujem ;)
rkaracic
Postovi: 42
Pridružen/a: 08 svi 2014, 02:17
Spol: M
OS: Ubuntu 14.04

Re: [Bash] Izrada skripte za podešavanje nakon instalacije

Post Postao/la rkaracic »

@shrike

Krenuo sam raditi dio za instalaciju prema tvojoj ideji, ali sam malo zapeo. U jednoj for petlji sada izvrtim sva pitanja oko instalacija i spremam odgovore.

Stavio sam u tu for petlju jedan if, da mi odmah provjerava koji je odgovor (da li je odgovor "da") i ako je odgovor potvrdan, da mi na varijablu install zakači ime programa sa razmakom pa da se može onda lako sve odjednom instalirati.

Pregledao sam kod desetak puta i ne vidim gdje je problem, ali ne radi mi ljepljenje imena programa na varijablu install (barem kada napravim echo $install baca prazan red što bi po meni značilo da je varijabla prazna).

Pokušao sam i na početku deklarirati varijablu install kao praznu (kao u priloženom kodu), bez tog deklariranja sam probao, ali neće. Varijabla install je prazna.

Vjerojatno sam negdje u sintaksi fulao, ali ne mogu pronaći gdje.

Priložio sam taj dio koda ovdje pa da probamo secirati stvar i naći gdje fulava.

Sve ostalo radi kako treba (petlja sprema odgovore u varijable odgovor_"ime programa", izlistava pitanja sa imenom programa i daje odgovarajući opis programa za taj program).

EDIT

Probao sam i tu if petlju staviti u još jednu zasebnu for petlju, ali je isto stanje. Echo vraća prazan red.

Kod: Označi sve

#!/bin/bash

install=""
declare -a popis_instalacija=("Gimp" "VLC" "Gedit")
declare -a opis_programa_za_instalaciju=(
"Gimp je program za grafičku obradu slike" 

"VLC je program za pokretanje raznih multimedijalnih sadržaja.
Podržava skoro sve standardne video codece i ima mogućnost dodavanja i podešavanja subtitlova." 

"Gedit je program za tekst editiranje"
)

for ((i=0; i<3; i++))
do

	echo "Želiš li instalirati ${popis_instalacija[i]} ?"
	echo "${opis_programa_za_instalaciju[i]}"
	echo
	read odgovor_instalacija_${popis_instalacija[i]}
	
if [[ odgovor_instalacija_${popis_instalacija[i]} == "da" ]] || [[ odgovor_instalacija_${popis_instalacija[i]} == "Da" ]] || [[ odgovor_instalacija_${popis_instalacija[i]} == "DA" ]];
	then
		
		install+=" ${popis_instalacija[i]}"
	
	fi

done

echo $install
rkaracic
Postovi: 42
Pridružen/a: 08 svi 2014, 02:17
Spol: M
OS: Ubuntu 14.04

Re: [Bash] Izrada skripte za podešavanje nakon instalacije

Post Postao/la rkaracic »

Mislim da sam otkrio gdje sve krepaje.

Ova linija koda :

Kod: Označi sve

read odgovor_instalacija_${popis_instalacija[i]}
Uhvati moj odgovor i i sprema ga u varijablu koja se zapravo kreira uz pomoć još jedne varijable.

Primjer :

Za VLC odgovorim da i taj odgovor će se spremiti u varijablu odgovor_instalacija_${popis_instalacija} (odnosno odgovor_instalacija_VLC ako bi napravili echo odgovor_instalacija_${popis_instalacija} )

Sve se potrga kada ja trebam pozvati varijablu

Kod: Označi sve

odgovor_instalacija_${popis_instalacija[i]}
jer to onda izgleda zapravo ovako

Kod: Označi sve

$odgovor_instalacija_${popis_instalacija[i]}
i shell to ne vidi onako kako ja vidim :P

Nadam se da sam uspio objasniti svoj zaključak.

E sad, moje pitanje glasi,

kako da ja pozovem tu varijablu $odgovor_instalacija_${popis_instalacija} da ju shell pročita kao odgovor_instalacija_VLC ??

Probao sam sve što mi je palo na pamet (kombinacije u sintaksi), ali ništa nije upalilo. Na moju veliku žalost, ni google mi nije bio od pomoći.
Avatar
Cooleech
Moderator
Postovi: 7032
Pridružen/a: 13 stu 2010, 21:12
Spol: M
OS: Arch Linux KDE
Lokacija: /hrvatska/solin/

Re: [Bash] Izrada skripte za podešavanje nakon instalacije

Post Postao/la Cooleech »

Ovaj dio možeš skratiti:

Kod: Označi sve

if [[ odgovor_instalacija_${popis_instalacija[i]} == "da" ]] || [[ odgovor_instalacija_${popis_instalacija[i]} == "Da" ]] || [[ odgovor_instalacija_${popis_instalacija[i]} == "DA" ]];
ovako:

Kod: Označi sve

varijabla="${varijabla,,}" # sve konvertira u lowercase
if [ "$varijabla" = "da" ]; then
... # nekakav set naredbi
fi
ili, osobno mi daleko draži način jer iziskuje manje tipkanja i nije osjetljiv na greške tipa: dda, daa, Da, Dda, daA, DAA i slično:

Kod: Označi sve

varijabla="${varijabla,,}" # sve konvertira u lowercase
case "$varijabla" in
d*) # za potvrdu
... # nekakav set naredbi
;;
*) # sve što ne počinje sa slovom "d"
... # izbaciš nekakvu grešku or something... or nothing.
;;
esac
;)
Ako želiš da ti shell pročita vrijablu odgovor_instalacija_${popis_instalacija} kako si zamislio, onda napravi varijablu odgovor_instalacija_="odgovor_instalacija_" ;)
Vl@do je napisao/la:Arch imaš upravo zato da uštediš na vremenu. Nemaš nikakvih problema s instalacijama, kompajliranjem i ostalim. Imaš jednostavno funkcionalan i stabilan, uvijek najsvježiji OS, a osim toga je sexy i cool do neba.
I've seen some idiots back in my time, but you man... you're special!
rkaracic
Postovi: 42
Pridružen/a: 08 svi 2014, 02:17
Spol: M
OS: Ubuntu 14.04

Re: [Bash] Izrada skripte za podešavanje nakon instalacije

Post Postao/la rkaracic »

Hvala na savjetu. Sada je proradilo.

Evo kako sada taj dio skripte izgleda :

Kod: Označi sve

#!/bin/bash

declare -a popis_programa=("Gimp" "VLC" "Gedit")
declare -a opis_programa=(
"Gimp je program za grafičku obradu slike" 

"VLC je program za pokretanje raznih multimedijalnih sadržaja.
Podržava skoro sve standardne video codece i ima mogućnost dodavanja i podešavanja subtitlova." 

"Gedit je program za tekst editiranje"
)
declare -a popis_dodataka=("gimp-data gimp-data-extras gimp-gmic" "" "gedit-plugins gedit-developer-plugins")



for ((i=0; i<3; i++))
do

   echo "Želiš li instalirati ${popis_programa[i]} ?"
   echo "${opis_programa[i]}"
   echo "(Instalacija uključuje dodavanje potrebnih repozitorija i svih" 
   echo "popratnih dodataka [pluginova] za program ukoliko postoje)"
   echo
   read odgovor
   
   odgovor="${odgovor,,}"
   
   if [[ $odgovor == "da" ]];
   then
      
      instalacija+=" ${popis_programa[i],,} ${popis_dodataka[i],,}"
      
   fi

   clear
   
done
Sljedeći korak mi je smisliti kako da automatski dodam potrebne repozitorije (ako odaberem instalaciju VLC-a, da se doda videolan repozitorij, a ako preskočim VLC. preskačem i repozitorij).

Mislim da ću morati naknadno češljati varijablu $instalacija i onda ako se u toj varijabli nalazi riječ "vlc" dodaj repozitorij za VLC.

Još to moram razraditi u glavi.

Još jedno pitanje, ali sada vezano uz dio za deinstalaciju koji ću početi raditi uskoro.

Koliko bi bilo pametno da sve deinstalacije obavljam sa asteriskom (ako se tako zove ovaj znakić *) ?

Primjer :

Odaberem deinstalaciju firefoxa i qbittorrenta. Ti odgovori će se onda spremiti u varijablu $deinstalacija u ovom obliku :

Kod: Označi sve

$deinstalacija = " firefox*" " qbittorent*"
I onda bi deinstalacija ovako išla :

Kod: Označi sve

sudo apt-get remove  firefox*  qbittorent*
sudo apt-get purge  firefox*  qbittorent*
Da li bi takav način možda obrisao više nego što treba i možebitno nepovratno osakatio sustav ?
Avatar
jurastublic
Postovi: 1907
Pridružen/a: 16 tra 2011, 08:34
Spol: M
OS: Mint 10 LXDE itd...
Lokacija: i grupa Film

Re: [Bash] Izrada skripte za podešavanje nakon instalacije

Post Postao/la jurastublic »

Ovo što ti gore imaš je jednostavno ali nezgodno za održavanje pošto imaš nekoliko stvari o kojima stalno moraš voditi računa pri dodavanju programa na listu izbora. Recimo, moraš paziti da su indeksi polja opisa i programa sinkronizirani, da ti ona i varijabla u for petlji testira točnu dužinu polja, itd...
To je previše gnjavaže.
Ti u stvari moraš predočiti korisniku jednu listu i napraviti drugu listu za instaliranje na osnovu odabira korisnika.
Jednostavnije je iskoristiti rječnik (dictionary, asocijativno polje) za povezivanje opisa i programa i tako ne moraš voditi računa o sinkronizaciji jer imaš samo jedno mjesto gdje dodaješ sve. I bez one for petlje sa brojem programa koji se stalno mijenja.
Evo pogledaj moju verziju:

Kod: Označi sve

#!/bin/bash

declare -A Izbornik_Programa=(  
# Asocijativna lista ponuđenih programa, slično kao Python dictionary, sa parovima (program, opis programa), veliko -A

[vlc]="Ovo je program za gledanje filmova, najbolji kodeci"
[smplayer]="isto kao i vlc, samo sa boljom podrškom za titlove"
[exaile]="jednostavni svirač glazbe napisan u pitonu"
)

declare -a Odabrani_Programi    # Obična matrica s brojevnim indeksima, malo -a

odaberi_programe () {
# Funkcija za odabir programa za instaliranje. Stvara novu listu izabranih programa u Odabrani_Programi.

    echo Odaberi programe:
    for P in "${!Izbornik_Programa[@]}"; do
        echo $P ---- ${Izbornik_Programa[$P]};
        echo -n Instalirati da/ne:
        read ODGOVOR;
        if [ ${ODGOVOR,,} = "da" ]
        then     # Coolich tolower() FTW
            Odabrani_Programi=(${Odabrani_Programi[@]} $P);    #dodaj izabrani program u novu listu
        fi 
    done 
}

# ovo je main()

odaberi_programe

if [ ${#Odabrani_Programi[@]} -eq 0 ]   #Ako nema elemenata u listi odabranih programa 
    then
        echo -----; echo Nema odabranih programa za instaliranje
    else    #Ako ima, instaliraj programe
        echo Odabrani programi su: ${Odabrani_Programi[@]}
        echo -n Mogu li započeti instaliranje? da/ne: ; read ODLUKA
        if [ $ODLUKA == "da" ]
        then
            sudo apt-get install ${Odabrani_Programi[@]}

        else
            echo Odlučili ste prekinuti instaliranje programa.
        fi
fi
   
    

rkaracic
Postovi: 42
Pridružen/a: 08 svi 2014, 02:17
Spol: M
OS: Ubuntu 14.04

Re: [Bash] Izrada skripte za podešavanje nakon instalacije

Post Postao/la rkaracic »

Svjestan sam ja da ova skripta nije najbajnija. Ima vjerojatno bezbroj mana i tko zna da li će raditi kako treba.

Pokrenuo sam tvoju skripticu i vidim da je sve jednostavnije i efikasnije napravljeno, ali meni to sad u ovom trenutku u životu ne znači puno. Ja sam tek krenuo s učenjem i dosta toga mi u tvojoj skripti nije najjasnije, a to je zato jer nemam još dobru podlogu.

Moja skripta će biti teška početnička, ali će mi (ako sve prođe po planu) stvoriti dobru podlogu za daljnji napredak. Još pokušavam pohvatati osnove.

Moram biti iskren, neke stvari mi ni u mojoj skripti nisu najjasnije (znam svaki red šta radi, ali ne mogu reći da sam u potpunosti ovladao time što sam napisao pa da mogu reći "znam točno i kako to napravi").

Sad sam krenuo ovim smjerom i ostat ću na njemu i dovršiti ju ovakvu kakva je, pa ćemo dalje vidjeti. Tek smo u alpha fazi, di sam još od javne bete ;)
rkaracic
Postovi: 42
Pridružen/a: 08 svi 2014, 02:17
Spol: M
OS: Ubuntu 14.04

Re: [Bash] Izrada skripte za podešavanje nakon instalacije

Post Postao/la rkaracic »

Opet ja.

Trebam savjet. Htio bih preko terminala u skripti smanjiti swappiness.

Ja sam to ovako nekako zamislio :

Kod: Označi sve

echo "#
# Decrease swap usage to a workable level
vm.swappiness=10
# Improve cache management
vm.vfs_cache_pressure=50" >> /etc/sysctl.conf
Hoće ovaj komad koda napraviti ono što mu je namjenjeno ? Znači, samo treba dodati na kraj sysctl.conf datoteke ovaj tekst iz echo-a.

Mislio sam echo dio ovako riješiti pa da mi bude tekst u jednom redu :

Kod: Označi sve

echo -e "#\n# Decrease swap usage to a workable level\nvm.swappiness=10\n# Improve cache management\nvm.vfs_cache_pressure=50"
Ali zbog "\n" u tekstu echo-a, nisam siguran da li će se to dobro zapisati u datoteku.
Odgovori