Debianizzati.Org | Forum | Blog | Guide | IRC
 
 
Forum Italiano Debian - Debianizzati.Org
Ottobre 08, 2008, 11:42:54 *
Benvenuto, Visitatore. Per favore, effettua il login o registrati.
Hai perso la tua email di attivazione?

Login con username, password e lunghezza della sessione
News:
 
   Home   Help Ricerca Calendario Login Registrati  
Pagine: [1]   Vai Giù
  Stampa  
Autore Topic: Qualche chiarimento su alcune funzioni BASH  (Letto 732 volte)
0 Utenti e 1 Visitatore stanno guardando questo topic.
Barzi
Newbie
*

Karma: +0/-0
Offline Offline

Posts: 32


Guarda Profilo
« il: Dicembre 04, 2007, 03:09:07 »

Ciao a tutti...

Avrei bisogno di alcuni chiarimenti (sarebbero graditi anche esempi) su queste cose qua:

- che differenza c'è tra l'uso dei `` e il | ma anche del >> o ancora di usare una subshell (...)
- che differenza c'è tra i ":" e /dev/null
- qualcuno mi può spiegare un po meglio come funziona l'operatore - inteso come redirezione allo/dallo stdin stdout

Per ora credo che sia sufficiente.
thanks Smiley
Loggato
gallows
Full Member
***

Karma: +2/-1
Offline Offline

Posts: 107


gall0ws@tiscali.it
Guarda Profilo WWW
« Risposta #1 il: Dicembre 04, 2007, 06:23:24 »

Ciao a tutti...

Avrei bisogno di alcuni chiarimenti (sarebbero graditi anche esempi) su queste cose qua:

- che differenza c'è tra l'uso dei `` e il | ma anche del >> o ancora di usare una subshell (...)

Premetto che non conosco il tuo livello di preparazione, se dico cose che ti sembreranno ovvie è per questo Smiley
`foo` esegue foo in una subshell e spedisce l'output direttamente alla shell superiore.
Esempi:

Codice:
$ `find /usr -name xlogo`

Viene eseguito find che, appena trova xlogo, restituisce alla shell superiore l'output (generalmente /usr/bin/xlogo), che viene eseguito e quindi parte l'applicazione. Sostanzialmente è come se al posto di `...` avessi scritto direttamente il risultato.

Codice:
$ file `which editor`

Qui viene eseguito prima di tutto il comando `which' in una subshell e l'output viene "rispedito" indietro, in questo caso viene passato come argomento a `file'. Per il resto è uguale all'esempio precedente.
Un sinonimo di `foo` è $(foo). Entrambi sono comandi di sostituzione.

| è una pipe, serve a reindirizzare l'output di ciò che è a sinistra verso l'input di quello che è a destra.
Esempio:

Codice:
$ cat foo.txt | less

L'output di cat viene passato all'input di less.

Attento a non usare la pipe per passare _argomenti_, es:

Codice:
$ ls /etc/inittab | file

Questo è sbagliato, perché `file' non legge dallo stdin, in questo caso può essere utile o usare i comandi di sostituzione oppure `xargs', es:

Codice:
$ ls /etc/inittab | xargs file

Questo funziona, l'output di ls viene passato, grazie a xargs, come argomento a file.

L'operatore `>>' redirige l'output di ciò che è a destra sul nome del file alla sinistra, inserendo però i dati _alla fine_ del file.
Se il file non esiste o è vuoto si comporta esattamente come `>'.

Le subshell sostanzialmente creano un nuovo ambiente, quindi le variabili della subshell sono "locali", cioè non sono visibili dalla shell genitrice.
Esempio:

Codice:
> x=0
> ( x=3 )
> echo $x
0

Citazione
- che differenza c'è tra i ":" e /dev/null

Se devi ignorare un determinato output non puoi redirigerlo verso ":", se invece vuoi creare un file vuoto non fa differenza. (In alternativa puoi usare `touch').

Citazione
- qualcuno mi può spiegare un po meglio come funziona l'operatore - inteso come redirezione allo/dallo stdin stdout

In genere `-' si usa più come opzione di un programma (penso a tar o wget) che come operatore vero e proprio. In pratica si usa per dire ad un programma di spedire determinate informazioni sullo stdout (per poi magari essere manipolate da awk o sed).

Citazione
Per ora credo che sia sufficiente.
thanks Smiley

Spero di essere stato chiaro e (possibilmente) utile.
Se vuoi approfondire ti consiglio ABS di Mendel Cooper, un'ottima guida allo scripting di Bash.
« Ultima modifica: Dicembre 04, 2007, 06:25:27 da gallows » Loggato

The name "ubuntu" comes from the Zulu and Xhosa concept of ubuntu, and can be roughly defined as: "I can't install Debian".
Barzi
Newbie
*

Karma: +0/-0
Offline Offline

Posts: 32


Guarda Profilo
« Risposta #2 il: Dicembre 05, 2007, 08:55:42 »

Ok....

Allora chiarezza fatta per i `...`. Ora mi è chiaro anche il $(...), anche se non vedo l'utilita di ridurre lo scope delle variabili utilizzando le (...), in fondo si possono creare infinite variabili!!
Cmq ora mi è chiaro che aprono subshell entrambi.
Per quanto riguarda il resto credo che allora ho confusione con le DEFINIZIONI.
Hai parlato di "reindirizzare" e "redirigere". Che differenza c'è tra questi 2 termini?
Poi.... come definiamo il "passare argomenti" e il "passare output"??
Ad esempio qua

Citazione
$ ls /etc/inittab | file
Questo è sbagliato, perché `file' non legge dallo stdin,

Puoi essere un pochino più chiaro riguardo la tua asserzione? file deve leggere NECESSARIAMENTE dallo stdin?Ma io cosi facendo non mando l'output di ls /etc/inittab nell'input di file?
Poi...
Lo stdin,stout e stderr come devo considerarli?Non posso considerarli come files?
Infine a un certo punto dici:
Citazione
In genere `-' si usa più come opzione di un programma (penso a tar o wget) che come operatore vero e proprio. In pratica si usa per dire ad un programma di spedire determinate informazioni sullo stdout (per poi magari essere manipolate da awk o sed).
Mi faresti un esempio con la successiva manipolazione con awk o sed?

Grazie!!  Smiley
Loggato
GipPasso
Global Moderator
Hero Member
*****

Karma: +27/-0
Online Online

Posts: 1254



Guarda Profilo WWW Email
« Risposta #3 il: Dicembre 05, 2007, 09:16:18 »

@ Barzi:
io qui dentro (http://www.pluto.it/files/ildp/guide/abs/index.html) ho trovato le risposte che tu cercavi in pochi minuti.

Credo che sia un'ottima guida, ricca di esempi.

GipPasso.
Loggato
Barzi
Newbie
*

Karma: +0/-0
Offline Offline

Posts: 32


Guarda Profilo
« Risposta #4 il: Dicembre 05, 2007, 09:54:37 »

La guida di cui sopra ce l'ho in pdf e la sto studiando....

Ma è proprio questa guida che mi ha messo questi dubbi e ora verrei cercare di scioglierli!! Smiley
Loggato
gallows
Full Member
***

Karma: +2/-1
Offline Offline

Posts: 107


gall0ws@tiscali.it
Guarda Profilo WWW
« Risposta #5 il: Dicembre 05, 2007, 01:49:03 »

Ok....

Allora chiarezza fatta per i `...`. Ora mi è chiaro anche il $(...), anche se non vedo l'utilita di ridurre lo scope delle variabili utilizzando le (...), in fondo si posson\
o creare infinite variabili!!

In realtà io non le uso mai, però possono essere utilizzate per eseguire diversi processi in parallelo.

Citazione
Cmq ora mi è chiaro che aprono subshell entrambi.
Per quanto riguarda il resto credo che allora ho confusione con le DEFINIZIONI.
Hai parlato di "reindirizzare" e "redirigere". Che differenza c'è tra questi 2 termini?
Poi.... come definiamo il "passare argomenti" e il "passare output"??
Ad esempio qua

Citazione
$ ls /etc/inittab | file
Questo è sbagliato, perché `file' non legge dallo stdin,

Puoi essere un pochino più chiaro riguardo la tua asserzione? file deve leggere NECESSARIAMENTE dallo stdin?Ma io cosi facendo non mando l'output di ls /etc/inittab nell'inp\
ut di file?

No, ho scritto che file NON legge dallo stdin, ma in realtà è possibile farlo in questo modo:

Codice:
$ echo /etc/inittab | file -

Citazione
Poi...
Lo stdin,stout e stderr come devo considerarli?Non posso considerarli come files?

Tecnicamente sono file ( /dev/stderr  /dev/stdin  /dev/stdout ), quindi sì.
Esempio, se vuoi scrivere nello stderr puoi fare così:

Codice:
$ echo "messaggio di errore" > /dev/stderr

Puoi comunque fare anche così:

Codice:
$ echo "altro messaggio" 1>&2

1 è lo stdout e 2 è lo stderr, quindi redirigi tutto ciò che verrebbe stampato sullo stdout sullo stderr, ovviamente puoi fare anche il contrario. (L'1 puoi anche ometterlo).

Citazione
Infine a un certo punto dici:
Citazione
In genere `-' si usa più come opzione di un programma (penso a tar o wget) che come operatore vero e proprio. In pratica si usa per dire ad un programma di spedire determina\
te informazioni sullo stdout (per poi magari essere manipolate da awk o sed).
Mi faresti un esempio con la successiva manipolazione con awk o sed?

Al momento mi viene in mente un esempio con wget, zcat e patch...

Codice:
$ wget http://www.somesite.net/patches/patch.diff.gz -O- | zcat | patch -p1

wget scarica la patch e la scrive sullo stdout, con la pipe la passiamo a zcat che la decomprime e la scrive sempre sullo stdout, dunque la possiamo applicare.

Citazione
Grazie!!  Smiley

Figurati.
« Ultima modifica: Dicembre 05, 2007, 02:03:08 da gallows » Loggato

The name "ubuntu" comes from the Zulu and Xhosa concept of ubuntu, and can be roughly defined as: "I can't install Debian".
Pagine: [1]   Vai Su
  Stampa  
 
Salta a:  

Altri Topic Correlati
Oggetto Iniziato da Risposte Visto Ultimo Post
chiarimento su release Apt-get & friends kelvin273 3 514 Ultimo Post Settembre 17, 2006, 04:22:12
da kelvin273
Chiarimento Etch Generale Tex 4 277 Ultimo Post Gennaio 16, 2008, 01:18:42
da marbel
chiarimento su amsn Generale nic 8 401 Ultimo Post Gennaio 20, 2008, 10:48:58
da nic
chiarimento su libata Hardware SoWhat 8 419 Ultimo Post Gennaio 27, 2008, 10:14:20
da tindal
sudo sembra non funzioni... Generale vheon 8 219 Ultimo Post Agosto 29, 2008, 04:29:18
da Fi3rizi0
Powered by MySQL Powered by PHP Powered by SMF 1.1.6 | SMF © 2006-2007, Simple Machines LLC
Seo4Smf v0.2 © Webmaster's Talks
Traduzione Italiana a cura di SMItalia
XHTML 1.0 Valido! CSS Valido!
Pagina creata in 0.394 secondi con 21 queries.