Newsgroup: it.comp.os.linux.development
Titolo: BASH: piping stdin e stdout

Hi guys,
Ho un problema talmente banale che non riesco a risolvere (ovvio) e mi
sento un cretino. Spero qualcuno possa aiutarmi.
Si abbia uno script alfa.sh in BASH (o SH) che fa il seguente lavoro:
-----alfa.sh------
#!/bin/bash
ls | mio_programma1 | mio_programma2 | mio_programma3
------------------
una cosa semplicissima: il tutto e' basato sul piping e vari programmi.
Io vorrei raggruppare i miei programmi in un'ulteriore script in bash che
chiameremo beta.sh che verra' richiamato da alfa.sh :
-----beta.sh------
#!/bin/bash
mio_programma1 | mio_programma2 | mio_programma3
------------------
lo script principale alfa.sh diventa:
-----alfa.sh------
#!/bin/bash
ls | beta.sh
------------------
Il problema e' che ovviamente manca qualcosa. Manca il 'collegamento' del
piping tra alfa e il contenuto di beta.
Come posso modificare beta.sh in modo che l'output di "ls" possa essere
recepito dalla catena dei prog. contenuta in beta.sh ?
Grazie :-)
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it



Forse così:
beta `ls`
-- 
oggi no, domani sì

 ------------------
Il tuo problema non mi e' molto chiaro... ho provato ora con un esempio di
questo tipo:
---- /root/bin/beta.sh
#!/bin/bash
sort -nk5 | awk '{print $4}'
---- alfa.sh
#!/bin/bash
ls -l | /root/bin/beta.sh
E lanciare ./alpha.sh funziona esattamente come lanciare:
ls -l | sort -nk5 | awk '{print $4}'
+++
Forse dovresti  dire meglio cosa  fai in mio_programmaN.   Oppure puo'
essere un problema di path o non so di che altro.
Prova a iniziare gli script con:
#!/bin/bash -x
cosi' setti il debug e vedi praticamente tutto quello che succede.
HTH, ciao.
-- 
Sono un servitore del Fuoco Segreto, e reggo la fiamma di Anor.
A nulla ti servira' il fuoco oscuro, fiamma di Udun.
Torna nell'Ombra! Non puoi passare.

 recepito dalla catena dei prog. contenuta in beta.sh ?
Già. Il problema è che l'output di ls finisce in input a beta.sh,
ma beta.sh non lo legge.
Intendo dire _letteralmente_, non c'è nessuna istruzione che legga
lo standard input.
Dovresti fare qualcosa del tipo:
#!/bin/bash
read riga
while [ $riga != "" ]; do
   echo $riga | prg1 | prg2 | prg3
   read riga
done
Questo script non funziona:
1) se riga è più di una parola (sicuramente, visto che viene da ls) il 
test della condizione non va bene.
2) il test va fatto su EOF, non stringa vuota (è lo stesso? non mi sembra)
Non è la soluzione finale, ma spero che come hint ti sia utile.

 beta `ls`
quasto a casa mia corrisponde a un:
ls | xargs beta
ma non a
ls | beta
credo che il problema sta nel fatto che beta non legge lo stdin.
si potrebbe ovviare reindirizzando l'output del primo prog (ls) su file, e
poi leggerlo in qualche modo dal secondo (beta).
ciao
--
Murphy's Law is recursive.
Washing your car to make it rain doesn't work.

  >>>>> "A" == Ambro  <Ambro...@TOGLIMI.it> writes:
[...]
  A> lo script principale alfa.sh diventa: 
  A> -----alfa.sh------
  A> #!/bin/bash 
  A> ls | beta.sh 
  A> ------------------
Anziche` beta.sh, scrivi "beta.sh -". In questo modo forzi beta.sh a
leggere dal suo standard input.
Ciao,
nico

 una cosa semplicissima: il tutto e' basato sul piping e vari programmi.
secondo me sbagli qualcosa in uno dei tuoi programmi.
io ho fatto una prova:
-------------test.sh------------
#!/bin/bash
less
-------------------------------
ora chiamo:
$ ls | ./test.sh
e ottengo la lista dei files filtrata da less.
non vedo dove sia il problema...
