View Full Version : Scripting Bash
Sick Boy
13-01-2007, 09:26
ciao!
sapete dove posso trovare una guida sullo scripting bash (anche solo dei comandi base)?
grazie
Guida avanzata di scripting Bash: http://www.pluto.it/files/ildp/guide/abs/ c'è tutto. Dalle basi fino all'uso veramente avanzato.
ciao ;)
Sick Boy
10-02-2007, 15:59
ciao!
ho dei problemi con lo scripting shell: ho provato a creare il classico programmino hello word con vi!
l'ho salvato nel file ciao.sh, poi con chmod ho abilitato il file, ma quando scrivo "ciao" o "ciao.sh" il programma non mi parte e mi da un messaggio di errore..
da cosa può essere provocato?
grazie
dipende dal messaggio di errore!
incollalo quà altrimenti è difficile capire il problema
ho dei problemi con lo scripting shell: ho provato a creare il classico programmino hello word con vi!
l'ho salvato nel file ciao.sh, poi con chmod ho abilitato il file, ma quando scrivo "ciao" o "ciao.sh" il programma non mi parte e mi da un messaggio di errore..
da cosa può essere provocato?Se in PATH hai il '.' (la "directory corrente") o la directory esatta dove risiede lo script, allora è ok, altrimenti devi lanciarlo con ./nomescript (o con il path completo).
P.S.: oltre a guide varie (come ti ha già segnalato VICIUS), il manuale ufficiale lo trovi qui: http://www.gnu.org/software/bash/manual/
Sick Boy
10-02-2007, 19:50
l'errore che mi da è "no such file or directory"
Sembra che scrivi male il nome del file. Se fosse un problema di path ti darebbe un errore diverso (command not found).
Usa il completamento automatico della shell (tasto TAB), che oltre a essere comodo (non devi star lì a scrivere il nome per esteso) ti evita errori di digitazione.
Sick Boy
11-02-2007, 23:13
non saprei..
il fatto è che il file è "ciao.sh" ed è impossibile che mi sia sempre sbagliato a scriverlo!
il comando
./ciao.sh
lo lanci dalla cartella in cui c'è lo script vero?
altrimenti devi mettere il path completo: es se ti trovi in
/home/pippo
e lo script è in
/home/pippo/scripts/ciao.sh
se vuoi lanciare lo script senza portarti sulla cartella corretta devi digitare
scripts/ciao.sh
lo so che sono consigli un po' scontati :fagiano: , ma non ti offendere..è che da ciò che descrivi sembra proprio che il file non venga trovato..
Veramente strano. Comincio a pensare che ci possa essere qualche errore all'interno dello script, allora. Non vedo alternative. Prova a postarlo, magari.
Sick Boy
15-02-2007, 16:34
scusate se vi ho fatto perdere tempo, ma era un errore banalissimo nello script: nel commento all'inizio dello script (quello per riconoscere la shell usata) c'era una / in meno!
comunque ho un altro paio di questioni: con il comando touch creo un file e se visualizzo con ls il contenuto della cartella lo vedo di colore rosa!
se poi provo a visualizzare ancora con ls è scomparso! cosa significa tutto questo?
che procedura di comandi devo usare per creare una partizione nei dischi?
grazie in anticipo!
con il comando touch creo un file e se visualizzo con ls il contenuto della cartella lo vedo di colore rosa!
se poi provo a visualizzare ancora con ls è scomparso! cosa significa tutto questo?Innanzitutto 'touch' serve per cambiare la data di un file, se il file non c'è, lo crea (se non specificato diversamente).
Poi bisogna vedere cosa hai fatto con ls ... perché dici che è scomparso il file?
che procedura di comandi devo usare per creare una partizione nei dischi?C'è l'utility "fdisk", che funziona in modalità testuale. Naturalmente ci sono svariate altre utility, anche in ambiente grafico, per partizionare i dischi.
Sick Boy
15-02-2007, 17:16
Innanzitutto 'touch' serve per cambiare la data di un file, se il file non c'è, lo crea (se non specificato diversamente).
Poi bisogna vedere cosa hai fatto con ls ... perché dici che è scomparso il file?
ti faccio un esempio:
sono nella cartella "script". da li uso il comando "touch esempio.ext", poi uso ls e il file esempio.ext mi compare assieme agli altri, anche se è di colore rosa.
se poi riprovo ancora a fare ls, il file non c'è più!
è scomparso perchè il comando touch non crea un file?
C'è l'utility "fdisk", che funziona in modalità testuale. Naturalmente ci sono svariate altre utility, anche in ambiente grafico, per partizionare i dischi.
è proprio della fdisk che ho bisogno! con modalità testuale intendi che è una procedura passo per passo?
grazie!
sono nella cartella "script". da li uso il comando "touch esempio.ext", poi uso ls e il file esempio.ext mi compare assieme agli altri, anche se è di colore rosa.
se poi riprovo ancora a fare ls, il file non c'è più!
Non è proprio possibile. C'è qualcosa che non ci dici...
touch crea un file; vuoto, ma lo crea. Guarda qui:
(gio-19:38)[guldo@debian:tmp]$ ls foo.test
ls: foo.test: No such file or directory
(gio-19:38)[guldo@debian:tmp]$ touch foo.test
(gio-19:38)[guldo@debian:tmp]$ ls -lh foo.test
-rw-r--r-- 1 guldo guldo 0 2007-02-15 19:38 foo.test
(gio-19:39)[guldo@debian:tmp]$ file foo.test
foo.test: empty
(gio-19:39)[guldo@debian:tmp]$ ls foo.test
foo.test
(gio-19:40)[guldo@debian:tmp]$
Sick Boy
15-02-2007, 19:11
effettivamente ora rimangono, ma dici che centra qualcosa il fatto che quelli che "sparivano" erano nella cartella /home/nomeuser?
già che ci sono faccio un'altra domanda:
ho trovato questa funzione:
# !/bin/bash
function chext() {
if [ $# -ne 2 ];
then echo "Almeno due parametri";
return -1;
fi;
for i in *.$1;
do mv $i $(basename $i .$1).$2;
done
}
praticamente questa funzione attacca al file con estensione specificata con $1 l'estensione specificata con $2
io l'ho scritta in un file, ma come faccio a invocarla quando voglio?
ho provato a fare (esempio) chext (ex1, ex2), ma mi dice "bash: syntax error near unexpected token 'ex1,'
dove sto sbagliando questa volta?
scusate se sono domande da principiante, ma è quello che sono! :D
io l'ho scritta in un file, ma come faccio a invocarla quando voglio?Usa:
. filename [arguments]
oppure
source filename [arguments]
Serve per far sì che il file venga letto ed eseguito nel contesto della shell corrente (puoi farlo anche all'interno di un tuo script).
Le definizioni di funzioni e variabili presenti nel file saranno quindi poi disponibili alla shell.
Sick Boy
16-02-2007, 14:36
Usa:
. filename [arguments]
oppure
source filename [arguments]
Serve per far sì che il file venga letto ed eseguito nel contesto della shell corrente (puoi farlo anche all'interno di un tuo script).
Le definizioni di funzioni e variabili presenti nel file saranno quindi poi disponibili alla shell.
ho provato a fare così (nel mio caso era: source chext.sh ex1 ex2) e non mi ha dato errori, però provandola con uno o nessun argomento non mi da errori come invece dovrebbe visto che c'è il controllo che ci siano almeno 2 argomenti!
No, no, tu ti sei voluto complicare la vita per niente con una funzione.
Non c'era bisogno di creare una funzione, avresti potuto creare uno script che contenesse direttamente il corpo della tua funzione.
Così fai confusione.
Nel tuo caso (file che contiene una funzione), i passaggi sono due:
fai conoscere a bash la tua funzione, contenuta nel file *.sh:
source ./chext.sh
richiami la funzione in questione, con i parametri:
chext ex1 ex2
Cmq nota che nella tua funzione non controlli che gli argomenti siano almeno due; controlli che siano esattamente due.
Sick Boy
16-02-2007, 15:03
No, no, tu ti sei voluto complicare la vita per niente con una funzione.
Non c'era bisogno di creare una funzione, avresti potuto creare uno script che contenesse direttamente il corpo della tua funzione.
Così fai confusione.
Nel tuo caso (file che contiene una funzione), i passaggi sono due:
fai conoscere a bash la tua funzione, contenuta nel file *.sh:
source ./chext.sh
richiami la funzione in questione, con i parametri:
chext ex1 ex2
Cmq nota che nella tua funzione non controlli che gli argomenti siano almeno due; controlli che siano esattamente due.
hai ragione! infatti non so come applicarla ad un file!
hai ragione! infatti non so come applicarla ad un file!
Basta commentare la riga
function chext() {
(e la relativa parentesi graffa chiusa)
Allora potrai fare direttamente:
./chext.sh ex1 ex2
Inoltre tutti i ; che hai messo non servono.
Il ; serve per mettere più di un comando su una stessa riga, ma se vai a capo è inutile.
p.s.: dubito che il programma funzioni correttamente con file i cui nomi contengono degli spazi... ma per ora lascia perdere.
p.s.: dubito che il programma funzioni correttamente con file i cui nomi contengono degli spazi... ma per ora lascia perdere.È sufficiente usare gli apici. Ad esempio mettendo:
do mv "$i" $(basename "$i" .$1).$2
Sick Boy
16-02-2007, 15:35
ok, adesso funziona!
grazie a tutti (per ora)!
Sick Boy
23-02-2007, 12:19
ciao! sono ancora io!
mi potreste spiegare come funziona il comando tar per compattare e scompattare dei file?
ad esempio:
se mi trovo nella cartella "bashscript" che contiene diversi file più "esempio.xx" come faccio a creare un archivio "prova.tar.gz" (va bene anche "prova.tar"?) contenente solo il file "esempio.xx"? e se volessi lo stesso archivio con tutta la cartella "bashscript" cosa devo modificare?
per scompattare i due archivi creati cosa devo fare?
grazie! :D
mi potreste spiegare come funziona il comando tar per compattare e scompattare dei file?
ad esempio:
se mi trovo nella cartella "bashscript" che contiene diversi file più "esempio.xx" come faccio a creare un archivio "prova.tar.gz" (va bene anche "prova.tar"?) contenente solo il file "esempio.xx"? e se volessi lo stesso archivio con tutta la cartella "bashscript" cosa devo modificare?
per scompattare i due archivi creati cosa devo fare?Innanzitutto 'tar' non opera alcuna compressione. tar e gzip/gunzip sono tools differenti che però possono essere usati insieme, come vedrai tra poco:
Per creare:
tar cvf prova.tar *.txt *.c
Per elencare il contenuto:
tar tvf prova.tar
Per estrarre:
tar xvf prova.tar
Per usare insieme al gzip/gunzip:
Per creare:
tar cvfz prova.tar.gz *.txt *.c
idem per le altre operazioni ma con l'opzione 'z' (significa: filtra l'archivio attraverso gzip/gunzip). Per le altre opzioni come c, v, f, vedere la pagina di 'man'.
Nota che il fatto di appendere al nome un .gz è solo informativo per l'utente. Se vedi che è .gz sai già che dovrai usare gunzip (a mano) o insieme a tar con l'opzione 'z'.
trallallero
23-02-2007, 12:46
ciao! sono ancora io!
mi potreste spiegare come funziona il comando tar per compattare e scompattare dei file?
ad esempio:
se mi trovo nella cartella "bashscript" che contiene diversi file più "esempio.xx" come faccio a creare un archivio "prova.tar.gz" (va bene anche "prova.tar"?) contenente solo il file "esempio.xx"? e se volessi lo stesso archivio con tutta la cartella "bashscript" cosa devo modificare?
per scompattare i due archivi creati cosa devo fare?
grazie! :D
ma il man non vi piace proprio ? :mbe:
Vabbé, per creare un pacchetto:
tar cf pacchetto.tar nome_pacchetto
nome_pacchetto puó essere un direttorio, file, * (per tutti i files) etc
per spacchettare:
tar xf nome_pacchetto.tar
per vedere il contenuto senza spacchettare:
tar tvf nome_pacchetto.tar
per aggiungere un file ad un pacchetto:
tar uf nome_pacchetto.tar nome_file
l'opzione v la puoi aggiungere a tutte le operazioni per il verbose mode in modo da poter vedere quello che sta facendo (per pacchetti enormi non conviene perché perde tempo a scrivere a video ;) )
Quando hai creato un pacchetto lo zippi:
gzip -9 nome_pacchetto.tar
ciao :)
EDIT: battuto sul tempo :D
Sick Boy
23-02-2007, 14:05
grazie mille!
nel caso voglia inserire in un pacchetto tutti i file di una cartella devo inserire tutto il path o va bene solo la cartella finale?
trallallero
23-02-2007, 14:09
grazie mille!
nel caso voglia inserire in un pacchetto tutti i file di una cartella devo inserire tutto il path o va bene solo la cartella finale?
se trovi nella directory che contiene quella che vuoi "pacchettare" va bene solo la cartella finale
nel caso voglia inserire in un pacchetto tutti i file di una cartella devo inserire tutto il path o va bene solo la cartella finale?Il tar memorizza nell'archivio esattamente il path che tu eventualmente specifichi con i file da archiviare. Con una eccezione: per default strippa via il '/' se specifichi un path assoluto. Si deve usare l'opzione -P o --absolute-paths per mantenere il '/'.
Esempio:
tar cvf prova.tar /tmp/*.txt
contiene:
-rw-r--r-- pcguest/root 37 2007-02-05 11:37:18 tmp/file1.txt
-rw-r--r-- pcguest/root 26 2007-01-17 15:18:50 tmp/file2.txt
-rw-r--r-- pcguest/root 0 2007-02-16 16:27:04 tmp/prova.txt
tar cvfP prova.tar /tmp/*.txt
contiene:
-rw-r--r-- pcguest/root 37 2007-02-05 11:37:18 /tmp/file1.txt
-rw-r--r-- pcguest/root 26 2007-01-17 15:18:50 /tmp/file2.txt
-rw-r--r-- pcguest/root 0 2007-02-16 16:27:04 /tmp/prova.txt
Sick Boy
25-02-2007, 12:44
ciao!
prima di tutto grazie perchè ora ho capito abbastanza bene il comando tar.
ho un'ultima domanda: se voglio spacchettare il pacchetto prova.tar contenuto nella cartella dir1/ nella cartella dir2/ cosa devo fare?
ho provato a fare tar xvf prova.tar dir2 ma mi ha aggiunto la cartella dir2 al pacchetto! (a proposito: per rimuovere un file da un pacchetto che cosa devo usare?)
grazie!
Dovresti provare a leggere la pagina man di tar...
Cmq:
tar xvf prova.tar --directory dir2
Per eliminare un file dall'archivio c'è il comando --delete
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.