Jak ustawić alias do linii terminalu?

9

Chcę łatwo ustawić alias git-godla tej linii terminalu:

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

Więc kiedy wejdę do git-go, ta linia powinna wejść.

Jak mogę to zrobić? Odpowiedzi, które widziałem, obejmują tylko alias polecenia bez parametrów. Ale chcę ustawić alias do dowolnej linii terminalu.

Philip Rego
źródło
Co próbowałeś Jakie inne pytania przeczytałeś? askubuntu.com/q/17536/507051 wyjaśnia, że ​​dość dobrze, jakie dokładnie jest twoje pytanie?
deser
Moim problemem było użycie podwójnych cudzysłowów zamiast pojedynczych w cudzysłowach zewnętrznych.
Philip Rego,
Równie dobrze możesz to zrobić na odwrót, używając podwójnych cudzysłowów na zewnątrz i pojedynczych cudzysłowów w środku.
Videonauth,
3
Możliwy duplikat Jak utworzyć stały alias Bash?
Fabby,

Odpowiedzi:

13

Robisz to tak samo, jak ustawiasz dowolny alias.

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

Sytuacja, w której staje się trudna, nie polega na tym , że alias uruchamia polecenie i przekazuje argumenty do tego polecenia, ani nawet gdy alias uruchamia wiele poleceń oddzielonych przez ;, ale zamiast tego ma miejsce, gdy chcesz, aby alias akceptował i używał własnych argumentów wiersza polecenia .

Na przykład wszystko, co napiszesz po nazwie tego aliasu, zostanie wklejone na końcu, a zatem przekazane jako argumenty wiersza poleceń do trzeciego gitpolecenia po git status. (Naprawdę nie chodzi o to, że poniższy tekst jest wklejany na końcu, ale o to, że poniższy tekst jest pozostawiany sam, a nazwa aliasu jest zastępowana jego definicją.)

Możesz więc uruchomić swój alias bez argumentów, co działa, a ostatnia komenda to git status:

git-go

Lub możesz uruchomić go z argumentami, które chcesz przekazać git status. Na przykład po uruchomieniu w ten sposób ostatnie polecenie to git-status --show-stash:

git-go --show-stash

To, czego nie można zrobić z aliasem w Bash (i innych powłokach typu Bourne'a), polega na tym, aby alias akceptował argumenty wiersza poleceń i umieszczał je gdzie indziej niż na końcu.

Załóżmy na przykład, że chcesz git-gozaakceptować argument użyty dla komunikatu zatwierdzenia. Nie będziesz w stanie napisać tego jako aliasu. Rozwiązaniem byłoby napisanie go jako funkcji powłoki zamiast:

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

W definicji funkcji powłoki, parametry pozycyjne $1, $2i tak dalej trzymać wartości argumentów wiersza poleceń przekazywanych do funkcji powłoki. Aliasy nie mają odpowiadającej temu funkcjonalności, ponieważ rozszerzenie aliasu jest tak naprawdę formą przetwarzania makr, które odbywa się bardzo wcześnie, gdy powłoka analizuje polecenie.

Możesz oczywiście napisać go jako funkcję powłoki, nawet jeśli nie musisz używać parametrów pozycyjnych w definicji, jak sugeruje Videonauth .

Eliah Kagan
źródło
1
Jeszcze lepiej: umieść skrypt o nazwie git-goPATH i git gobędzie działać.
D. Ben Knoble,
10

Możesz zadeklarować, że jest to funkcja w twoim ~/.bash_aliasespliku tak:

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

lub możesz utworzyć alias w tym samym pliku w następujący sposób:

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

Nie zapomnij ponownie otworzyć terminala lub źródła pliku ( . ~/.bash_aliases) po zmianie.

Videonauth
źródło
1
Jedną z zalet pisania funkcji powłoki zamiast aliasu jest to, że nie trzeba zagnieżdżać cudzysłowów. Ta odpowiedź rozwiązuje zatem główny problem, który okazał się mieć PO bardziej niż mój.
Eliah Kagan
@EliahKagan Oba są w porządku dla tego pytania, chociaż twoje jest więcej w całym tekście. Miło widzieć cię z powrotem.
Videonauth,
4

Podczas pracy z gitpoleceniami możesz także znać składnię dodawania aliasu, szczególnie dla git:

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

Spowoduje to dodanie nowego aliasu do gitkonfiguracji lokalnej (at ~/.gitconfig) i umożliwi wydanie

git go

gdy jest w gitrepozytorium. Przy każdym uruchomieniu git gowywoływana jest powłoka, a polecenie git commit -m "init"; git push; git statusjest do niej przekazywane.

Więcej informacji można znaleźć w dokumentacji git .

PerlDuck
źródło
3

To był problem z cytowaniem. Próbowałem tego:

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

Ale dostałem ten błąd:

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

Wystąpił ten błąd, ponieważ nieprawidłowo korzystałem z zagnieżdżonych cudzysłowów. Oto poprawna składnia:

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

Lub:

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

Lub bez cudzysłowów, jeśli w komunikacie zatwierdzenia nie ma białych znaków:

alias="git commit -m init; git push; git status"
Philip Rego
źródło
Dzięki za opublikowanie tej odpowiedzi (ponieważ moja odpowiedź i Videonauth nie koncentrują się zbytnio na kwestii cytowania). Z ciekawości, dlaczego chciałeś mieć końcowe miejsce w swoich komunikatach zatwierdzania?
Eliah Kagan,
Kiedyś ręcznie wklejałem ten wiersz i dodawałem wiadomość po spacji, ale to nie ma sensu, więc go wyjąłem.
Philip Rego,
1
W takim przypadku nie musisz cytować init; traktuje powłoki 'init', "init"i initto samo. (Więc możesz chcieć cofnąć oryginalną wersję, a także pokazać nową wersję, aby zilustrować sytuację, w której potrzebne są zagnieżdżone cudzysłowy.) Jeśli chodzi o możliwość dodania reszty wiadomości, możesz przekazać ją jako wiersz polecenia argument, jeśli (jak pokazano w odpowiedziach Videonauth i moich) zdefiniowałeś funkcję zamiast aliasu. Na przykład możesz zdefiniować git-go() { git commit -m "init $1"; git push; git status; }(co mam w mojej odpowiedzi, ale "init $1"zamiast po prostu "$1").
Eliah Kagan,
Dzięki, tego właśnie chciałem spróbować.
Philip Rego,