Ho appena incontrato qualcosa di simile; spero sia bello pubblicare i miei appunti. Una cosa che mi confonde sugli git
alias con gli argomenti, probabilmente viene dalla git help config
(ho la versione 1.7.9.5 di git):
Se l'espansione dell'alias è preceduta da un punto esclamativo, verrà trattata come un comando shell. Ad esempio, definendo "alias.new =! Gitk --all --not ORIG_HEAD", l'invocazione "git new" equivale all'esecuzione del comando shell "gitk --all --not ORIG_HEAD". Si noti che i comandi della shell verranno eseguiti dalla directory di livello superiore di un repository, che potrebbe non essere necessariamente la directory corrente. [...]
Per come la vedo io - se un alias "sarà trattato come un comando di shell" quando è preceduto da un punto esclamativo - perché dovrei usare una funzione, o sh -c
con argomenti; perché non scrivere semplicemente il mio comando così com'è?
Ancora non conosco la risposta, ma in realtà penso che ci sia una leggera differenza nei risultati. Ecco un piccolo test: gettalo nel tuo .git/config
o nel tuo ~/.gitconfig
:
[alias]
# ...
ech = "! echo rem: "
shech = "! sh -c 'echo rem:' "
fech = "! f() { echo rem: ; }; f " # must have ; after echo!
echargs = "! echo 0[[\"$0\"]] 1-\"$1\"/ A-"$@"/ "
fechargs = "! f() { echo 0[[\"$0\"]] 1-\"$1\"/ A-"$@"/ ; }; f "
Ecco cosa ottengo eseguendo questi alias:
$ git ech word1 word2
rem: word1 word2
$ git shech word1 word2
rem:
$ git fech word1 word2
rem:
$ git echargs word1 word2
0[[ echo 0[["$0"]] 1-"$1"/ A-$@/ ]] 1-word1/ A-word1 word2/ word1 word2
$ git fechargs word1 word2
0[[ f() { echo 0[["$0"]] 1-"$1"/ A-$@/ ; }; f ]] 1-word1/ A-word1 word2/
... oppure: quando si utilizza un comando "semplice" dopo !
"così com'è" in un git
alias, quindi git
si aggiunge automaticamente l'elenco degli argomenti a quel comando! Un modo per evitarlo, in effetti, è chiamare il tuo script come una funzione o come argomento sh -c
.
Un'altra cosa interessante qui (per me), è che in uno script shell, in genere ci si aspetta che la variabile automatica $0
sia il nome file dello script. Ma per una git
funzione alias, l' $0
argomento è sostanzialmente il contenuto dell'intero stringa che specifica quel comando (come inserito nel file di configurazione).
Ecco perché, immagino, se ti capita di citare un errore - nel caso seguente, questo sfuggirebbe alle doppie virgolette esterne:
[alias]
# ...
fail = ! \"echo 'A' 'B'\"
... - allora git
fallirebbe con (almeno per me) un messaggio un po 'criptico:
$ git fail
"echo 'A' 'B'": 1: echo 'A' 'B': not found
fatal: While expanding alias 'fail': ' "echo 'A' 'B'"': No such file or directory
Penso, dal momento che git
"visto" un'intera stringa come solo un argomento per !
- ha provato a eseguirlo come un file eseguibile; e di conseguenza non è riuscito a trovare "echo 'A' 'B'"
un file.
In ogni caso, nel contesto della git help config
citazione sopra, speculerei che è più preciso dichiarare qualcosa del tipo: " ... l'invocazione" git new "equivale all'esecuzione del comando shell" gitk --all --not ORIG_HEAD $ @ ", dove $ @ sono gli argomenti passati all'alias del comando git dalla riga di comando in fase di esecuzione. ... ". Penso che ciò spiegherebbe anche perché l'approccio "diretto" in OP non funziona con i parametri posizionali.
$1
dovrebbe funzionare).