Newsgroup: it.comp.os.linux.sys
Titolo: rpm e input lista file

Ciao a tutti sono nuovo di questa ML ma già scrivevo MOOOLTO tempo fa su
IHM per chi la conoscesse.
Dico subito che questo è un cross-post tra qui e it.comp.linux.redhat
 
Ho un problema, non riesco a passare al comando rpm -e una lista di rpm da
rimuovere contenuti in un file rpm.txt
Quali comandi di pipe?!
 
Ho provato alla semi-ignorante da terminale un bel
# for i in 'cat rpm.txt' do 'rpm -e $i'; done
 
e mi risponde con un bel
-bash: syntax error near unexpected token `done'
 
Dove sbaglio?! Possibile che debba passare all'eliminazione dei file ad
uno ad uno?
Ah dimenticavo, parliamo di una Red Hat Enterprise 6 installata senza X ed
ho generato il file rpm.txt con il comando
# rpm -qa | grep firmware (per rimuovere tutti i pacchetti firmware che mi
son inutili)
 
-- 
 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it
 
 
 

 -bash: syntax error near unexpected token `done'
 
"Provare alla semi-ignorante" non ti porterà molto lontano. La rete è
piena zeppa di tutorial e di esempi.
 
Ci sei andato vicino, ma l'uso delle virgolette è completamente
sbagliato e "do" va in una riga da solo.

 Dove sbaglio?!
 
for i in 'cat rpm.txt' do 'rpm -e $i'; done
 
  Primo errore: uso degli apostrofi invece che degli accenti.
  Secondo errore: assenza del delimitatore di comandi ";" prima di "do".
  Terzo: non è un errore, ma si consiglia l'uso del costrutto $( ... ) al
posto degli apici rovesci (o accenti) per sostituire l'output di un comando
entro una riga di comando.
  Quarto: la shell bash accetta la redirezione dell'input entro un costrutto
$( ... ), cosa che evita il ricorso ad un comando su filesystem.
  Quinto: rpm accetta una lista di nomi di pacchetti, non serve darglieli
uno per volta.
 
  In breve, la riga di comando che volevi usare era questa:
 
for i in $(< rpm.txt) ; do 'rpm -e $i'; done
 
  ma quella migliore è questa:
 
rpm -e $(< rpm.txt)
 
 
  Ciao,
 
 
-- 
Alessandro Selli, 
http://alessandro.route-add.net
 
AVVERTENZA: i messaggi inviati a "trappola" non mi arriveranno.
WARNING: messages sent to "trappola" will never reach me.
Chiave PGP/GPG: EC885A8B

 rpm -e $(< rpm.txt)
 
 
  Ciao,
 
 
-- 
Alessandro Selli 
http://alessandro.route-add.net
 


 rpm -e $(< rpm.txt)
No. Secondo me questa è meglio:
xargs rpm -e <rpm.txt
O meglio ancora, lasciare perdere rpm e manipolare i pacchetti con
gli strumenti della propria distribuzione, yum, yast, urpmi,...

 gli strumenti della propria distribuzione, yum, yast, urpmi,...
 
  Perché, rpm non è uno strumento della Red Hat Enterprise 6?
 
 
  Ciao,
 
 
-- 
Alessandro Selli 
http://alessandro.route-add.net
 


   Perché, rpm non è uno strumento della Red Hat Enterprise 6?
 
Certo. Puoi anche dire che yum e compania sono dei front-end di rpm
ma fanno tante cose che ti parano il culo e che rpm non fa da solo. 
 
Inoltre con i front-end è molto facile selezionare i pacchetti in base 
al nome ;-)

 sostituzione dei comandi.
 
  Ma è proprio quello che l'OP aveva esplicitamente richiesto di fare!
 
  Giusto o sbagliato che sia il suo approccio (che lui stesso chiama
"semi-ignorante"), la sua riga di comando non funzionava per le ragioni
esposte.  Poi certamente, oltre che a correggergli la sua riga di comando, è
bene passare a consigliargli metodi corretti o tecnicamente più sicuri, ma
questo va oltre quello che la sua domanda richiedeva in senso stretto.  Mica
dico che quello che hai scritto non vada bene, al contrario, ma non implica
che non è vero che quello che l'OP voleva fare era di ottenere un ciclo for
per cancellare con rpm una lista di pacchetti elencati in un file.
 
 
  Ciao,
 
 
-- 
Alessandro Selli, 
http://alessandro.route-add.net
 
AVVERTENZA: i messaggi inviati a "trappola" non mi arriveranno.
WARNING: messages sent to "trappola" will never reach me.
Chiave PGP/GPG: EC885A8B

 ...
 
Dove sono le virgolette? Io vedo solo apici. Invece di postare la
soluzione corretta ha i ripetuto i suoi stessi errori. 
Medico cura te steso
 
Ave atque vale
 
 
 
PS  Ancora, l'errore non sta nell'uso degli apici al posto delle
virgolette ma l'uso del for con la sostituzione dei comandi.

 virgolette ma l'uso del for con la sostituzione dei comandi.
 
Scusa l'ignoranza, che problemi comporta l'uso del for?

Addì  mercoledì 21 settembre 2011 14:18 Cristian "sengo" Mammoli scrisse:

http://mywiki.wooledge.org/BashPitfalls#for_i_in_.24.28ls_.2A.mp3.29
 

 soluzione corretta ha i ripetuto i suoi stessi errori.
 
  Sono qui:
http://groups.google.com/group/it.comp.os.linux.sys/msg/e67892b38190d53f
 
 
  Il tuo server se l'è perso?


 virgolette ma l'uso del for con la sostituzione dei comandi.
 
Quale parte di "non e` quello che ha chiesto" non e` chiara? Che, tra 
l'altro, il problema esposto nel link da te riportato lo risolvi 
reimpostando la variabile $IFS (brutto, sporco ma funzionale)
 
Enrico
P.S. sono comunque d'accordo su di una cosa: migliorare le proprie 
conoscenze e` una cosa buona, ma questo non significa che debba obbligare le 
persone a prendere la strada giusta (il mio scopo e` aiutare e consigliare, 
non indottrinare)

   Il tuo server se l'è perso?
 
Ehm... Credo proprio di sì. ;-)
 
Però, torno a dire che l'errore sta nel  for e nella sostituzione
dei comandi;  le virgolette o gli apici sono una questione minore
perchPè con quel costrutti non funzionano né le virgolette né gli
apici.  Ave atque vale
 
 

 consigliare, non indottrinare)
 
Chi vuole imporre la strada giusta che tra l'altro può non esistere o non
unica. Tra l'altro io stesso ho proposto ben tre soluzioni.

 while read apackage; do rpm -e $apackage; done
 
  Così com'è non funziona.  Manca un < rpm.txt dopo il done e mancano le
doppie virgolette su $apackage (nel caso il nome di un pacchetto abbia uno
spazio).
 
  Si può usare un ciclo for se si vuole, in totale sicurezza, se solo si usa
una matrice:
 
RPM=("$(cat rpm.txt)")
for ((I=0;I<${#RPM[@]};I++))
do rpm -e "${RPM[$I]}"
done
 
  Ma riconosco che questo costrutto è più complicato.


 RPM=("$(cat rpm.txt)")
  Haemm, distratto di nuovo!  :-)
RPM=("$(< rpm.txt)")


Ciao e grazie a tutti per aver contribuito a mettermi sulla buona strada.
Sto studiando per la RHCSARHCE il mio intento era di disinstallare da una
RHEL6 di test tutti i pacchetti che avessero la ricorrenza 'firmware' nel
nome, ho risolto seguendo le vostre indicazioni con:
 
for i in $(rpm -qa| grep firmware); do rpm -e $i; done
 
ma da un po' di ricerche ho visto che bastava passare a yum:
 
yum remove whatprovides *firmware*
 
Grazie ancora ed approfitto per chiedere, quanti di voi hanno sostenuto e
passato l'esame per RHCT/RHCSA/RHCE?!
Ma com'č st'esame?! Come si svolge?! Avete dritte?!
 
 
Un saluto
Tyl3R


 yum remove whatprovides *firmware*
 
 
Poi dicono che i gruppi stranieri sono meglio perché non si 
fanno polemiche inutili.

mallin.shetland ha scritto:

  Ma infatti!  Le polemiche sono utilissime!  Si imparano cose
preziosissime nelle contese verbali, nel puntiglio del partito preso e
nelle odiose questioni di principio!  :-)
 
 
  Ciao,
 
 
-- 
Alessandro Selli 
http://alessandro.route-add.net
 


 
 
 
rpm -e `cat file'
 
rpm -e `rpm -qa | grep firmware`
 
 
 

 rpm -e `rpm -qa | grep firmware`
Questa soluzione è sfuggita a tutti, ovviamente..

 Questa soluzione è sfuggita a tutti, ovviamente..
 
  C'è una qualsiasi cosa che uno UNIX qualsiasi non sappia fare in meno
di una dozzina di modi?


 di una dozzina di modi?
 
TMTOWTDI :)
 
Personalmente e` la cosa che mi piace di piu` in uno unix, anzi, secondo me 
un buon amministratore deve saper utilizzare almeno un comando in un modo 
non pensato dal programmatore :)
 
Enrico