2010-03-23 3 views
10

Ich kann expand_aliases nicht in bash wirksam werden. Ich habe viele verschiedene Dinge ausprobiert, und nichts funktioniert.Kann expand_aliases nicht wirksam werden

Hier ist der einfache Testfall:

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

Und die Ausgabe:

$ /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. 

(Ja, ich bin mit shopt anstelle der Option -O einzuschlagen, nur um zu beweisen, es ist fertig.)

Irgendwelche Ideen?

+0

Haben Sie 'shopp -p expand_aliases' versucht, um zu sehen, ob es tatsächlich aktiviert ist oder nicht? – Chris

+0

Ja, und es kam ja zurück. Dennis hat es verstanden; Als ich das obige in einem Shell-Skript gespeichert und ausgeführt habe, funktionierte es korrekt. – sachmet

Antwort

11

Aliase sind nicht in derselben Zeile oder in derselben Funktion verfügbar, in der sie definiert sind.

Von der Bash-Manpage:

 
     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. 

Die Bash Reference Manual sagt

Für fast jeden Zweck werden Funktionen Shell über Aliase bevorzugt.

anstelle des letzten Satzes oben [Betonung meiner]. Ich betrachte Aliase als eine bequeme Befehlszeile und nicht als etwas, das in Skripten verwendet werden sollte (einschließlich solcher, die nur aus bash -c Einzeilern bestehen).

+1

Das ist etwas ernst LMManPageTFY –

+0

Sie sollten dies auch zu Bash-Info hinzufügen: "Und auch als Konsequenz müssen in Funktionen verwendeten Aliase definiert werden, bevor Funktionen Definitionen zum Alias ​​tatsächlich funktionieren." –