Alias ​​konnte in nicht interaktiver Shell nicht erweitert werden

Alias ​​konnte in nicht interaktiver Shell nicht erweitert werden

Ich möchte einige Aliase in einer nicht-interaktiven Shell verwenden, nachdem ichdieser BeitragUnddieser Beitrag. Hier ist mein Befehl:

bash -O expand_aliases -c 'source ~/.bashrc; <some alias>'

und hier ist meins .bashrc:

 # Bash History
 HISTSIZE=1000
 HISTFILESIZE=2000
 # Colorful Prompt
 PS1='\[\033[01;34m\]\w\n\[\033[01;32m\]\u@\h\[\033[00m\] > '
 # Aliases
 alias ls='ls --color=auto -A -I NTUSER.\* -I ntuser.\*'
 alias echo='echo -e'
 alias docker='"/mnt/c/Program Files/Docker/Docker/resources/bin/docker.exe"'
 alias docker-compose='"/mnt/c/Program Files/Docker/Docker/resources/bin/docker-compose.exe"'

Ich echohabe etwas eingegeben .bashrcund bin sicher, dass es source ~/.bashrcfunktioniert hat, aber die Aliase ließen sich einfach nicht erweitern. Ich habe auch Folgendes versucht:

bash -O expand_aliases -c shopt

um sicherzustellen, dass die Option expand_aliasesaktiviert ist.

Wie behebe ich das?

Antwort1

Die sehr einfache Problemumgehung besteht darin, eine Funktion anstelle eines Alias ​​zu verwenden. Es gibt viele Situationen, in denen Funktionen Aliasen überlegen sind, und meines Wissens keine, in der das Gegenteil der Fall ist.

 docker () { "/mnt/c/Program Files/Docker/Docker/resources/bin/docker.exe" "$@"; }
 docker-compose () { "/mnt/c/Program Files/Docker/Docker/resources/bin/docker-compose.exe" "$@"; }

(Ich habe mich geweigert, Ihre lsund echoAliase zu portieren – sie scheinen mehr zu schaden als zu nützen.)

Antwort2

Dies .bashrcwird nur für interaktive Shells ausgeführt.

Das habe ich gemacht. Erstellen Sie eine neue Datei .bash_envin Ihrem Home-Verzeichnis. Tragen Sie dort alle Ihre Aliase ein, z. B.:

shopt -s expand_aliases
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias vi='vim'

Verweisen Sie dann darauf in Ihrem .bash_profile(geben Sie dort natürlich einen echten Pfadnamen ein):

 export BASH_ENV='/home/username/.bash_env'

(Zum Aktivieren ab- und wieder anmelden)


BASH_ENVin der Manpage:

Wenn dieser Parameter gesetzt ist, während bash ein Shell-Skript ausführt, wird sein Wert als Dateiname interpretiert, der Befehle zum Initialisieren der Shell enthält, wie in ~/.bashrc.

Und:

Wenn Bash nicht-interaktiv gestartet wird, um beispielsweise ein Shell-Skript auszuführen, sucht es in der Umgebung nach der Variable BASH_ENV, erweitert ihren Wert, wenn er dort erscheint, und verwendet den erweiterten Wert als Namen einer zu lesenden und auszuführenden Datei.

verwandte Informationen