2012-04-22 6 views
5

$0 si espande al nome dello script di shell.Come ottenere il nome dell'alias che ha invocato lo script di bash

$ cat ./sample-script 
#!/bin/bash 
echo $0 
$ chmod 700 ./sample-script 
$ ./sample-script 
./sample-script 

Se lo script di shell viene invocata tramite un collegamento simbolico, $0 espande al suo nome:

$ ln -s ./sample-script symlinked-script 
$ ./symlinked-script 
./symlinked-script 

Come potrei ottenere il nome di un alias? Qui `$ 0 'si espande nuovamente al nome file:

$ alias aliased-script=./sample-script 
$ aliased-script 
./sample-script 

risposta

2

Immagino che tu lo sappia già, ma per la cronaca la risposta è: hai bisogno di cooperazione con il codice che implementa l'alias.

alternate_name() { 
    MY_ALIAS_WAS=alternate_name real_name "[email protected]" 
} 

o, se si vuole veramente utilizzare la sintassi sostituita alias:

alias alternate_name="MY_ALIAS_WAS=alternate_name real_name" 

... e poi ...

$ cat ~/bin/real_name 
#!/bin/sh 
echo $0, I was $MY_ALIAS_WAS, "[email protected]" 
+0

Ma non è più un alias. –

+0

Heh, vero. Ok, aggiornato, usando il vero 'alias' :-) – DigitalRoss

+0

Grazie mille! Hai ragione: ho usato gli alias in quel modo da secoli. Non ci ho pensato, finché non me lo hai ricordato! :-) – xebeche

2

bash non lo rende disponibile. Questo è il motivo per cui i collegamenti simbolici vengono utilizzati per invocare comandi multiplex e non alias.

6

alias sono abbastanza stupida, secondo the man page

... alias sono espansi quando un comando viene letto, non quando viene eseguito ...

così poiché bash è fondamentalmente solo sostituendo una stringa con un'altra stringa e quindi eseguendola, non è possibile per il comando sapere cosa è stato espanso nell'alias.

+0

+1 per un rapido, tecnicamente corretta risposta comprensiva di link e preventivo. Grazie mille! – xebeche

+0

Ho cercato questo in [Advanced Bash Scripting Guide in Internal Variables] (http://www.tldp.org/LDP/abs/html/internalvariables.html) e non c'è nemmeno un riferimento. Grazie per questa risposta. – Patrick