2010-03-23 2 views
10

Non riesco a ottenere expand_aliases per avere effetto in bash. Ho provato molte cose diverse e niente funziona.Impossibile ottenere expand_aliases per avere effetto

Ecco il semplice caso di test:

/bin/bash -c 'shopt -s expand_aliases; alias cdtmp="cd /tmp"; alias; cdtmp; pwd;' 

E l'output:

$ /bin/bash -c 'shopt -s expand_aliases; alias cdtmp="cd /tmp"; alias; cdtmp; pwd;' 
alias cdtmp='cd /tmp' 
/bin/bash: cdtmp: command not found 
/home/user 

$ /bin/bash --version 
GNU bash, version 3.2.25(1)-release (i686-redhat-linux-gnu) 
Copyright (C) 2005 Free Software Foundation, Inc. 

(Sì, sto usando shopt anziché l'opzione -O di bash, solo per dimostrare è di essere fatto.)

Qualche idea?

+0

Hai provato 'shopt -p expand_aliases' per vedere se è effettivamente abilitato o meno? – Chris

+0

Sì, e tornò sì. Dennis ha capito; quando ho salvato quanto sopra in uno script di shell e l'ho eseguito, ha funzionato correttamente. – sachmet

risposta

11

Gli alias non sono disponibili sulla stessa riga o nella stessa funzione in cui sono definiti.

Dalla pagina man bash:

 
     The rules concerning the definition and use of aliases are somewhat 
     confusing. Bash always reads at least one complete line of input 
     before executing any of the commands on that line. Aliases are 
     expanded when a command is read, not when it is executed. Therefore, 
     an alias definition appearing on the same line as another command does 
     not take effect until the next line of input is read. The commands 
     following the alias definition on that line are not affected by the new 
     alias. This behavior is also an issue when functions are executed. 
     Aliases are expanded when a function definition is read, not when the 
     function is executed, because a function definition is itself a com‐ 
     pound command. As a consequence, aliases defined in a function are not 
     available until after that function is executed. To be safe, always 
     put alias definitions on a separate line, and do not use alias in com‐ 
     pound commands. 

     For almost every purpose, aliases are superseded by shell functions. 

Il Bash Reference Manual dice

Per quasi ogni scopo, shell funzioni sono preferiti sopra alias.

anziché l'ultima frase sopra [enfasi sul mio]. Considero gli alias come una comodità da riga di comando piuttosto che qualcosa che dovrebbe essere usato negli script (compresi quelli costituiti esclusivamente da one-liner bash -c).

+1

Questo è un po 'serio LMManPageTFY –

+0

Dovrebbero aggiungere questo anche alle informazioni di bash: "E anche come conseguenza, gli alias utilizzati nelle funzioni devono essere definiti PRIMA che le definizioni di funzioni dell'alias funzionino effettivamente." –