Como faço para definir um alias para uma linha de terminal?

9

Quero definir facilmente um alias git-gopara esta linha de terminal:

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

Então, quando eu entrar no git-go, essa linha deve entrar.

Como eu posso fazer isso? As respostas que eu vi abrangem apenas o alias de um comando sem parâmetros. Mas eu quero definir um alias para uma linha terminal arbitrária.

Philip Rego
fonte
O que você tentou? Quais outras perguntas você leu? askubuntu.com/q/17536/507051 explica muito bem, qual é exatamente a sua pergunta?
dessert
Meu problema foi usar aspas duplas em vez de simples para aspas externas.
Philip Rego
Você também pode fazer o contrário usando aspas duplas no exterior e aspas simples no interior.
Videonauth 19/06/19
3
Possível duplicata de Como criar um alias permanente do Bash?
Fabby

Respostas:

13

Você faz isso da mesma maneira que definiria qualquer alias.

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

A situação em que fica complicado não é quando um alias executa um comando e passa argumentos para esse comando, nem mesmo quando um alias executa vários comandos separados por ;, mas é quando você deseja que um alias aceite e use seus próprios argumentos de linha de comando .

Por exemplo, qualquer coisa que você escrever após o nome desse alias será colado no final e, portanto, passado como argumentos da linha de comando para o terceiro gitcomando, depois git status. (Na verdade, não é tanto que o texto a seguir é colado no final, mas o texto a seguir é deixado sozinho e o nome alternativo é substituído por sua definição.)

Portanto, você pode executar seu alias sem argumentos, o que funciona, e o último comando é git status:

git-go

Ou você pode executá-lo com argumentos aos quais deseja passar git status. Por exemplo, quando você executa dessa maneira, o último comando é git-status --show-stash:

git-go --show-stash

O que você não pode fazer com um alias no Bash (e outros shells no estilo Bourne) é fazer com que o alias aceite argumentos da linha de comando e os coloque em outro lugar que não seja o final.

Por exemplo, suponha que você queira git-goaceitar um argumento que ele usa para a mensagem de confirmação. Você não seria capaz de escrever isso como um alias. A solução seria escrevê-lo como uma função shell:

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

Na definição de uma função shell, os parâmetros de posição $1, $2e assim por diante manter os valores dos argumentos de linha de comando passados para a função shell. Os aliases não têm funcionalidade que corresponda a isso, porque a expansão do alias é realmente uma forma de processamento de macro, ocorrendo muito cedo, quando o shell analisa um comando.

Obviamente, você pode escrevê-lo como uma função shell, mesmo que não precise usar parâmetros posicionais na definição, como sugere o Videonauth .

Eliah Kagan
fonte
11
Melhor ainda: coloque um script nomeado git-goem seu PATH e git gofuncionará.
D. Ben Knoble
10

Você pode declarar uma função no seu ~/.bash_aliasesarquivo da seguinte forma:

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

ou você pode criar um alias no mesmo arquivo da seguinte maneira:

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

Não se esqueça de reabrir o seu terminal ou originar o arquivo ( . ~/.bash_aliases) depois de alterá-lo.

Videonauth
fonte
11
Um benefício de escrever uma função shell em vez de um alias é que não é necessário aninhar aspas. Essa resposta, portanto, aborda o problema central que o OP acabou tendo mais diretamente do que o meu.
Eliah Kagan 19/06/19
@EliahKagan Ambos estão bem para essa pergunta, embora a sua seja mais prolongada. Prazer em vê-lo de volta.
Videonauth 19/06/19
4

Ao lidar com gitcomandos, você também pode querer saber a sintaxe para adicionar um alias, especialmente para git:

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

Isso adicionará um novo alias à sua gitconfiguração local (at ~/.gitconfig) e permitirá que você emita

git go

quando dentro de um gitrepositório. Sempre que você executa git goum shell, é invocado e o comando git commit -m "init"; git push; git statusé passado a ele.

Veja a documentação do git para mais detalhes.

PerlDuck
fonte
3

Foi um problema de cotação. Eu tinha tentado isso:

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

Mas recebi este erro:

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

Eu recebi esse erro porque estava usando aspas aninhadas incorretamente. Aqui está a sintaxe correta:

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

Ou:

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

Ou sem aspas, se não houver espaço em branco na mensagem de confirmação:

alias="git commit -m init; git push; git status"
Philip Rego
fonte
Obrigado por postar esta resposta (já que minha resposta e a da Videonauth não se concentram muito na questão de citação). Por curiosidade, por que você queria um espaço à direita em suas mensagens de confirmação?
Eliah Kagan
Eu costumava colar essa linha manualmente e adicionava uma mensagem após o espaço, mas isso não faz sentido aqui, então eu a retirei.
Philip Rego
11
Nesse caso, você não precisa citar init; os deleites do escudo 'init', "init"e inito mesmo. (Portanto, convém adiar a versão original e também mostrar a nova versão, para ilustrar a situação em que são necessárias aspas aninhadas.) Quanto à possibilidade de adicionar o restante da mensagem, você pode transmiti-la como uma linha de comando argumento se (como mostrado em Videonauth e minhas respostas) você definiu uma função em vez de um alias. Por exemplo, você pode definir git-go() { git commit -m "init $1"; git push; git status; }(qual é o que tenho na minha resposta, mas com em "init $1"vez de apenas "$1").
Eliah Kagan
Obrigado, é o que eu queria tentar a seguir.
Philip Rego