Newsgroup: it.comp.os.linux.development
Titolo: domanda su uno script bash

Ehm, lo so che non e' "development" in senso stretto, ma credo che
comunque questo sia il ng piu' adatto.
Ho questo problema:
mi piace giocare a mame, e mi piace avere anche amor in esecuzione
tuttavia ho notato che, se lancio il primo mentre il secondo gira, dopo
poco tempo i giochi rallentano paurosamente.
per questo avevo pensato ad uno script da lanciare da console, piu' o meno
una cosa cosi':
#!/bin/bash
killall amor
xcpmame $1 $2 #non uso mai piu' di due argomenti
amor
che mi andrebbe anche bene, pero' vorrei qualcosina in piu':
cioe' vorrei che mi lanciasse amor, al termine, solo se sia stato
effettivamente ucciso da killall (cioe' se c' era in esecuzione)
esiste un modo per redirigere lo stderr di killall su una variabile
interna (preferirei non dover usare un file di appoggio)?
ho provato con roba tipo 
killall amor 2> $prova
ma, ovviamente non me l' accetta (mi dice ambiguous redirect)
qualche suggerimento?
-- 
char c;main(){for(;c["];c++)c["];write(c-~-c,c+++"-- \nZeD\n",c-~-c));}

 amor
#!/bin/sh
# Supponiamo che amor non sia in funzione...
amor_was_running=NO
# Proviamo ad ammazzarlo...
if killall amor 2>/dev/null; then
     # Se killall non ritorna errore, allora amor
     # era in funzione e l'abbiamo ammazzato.
     amor_was_running=YES
fi
# Lanciamo xcpmame con tutti i parametri passati
# allo script
xcpmame "$@"
# E se amor era in funzione...
if [ $amor_was_running = "YES" ]; then
     # ...lo riavviamo di nuovo.
     amor
fi
Spieghino:
L'exit code di killall è diverso da zero (falso) se non ha trovato 
nessun processo da uccidere.
Il comando "if" esegue quanto specificato tra "then" e "fi" solo se il 
comando che fa da test ritorna "vero" (exit code uguale a zero). Ricorda 
che "[" è in definitiva un altro nome per il comando "test".
La forma "$@" viene espansa con un elenco dei parametri passati allo 
script (o alla funzione, se usata in una funzione).
-- 
  |   \    \  | ___|_  |_  | ianezz a casa sua... :-)
  |  _ \  | \ | _|    /   /  Visita il LinuxTrent a
_|_/  _\_|  _|____|___|___| 
http://www.linuxtrent.it

 ma, ovviamente non me l' accetta (mi dice ambiguous redirect)
Addenda, giusto per chiarirci: in questo modo dici semplicemente di 
regidigere lo standard error su un file il cui nome è contenuto nella 
variabile $prova.
Se vuoi catturare lo standard output e lo standard error di un comando, 
potresti usare
prova="$(killall amor 2>&1)"
La forma "$(<comando>)" vien sostituita con lo standard output del comando.
"2>&1" dice che lo standard error (file descriptor 2) deve finire sullo 
stesso file descriptor dello standard output (&1). Per cui, alla fine, 
ti ritrovi in $prova sia l'output che gli errori di "killall".


 script (o alla funzione, se usata in una funzione).
grazie anche per questo ^^;;;


 La forma "$(<comando>)" vien sostituita con lo standard output del comando.
Equivalente a
prova=`killall amor 2>&1`
se non sbaglio.
-- 
 Ciao, Bianco.                         Reply to luca.bianco (at) 
tiscali.it
|--------[Powered by Debian GNU/Linux Sarge - 2.4.19 - AMD K6-200]--------|
|------------[Linux Registered User #287769 - Machine #169192]------------|

 se non sbaglio.
Precisamente, ma visti i font che circolano, ed il deteriorarsi della 
vista, preferisco di gran lunga la nuova forma POSIX :-)


 vista, preferisco di gran lunga la nuova forma POSIX :-)
                                           ^^^^^^^^^^^
Perche`, quella con l'apice inverso non e` standard?


 Perche`, quella con l'apice inverso non e` standard?
Lo sono entrambe, ecco perche` dicevo "la nuova" (per contrasto con 
quella "vecchia").
