2013-10-19 12 views
6

In Unix (tcsh), ho fatto riferimento agli argomenti della riga di comando nei miei alias con due diverse notazioni: $1 e \!:1.

Ma ho notato che se provo a salvare $1 in una variabile di ambiente, non viene salvato. Tuttavia, \!:1 viene salvato.

alias hear 'setenv x \!:1 && echo $x' 
--> hear that 
that 
--> echo $x 
that 

alias oh 'setenv x $1 && echo $x' 
--> oh no 
no 
--> echo $x 

Non compare nulla sull'eco di $ x quando $ 1 viene utilizzato per memorizzare il valore. Qual è la ragione di questo?

risposta

14

$1 restituisce il primo argomento passato allo script che contiene il comando alias. Quindi, se lo chiami dalla riga di comando, non restituirà nulla.

\!:1 restituisce il primo argomento passato al comando con alias, in modo che sia chiaramente quello che si dovrebbe utilizzare.

5

supergra ha risposto al punto principale, ma potrebbe lasciarti a chiedermi perché vedi il tuo testo risuonato anche se la variabile non è stata impostata. Cioè, hai echo $x alla fine del tuo pseudonimo, e infatti vedi no quando inserisci oh no, ma ciò non significa che l'eco riecheggi la variabile.

Quello che sta accadendo non è che echo fase di stampa del variabili (vuoto), ma poi echo è anche recuperando il "no" parte separatamente. Se esegui alias tmp 'echo $1' e prova tmp hi, stamperai "hi" perché è come se "echo $ 1 hi".

Per vedere più chiaramente, provare alias tmp 'echo abc $1 def ' e fare tmp hi di nuovo, e si stamperà "abc def hi". Di nuovo, se provi alias tmp 'echo $1 & which ' e lo usi di nuovo dovresti, a meno che tu non abbia un comando chiamato hi, vedere qualcosa come "ciao: comando non trovato". o se lo fai tmp ls vedrai l'output di which ls.

Un altro esempio: provate alias tmp 'echo $1 & ' e tmp hi di vedere che in realtà tenta di eseguire hi come se si trattasse di un comando, che può essere pericoloso se non ti aspettavi che.

+0

Stranamente, ho avuto quella domanda dopo aver letto la risposta accettata. –