Newsgroup: it.comp.os.linux.iniziare
Titolo: alias assegnato ad una variabile

$ alias abc
alias abc='echo'
$ echo $xyz
abc
$ $xyz
Comando «abc» non trovato
 
Perchè?


Forse perche` fa una sola espansione e
non due ricorsivamente (il che potrebbe
anche essere molto, ma molto, corretto).
 
Forse, "eval $xyz" funziona.
 
bye,
 
-- 
 
piergiorgio


non è riproducibile quindi impossibile risponderti.

Addi' 18 apr 2020 08:04:37, alex scrive:

Secondo me il motivo e' che, dando "$xyz", bash cerca un comando,
ma un alias non e' un comando (puo' diventare un comando, ma
generalmente non e' che un'abbreviazione).
 
Sembrerebbe infatti una conferma il fatto che, se faccio lo script
eseguibile /tmp/pippo seguente:
------------
#!/bin/bash
 
ls
--------------
 
Quando do "$uvw" mi da' la lista, e se do ". $uvw" me la da' a colori.
E poi scusa ma con xyz te lo dice pure: "comando non trovato", e se lo
dai col punto ti dice "File o directory non esistente" ciao
 
-- 
Yoda
 

 dai col punto ti dice "File o directory non esistente" ciao
 
Tra parentesi e per chiarezza: ho fatto uvw='/tmp/pippo'
 
-- 
bye, Yoda
 

Il 18/04/20 13:08, Piergiorgio Sartor ha scritto:

Però con le funzioni funziona.
Ecco un approfondimento:
 
$ cat test.sh
function fun_test {
     echo Sono una funzione
}
alias alias_test='echo Sono un alias'
 
# dichiraazione variabili
fun_test=fun_test
alias_test=alias_test
 
# --- TEST ---
$fun_test # FUNZIONA
alias_test # FUNZIONA
$alias_test # NON FUNZIONA
 
$ . test.sh
Sono una funzione
Sono un alias
alias_test: comando non trovato

Il 18/04/20 14:09, rootkit ha scritto:

????

 
 
Però se abc fosse stato una funzione[1] avrebbe funzionato (vedi l'altro 
post).
 
[1] 	function abc {
     		echo Sono una funzione
	}

 Però con le funzioni funziona.
 
E quindi?
 
Dovresti documentarti esattamente su
come l'espansione di bash vengono
realizzate.
Credo nel manuale di bash sia spiegato
in maniera abbastanza estesa, anche se
forse non estremamente chiara.
 
Perche` potrebbe essere che se l'alias
ha "$xyz", in caso di espansione ricorsiva
non si ferma piu`.
 
abc -> $xyz -> abc -> $xyz ...
 
Quindi devono evitare.
 
bye,
 
-- 
 
piergiorgio

Il 18/04/20 15:43, Piergiorgio Sartor ha scritto:

Giusto, ma se non sbaglio ciò potrebbe accadere anche con una funzione.

 Giusto, ma se non sbaglio ciò potrebbe accadere anche con una funzione.
 
Non saprei, bisognerebbe pensarci
su un attimo.
 
bye,
 
-- 
 
piergiorgio

 	}
 
Si', per giunta anche se la funzione non la scrivi su file.. ho
fatto infatti:
$: ffff() {echo ;}
$: SPQR='ffff'
$: $SPQR "ave caesar"
ave caesar
 
Insomma e' chiaro che, quando bash espande un alias, il nome
espanso viene interpretato (da bash stesso) in modo differente
da quando lo scrivi da tastiera.. forse saranno le espansioni
che dice Piergiorgio ciao
 
-- 
Yoda
 


ok non mi era chiara la domanda.
 
è perché la shell espande prima gli alias e poi le variabili.
 
per esempio, se fai il contrario:
 
➜  ~ PIPPO=echo        
➜  ~ alias pippo='$PIPPO'
➜  ~ pippo pluto
pluto
➜  ~ PIPPO=ls
➜  ~ pippo      
Android  Desktop  Documents  Downloads  Music
 
vedi che funziona. 
 

 Giusto, ma se non sbaglio ciò potrebbe accadere anche con una funzione.
 
con una funzione ottieni lo stesso effetto di una normale chiamata 
ricorsiva. 

Il 18/04/20 22:15, rootkit ha scritto:

appunto

 Si', per giunta anche se la funzione non la scrivi su file.. ho
 
Volendo...


 appunto
 
Si, ma bisogna vedere se la ricorsione e`
esplicita od implicita.
Cioe` se e` fatta apposta dall'utente, per
esempio scrivendo una funzione che richiama
se stessa, oppure se e` incidentale nella bash.
 
Nel caso specifico non saprei, ma di regola
spesso tendono ad evitare che si possa creare
una ricorsione implicita.
 
Ovviamente e` sempre possibile scrivere uno
script che esegue se stesso, anche in maniera
molto indiretta (a.sh->b.sh->c.sh->d.sh->a.sh),
e che quindi potrebbe sfuggire all'intenzionalita`
dell'utente.
 
bye,
 
-- 
 
piergiorgio

 funzione che richiama se stessa, oppure se e` incidentale nella bash.
 
nella sostanza tecnica non cambia nulla. la differenza è che nel primo 
caso è una feature e nel secondo è un bug. in ogni caso bash quando 
arriva ad un determinato livello di ricorsione semplicemente si ferma.

 arriva ad un determinato livello di ricorsione semplicemente si ferma.
 
Si spera... :-)
 
bye,
 
-- 
 
piergiorgio

 Però con le funzioni funziona.
 
Gli alias non derivano da un'espansione (almeno non da quelle definite come
tali dalla shell). Le espansioni sono eseguite in quest'ordine (man bash): 
 
The order of expansions is: brace expansion; tilde expansion, parameter and
variable expansion, arithmetic expansion, and command substitution (done in
a left-to-right fashion); word splitting;  and pathname expansion.
 
Gli alias sono "espansi" (anche se è meglio parlare di sostituzione) prima;
semplicemente la shell guarda se la prima parola della linea di comando
corrisponde a un alias definito e lo sostituisce. Man bash ancora:
 
"The first word of each simple command, if unquoted, is checked to see if
it has an alias. If so, that word is  replaced  by  the  text  of  the
alias."
 
Questo sistema permette di inserire variabili nell'alias, ad esempio alias
x='echo "$abcd"'.
 
Dopo le sostituzioni degli alias (se ce ne sono) la shell procede alle
espansioni di cui sopra.
 
Quindi nel tuo caso, la shell vede $xyz, vede che non esiste un alias
chiamato $xyz e comincia le espansioni.
 
Però poi nella terza fase delle espansioni vede che $xyz è una variabile e
la espande, sostituendone il valore (quindi il nome della funzione).
 
-- 
Cio' che si vede, e'.
 

 dell'utente
 
E quindi?
Non ho capito se stai parlando di problema generale, oppure di chi 
scrive questi algoritmi (cmq son cavoli suoi)

 scrive questi algoritmi (cmq son cavoli suoi)
 
Il punto e` che un conto e` scrivere
una ricorsione _intenzionalmente_,
cioe` sapendo quello che si sta facendo
ed eventuali rischi.
 
Un conto e` avere un sistema in cui sia
"facile" scrivere una ricorsione per
sbaglio con tutte le possibili conseguenze
del caso.
 
A volte, alcuni sistemi, non consento
queste "espansioni" ricorsive, proprio
per evitare effetti collaterali non voluti.
 
Ma, come scrivevo e come hanno anche altri
scritto, sarebbe il caso di leggersi il
manuale di bash per capire come funzioni
la storia delle espansioni.
 
bye,
 
-- 
 
piergiorgio