Come posso impostare un alias su una linea terminale?


9

Voglio impostare facilmente un alias git-gosu questa linea terminale:

git commit -m "init "; git push; git status

Quindi quando entro git-go questa riga dovrebbe entrare.

Come lo posso fare? Le risposte che ho visto riguardano solo l'alias di un comando senza parametri. Ma voglio impostare un alias su una linea terminale arbitraria.


Cosa hai provato Quali altre domande hai letto? askubuntu.com/q/17536/507051 lo spiega abbastanza bene, qual è esattamente la tua domanda?
dessert

Il mio problema era usare le virgolette doppie anziché singole per le citazioni esterne.
Philip Rego,

Puoi anche farlo al contrario usando virgolette doppie all'esterno e virgolette singole all'interno.
Videonauth,

Risposte:


13

Lo fai nello stesso modo in cui imposteresti qualsiasi alias.

alias git-go='git commit -m "init "; git push; git status'

La situazione in cui diventa difficile non è quando un alias esegue un comando e passa argomenti a quel comando, né anche quando un alias esegue più comandi separati da ;, ma invece è quando si desidera che un alias accetti e usi i propri argomenti della riga di comando .

Ad esempio, tutto ciò che scrivi dopo il nome di quell'alias verrà incollato alla fine e, successivamente, passato come argomento da riga di gitcomando al terzo comando git status. (In realtà non è così tanto che il seguente testo viene incollato alla fine, tanto quanto il seguente testo viene lasciato solo e il nome alias viene sostituito con la sua definizione.)

Quindi puoi eseguire il tuo alias senza argomenti, il che funziona e l'ultimo comando è git status:

git-go

Oppure puoi eseguirlo con argomenti a cui vuoi passare git status. Ad esempio, quando lo esegui in questo modo, l'ultimo comando è git-status --show-stash:

git-go --show-stash

Ciò che non è possibile fare con un alias in Bash (e altre shell in stile Bourne) è di far accettare gli alias da argomenti della riga di comando e posizionarli altrove rispetto alla fine.

Ad esempio, supponiamo di voler git-goaccettare un argomento che utilizza per il messaggio di commit. Non saresti in grado di scrivere questo come alias. La soluzione sarebbe invece di scriverlo come una funzione shell:

git-go() { git commit -m "$1"; git push; git status; }

Nella definizione di una funzione di shell, i parametri posizionali $1, $2e così via contengono i valori degli argomenti della riga di comando passati alla funzione shell. Gli alias non hanno funzionalità che corrispondono a questo, perché l'espansione degli alias è in realtà una forma di elaborazione macro, che si svolge molto presto, quando la shell analizza un comando.

Naturalmente, puoi scriverlo come una funzione shell anche se non è necessario utilizzare i parametri posizionali nella definizione, come suggerisce Videonauth .


1
Ancora meglio: posiziona uno script chiamato git-gonel tuo PERCORSO e git gofunzionerà.
D. Ben Knoble,

10

Puoi dichiararlo come una funzione nel tuo ~/.bash_aliasesfile in questo modo:

git-go(){
    git commit -m "init "
    git push
    git status
}

oppure puoi creare un alias nello stesso file in questo modo:

alias git-go='git commit -m "init "; git push; git status'

Non dimenticare di riaprire il terminale o eseguire il sorgente del file ( . ~/.bash_aliases) dopo averlo modificato.


1
Uno dei vantaggi di scrivere una funzione shell invece di un alias è che non è necessario nidificare le virgolette. Questa risposta affronta quindi il problema centrale che l'OP ha riscontrato più direttamente del mio.
Eliah Kagan,

@EliahKagan Entrambi vanno bene per quella domanda, sebbene la tua sia più diffusa. Piacere di rivederti.
Videonauth,

4

Dato che hai a che fare con i gitcomandi, potresti anche voler conoscere la sintassi per aggiungere un alias in particolare per git:

git config --global alias.go '!sh -c "git commit -m \"init\"; git push; git status"'

Ciò aggiungerà un nuovo alias alla tua gitconfigurazione locale (at ~/.gitconfig) e ti consentirà di emettere

git go

quando all'interno di un gitrepository. Ogni volta che si esegue git gouna shell viene invocata e il comando gli git commit -m "init"; git push; git statusviene passato.

Vedi il documentaion git per ulteriori dettagli.


3

Era un problema di quotazione. Ho provato questo:

alias="git commit -m "init "; git push; git status"

Ma ho ottenuto questo errore:

bash: ; git push; git status: command not found

Ho avuto quell'errore perché stavo usando le virgolette nidificate in modo errato. Ecco la sintassi corretta:

alias='git commit -m "init "; git push; git status'

O:

alias="git commit -m 'init '; git push; git status"

O senza virgolette se nessuno spazio bianco nel messaggio di commit:

alias="git commit -m init; git push; git status"

Grazie per aver pubblicato questa risposta (poiché la mia risposta e quella di Videonauth non si concentrano molto sulla questione del preventivo). Per curiosità, perché volevi uno spazio finale nei tuoi messaggi di commit?
Eliah Kagan,

Ho usato per incollare manualmente questa linea e aggiungerei un messaggio dopo lo spazio, ma non ha senso qui, quindi l'ho rimosso.
Philip Rego,

1
In tal caso, non è necessario citare init; la tratta guscio 'init', "init"e initlo stesso. (Quindi potresti voler ripristinare la versione originale e mostrare anche la nuova versione, per illustrare la situazione in cui sono necessarie le virgolette nidificate.) Per poter aggiungere il resto del messaggio, puoi passarlo come riga di comando argomento se (come mostrato in Videonauth e le mie risposte) hai definito una funzione anziché un alias. Ad esempio, potresti definire git-go() { git commit -m "init $1"; git push; git status; }(che è quello che ho nella mia risposta ma con "init $1"invece che semplicemente "$1").
Eliah Kagan,

Grazie è quello che volevo provare dopo.
Philip Rego,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.