Większość moich aliasów ma tę postać: alias p='pwd'
Chcę alias git commit
, aby to zrobiłgit commit -v
Ale próba utworzenia aliasu ze spacją powoduje błąd:
$ alias 'git commit'='git commit -v'
-bash: alias: `git commit': invalid alias name
Większość moich aliasów ma tę postać: alias p='pwd'
Chcę alias git commit
, aby to zrobiłgit commit -v
Ale próba utworzenia aliasu ze spacją powoduje błąd:
$ alias 'git commit'='git commit -v'
-bash: alias: `git commit': invalid alias name
Odpowiedzi:
Nie jest to bezpośrednia odpowiedź na twoje pytanie (aliasy mogą być tylko jednym słowem), ale git-config
zamiast tego powinieneś użyć :
git config --global alias.civ commit -v
Tworzy to alias git, który git civ
działa git commit -v
. Niestety, AFAIK nie ma możliwości zastąpienia istniejących poleceń git za pomocą aliasów . Jednak zawsze możesz wybrać odpowiedni alias, z którym chcesz żyć, jako alternatywę.
git
komendy z pseudonimami, tylko z odrobiną skrypcie. (Nie zamieszczam tego komentarza jako krytyki, BTW. Ta odpowiedź została opublikowana prawie rok po twojej! Po prostu zamieszczam ją w nadziei, że ludzie mogą uznać ją za pomocną.)
Mówisz o poleceniu zawierającym spację, ale tutaj jest to polecenie git
i nie ma tam spacji.
Aby wywołać polecenie git commit , musisz je napisać
git\ commit ...
'git commit' ...
"git commit" ...
Zasadniczo polecenia nie mają miejsca w nazwach z tego powodu, że kłopotliwe jest wywoływanie ich w powłoce, więc nie sądzę, abyś znalazł takie polecenie w swoim systemie.
csh, tcsh lub zsh pozwolą ci na alias dowolnego z powyższych, ale nie na bash ani ksh (chociaż pdksh pozwoli ci, ale nie pozwolisz na ich użycie). W Zsh:
alias "'git commit'=git commit -v"
'git commit' ...
Czyni git command
polecenie (gdy jest wywoływane jako 'git command'
(tylko z pojedynczymi cudzysłowami)) jako alias git
polecenia z argumentami commit
i -v
. Chyba nie tego szukałeś.
Ponieważ alias
można aliasować tylko polecenia aliasu, jedyne , co możesz tutaj zrobić, to git
polecenie, a ty musisz go aliasować do czegoś, co wstawia „-v” po „commit” na liście argumentów. Najlepiej byłoby skorzystać z rozwiązania @ jw013, ale jeśli z jakiegoś powodu nie możesz lub nie chciałbyś, zamiast używać aliasu, możesz użyć funkcji do wykonania zadania:
git() {
if [ "$1" = commit ]; then
shift
set -- commit -v "$@"
fi
command git "$@"
}
W Bash nie można utworzyć aliasu dla polecenia zawierającego dowolne spacje.
Jednak używam następującej funkcji w moim .bashrc jako obejście.
sudo() { if [[ $@ == "pacman -Syu" ]]; then command pacup.sh; else command sudo "$@"; fi; }
Jak to działa: Zaczynasz od polecenia, które chcesz wywołać. W moim przypadku tak jest sudo
.
Następnie wspominasz, jakie parametry by to zajęło. W tym wypadku pacman -Syu
.
Jeśli uruchomione, jakie polecenie powinno zostać wykonane? W powyższym stwierdzeniu tak jest pacup.sh
.
Innego, co komenda ma być wykonywana, sudo $@
. $@
to, jak zgadniesz, lista parametrów pobierana przez polecenie.
Tak więc, wykonując polecenie dla konkretnego przypadku, byłoby to:
git() { if [[ $1 == "commit" ]]; then command git commit -v; else command git "$@"; fi; }
Jednak to rozwiązanie dotyczy bardziej ogólnego przypadku aliasu poleceń z białymi spacjami.
W twoim konkretnym przypadku poleciłbym skorzystanie z rozwiązania jw013 do aliasu używanych poleceń gitgit-config
if [[ $1 == 'commit' ]]...
? Rozszerzenie $ @ może zawierać więcej argumentów do zatwierdzenia, które faktycznie chcesz zachować.
Ze strony podręcznika użytkownika aliasu bash
Pierwsze słowo każdego prostego polecenia, jeśli nie jest cytowane, jest sprawdzane pod kątem aliasu. Jeśli tak, to słowo jest zastępowane tekstem aliasu. Nazwa aliasu i tekst zastępczy mogą zawierać dowolne prawidłowe dane wejściowe powłoki, w tym metaznaki powłoki, z wyjątkiem tego, że nazwa aliasu nie może zawierać `= '.
Pierwsze słowo zamiennego tekstu jest testowane pod kątem aliasów, ale słowo, które jest identyczne z rozwijanym aliasem, nie jest rozszerzane po raz drugi. Oznacza to, że można na przykład użyć aliasu ls do „ls -F”, a Bash nie próbuje rekurencyjnie rozszerzać tekstu zastępczego.
Ponieważ sprawdzane jest tylko pierwsze słowo, nie można mieć aliasu zawierającego wiele słów. W tym pytaniu dla superużytkownika przedstawiono obejście polegające na użyciu funkcji:
ls() { if [[ $@ == "-la" ]]; then command ls -la | more; else command ls "$@"; fi; }
Można go dostosować do git
.
\ls
pomija alias dla ls
.
[_!%,@]
) powinno zostać rozwinięte. Nie zabrania rozszerzeń takich jak aliasing '\ ls' w zsh, lub aliasing w ksh / dash / bash / zsh, w a-b
przeciwnym razie nie istniałaby żadna powłoka POSIX. Mówi tylko, że przenośny skrypt (nie powłoka) nie powinien używać takiego aliasu.
'git commit'
w pozycji polecenia w powłoce POSIX, musi ona wywołać wbudowane narzędzie, funkcję lub polecenie zewnętrzne.
Mimo że poprawnym rozwiązaniem jest użycie aliasów, takich jak sugerowany jw013, do utworzenia aliasu ze spacjami możesz używać NEST aliasów.
Na przykład mam alias do usuwania gałęzi zarówno lokalnie, jak i zdalnie, ale chciałbym, aby użytkownik zawsze określał gałąź:
remrem = "!sh -c 'if [ $# -ne 1 ]; then git specBranch; else git push origin :$1 && git branch -d $1; fi' -"
#echoing aliases
specBranch = "!sh -c 'echo Specify branch please!'"
Z tego przykładu powinno to działać:
Tak więc, jeśli nadal chcesz używać sudo z innymi poleceniami, ale nie z zamykaniem i jeśli możesz sobie pozwolić na alias zamykanie na coś innego, możesz mieć:
alias sudo='sudo '
alias shutdown="echo nope"
Ale za pomocą twoich poleceń:
alias git='git '
alias commit="commit -v"
git config
niegit-config