Problem mit der Interpretation des Alias ​​in Befehlsargumenten

7

Ich habe folgenden Alias:

alias mv='mv -i'
alias git='LANG=en_US \git '

Wenn ich dann einen git mvBefehl mache, wird der wie mvfolgt interpretiert mv -i:

$ git mv a b
error: unknown switch `i'

Ich möchte, dass der Alias ​​nur angewendet wird, wenn es sich um einen Bash-Befehl handelt

Versionen:

  • Ubuntu 16.04.3 LTS
  • GNU Bash, Version 4.3.48 (1)
  • Git Version 2.7.4 (auch ich glaube nicht, dass es mit Git verbunden ist)

Anmerkungen:

  • git \mv a b funktioniert
  • Unaliasing Git funktioniert auch \git mv a b
jo_
quelle
2
Ich kann dies mit Git 2.12.4 und Bash 4.4.12 nicht wirklich reproduzieren.
Kusalananda
4
In bash Version 4.4 funktionieren Aliase nur, wenn der Alias ​​das erste Wort in einer Zeile ist. Demo: alias woo="woo hoo" ; echo wooAusgänge woo.
Agc
Ich würde diesen Alias mvioder ähnliches nennen.
Pfnuesel
Bist du sicher? Eine Problemumgehung könnte darin bestehen, mveine Bash- Funktion (keinen Alias) zu erstellen .
Basile Starynkevitch
1
Ich habe hier die gleichen Versionen installiert und kann das auch nicht reproduzieren. Muss mit Ihrer Bash-Konfiguration etwas Besonderes sein; Sie können die Aliase und die Umgebung auf etwas Ähnliches überprüfen git. Was bekommst du beim Versuch type -a mvund type -a git?
Murphy

Antworten:

15

Da gitein Alias mit einem Leerzeichen endet , führt bash eine Alias-Erweiterung für das Wort unmittelbar danach durch:

$ alias mv='mv -i'
$ alias git=': git '
$ set -x
$ git mv
+ : git mv -i

Aus den Dokumenten :

Wenn das letzte Zeichen des Aliaswerts leer ist, wird das nächste Befehlswort nach dem Alias ​​ebenfalls auf Aliaserweiterung überprüft.

Erstellen Sie giteinen Alias ​​ohne Leerzeichen:

alias git='LANG=en_US git'

Beachten Sie, dass:

Das erste Wort des Ersatztextes wird auf Aliase getestet, aber ein Wort, das mit einem zu erweiternden Alias ​​identisch ist, wird nicht ein zweites Mal erweitert. Dies bedeutet , dass man kann alias lszu ls -F, zum Beispiel, und Bash versucht nicht rekursiv den Ersatztext zu erweitern.

Also brauchst du da nicht \git.

muru
quelle
Sie haben Recht, das Entfernen dieses zusätzlichen Platzes hat den Job gemacht, danke!
jo_