Alias ​​ZSH z parametrem

98

Próbuję utworzyć alias z parametrem dla mojego prostego dodawania / zatwierdzania / wypychania gita.

Widziałem, że Function można użyć jako aliasu, więc próbuję, ale nie udało mi się.

zanim miałem:

alias gitall="git add . ; git commit -m 'update' ; git push"

Ale chcę mieć możliwość modyfikowania moich zatwierdzeń:

function gitall() {
    "git add ."
    if [$1 != ""]
        "git commit -m $1"
    else
        "git commit -m 'update'"
    fi
    "git push"
}

(wiem, że to okropna praktyka gita)

albttx
źródło

Odpowiedzi:

117

Nie możesz stworzyć aliasu z argumentami *, to musi być funkcja. Twoja funkcja jest bliska, wystarczy zacytować określone argumenty zamiast całych poleceń i dodać spacje wewnątrz [].

gitall() {
    git add .
    if [ "$1" != "" ] # or better, if [ -n "$1" ]
    then
        git commit -m "$1"
    else
        git commit -m update
    fi
    git push
}

*: Większość powłok nie zezwala na argumenty w aliasach, sądzę, że csh i pochodne tak, ale i tak nie powinieneś ich używać .

Kevin
źródło
cshtak, ale w ogóle nie ma funkcji. (Nie wiem, czy nie ma funkcji, ponieważ aliasy mogą przyjmować parametry, czy też aliasy przyjmują parametry, ponieważ nie ma funkcji, czy co.)
chepner
Więc nazwałbyś to (z muszli) jak gitall "my commit message"? czy możesz to nazwaćgitall('my commit message')
archae0pteryx
Funkcje @ archae0pteryx są wywoływane dokładnie tak, jak każde inne polecenie, więc gitall "my commit message".
Kevin
Sugerowałbym getall() {bez powyższego function- oczywiście, jest to legalne w zsh, ale ta jedyna zmiana sprawi, że będzie to kompatybilne ze wszystkimi powłokami zgodnymi z POSIX.
Charles Duffy,
10
BTW, jeśli użyłeś git commit -m "${1:-update}"(rozwinięcia parametrów z podanym domyślnym), to w ogóle nie potrzebujesz tej ifinstrukcji.
Charles Duffy,
108

Jeśli naprawdę potrzebujesz z jakiegoś powodu aliasu z parametrem, możesz go zhakować, osadzając funkcję w swoim aliasie i natychmiast ją wykonując:

alias example='f() { echo Your arg was $1. };f'

Widzę, że to podejście jest często używane w aliasach .gitconfig.

joelpt
źródło
7
Taki zepsuty, a jednocześnie taki piękny
rokoko
14
Po co w ogóle tworzyć alias? Po prostu wywołaj funkcję example.
tripleee
1
Poza tym, z opóźnieniem, przed nawiasem zamykającym potrzebny jest średnik.
tripleee
To było piękne. Dzięki temu mogłem stworzyć alias, który dodaje alias do pliku rc, a następnie ponownie ładuje wspomniany plik rc. ❤️ alias addalias = 'f () {echo "alias" $ 1 >> ~ / .zshrc &&. ~ / .zshrc}; f '
MayTheSForceBeWithYou
6
nie ma potrzeby dodawania żadnych nazw do zakresu globalnego, po prostu użyj funkcji anonimowej:alias example='(){ echo Your arg was $1. ;}'
maoizm 22.04.2020
11

Użyłem tej funkcji w pliku .zshrc:

function gitall() {
    git add .
    if [ "$1" != "" ]
    then
        git commit -m "$1"
    else
        git commit -m update # default commit message is `update`
    fi # closing statement of if-else block
    git push origin HEAD
}

Tutaj git push origin HEADjest odpowiedzialny za zdalne przekazanie twojej obecnej gałęzi.

Z wiersza poleceń uruchom to polecenie: gitall "commit message goes here"

Jeśli po prostu uruchomimy gitallbez komunikatu o zatwierdzeniu, komunikat o zatwierdzeniu będzie taki, updatejak wskazała funkcja.

Hasan Abdullah
źródło
4

"git add ."a pozostałe polecenia między "to tylko ciągi znaków dla bash, usuń "s.

Możesz [ -n "$1" ]zamiast tego użyć w swoim ciele if.

Alberto Zaccagni
źródło
0

Wypróbowałem zaakceptowaną odpowiedź (Kevina), ale otrzymałem następujący błąd

defining function based on alias `gitall'
parse error near `()'

W związku z tym zmieniłem składnię na tę, opartą na problemie z git i zadziałało.

    function gitall {
    git add .
    if [ "$1" != "" ]
    then
        git commit -m "$1"
    else
        git commit -m update
    fi
    git push
    }
GV Sandeep
źródło