2010-02-01 12 views
32

Załóżmy, że mam:alias zsh -> funkcja?

alias gg="git grep" 

następnie rzeczy jak:

gg "int x" 

prac, ale

gg int x 

dostaje skarg. Czy istnieje sposób na przepisanie gg jako funkcji w zsh, tak aby zabierał on wszystkie argumenty po gg i wstawiał je do łańcucha?

Dzięki!

Odpowiedz

58
gg() { git grep "$*"; } 
+6

Uhm, aby je umieścić w jednym ciągu, potrzebujesz '" $ * "' zamiast '" $ @ "' - napisany przez ciebie formularz przejdzie je jako oddzielne parametry, podobnie jak alias. –

+1

Dzięki za poprawkę. –

+0

Ma to tę zaletę, że jest kompatybilny z bash – Jian

4

W przypadku konkretnego przypadku użycia, jest to zły pomysł. git-grep oczekuje pojedynczego arg wzorca. Starasz się, aby powłoka traktowała twoją przestrzeń (między int i x) jako część wzoru. Spowoduje to szybkie złamanie, gdy spróbujesz coś takiego: gg foo.*bar lub różne inne rzeczy, które powłoka może zinterpretować. Więc cokolwiek po gg naprawdę powinno być cytowane. To dlatego git grep int x też nie działa: fatal: ambiguous argument 'x': unknown revision or path not in the working tree...

Jeśli uważasz gg to warto klawiszy wygaszacz, należy zachować swój arg nim zgodny z tym, co git-grep spodziewa. Twój oryginalny alias jest do tego odpowiedni. I kontynuuj jedno- lub dwukrotne cytowanie swojego wzorca, tak samo jak w przypadku każdego innego polecenia akceptującego wyrażenie regularne.

+0

Nie jest to odpowiedź, ale bardzo dobry punkt. – shadowtalker