In meiner ~/.bashrc
Datei befinden sich zwei Definitionen:
commandA
Dies ist ein Alias für einen längeren PfadcommandB
Dies ist ein Alias für ein Bash-Skript
Ich möchte dieselbe Datei mit diesen beiden Befehlen verarbeiten, also habe ich das folgende Bash-Skript geschrieben:
#!/bin/bash
for file in "$@"
do
commandA $file
commandB $file
done
Auch nach dem Abmelden von meiner Sitzung und dem erneuten Anmelden command not found
werden bei der Ausführung dieses Skripts von Bash Fehler für beide Befehle angezeigt.
Was mache ich falsch?
source ~/.bashrc
.Antworten:
Erstens, wie Ddeimeke sagte, werden Aliase standardmäßig nicht in nicht interaktiven Shells erweitert.
Zweitens
.bashrc
wird von nicht interaktiven Shells nur gelesen, wenn Sie dieBASH_ENV
Umgebungsvariable festlegen .Aber vor allem: Tu das nicht! Bitte? Eines Tages werden Sie das Skript an einen Ort verschieben, an dem die erforderlichen Aliase nicht festgelegt sind, und es wird wieder kaputt gehen.
Setzen und verwenden Sie stattdessen Umgebungsvariablen als Verknüpfungen in Ihrem Skript:
quelle
alias
Anwendungsfälle. Egalias mv="mv -v --backup=numbered"
.$CMDA
/$CMDB
... Abgesehen davon, dass in bash Variablen in Großbuchstaben für bash reserviert sind und es tatsächlich funktioniert, macht mich dieses Fehlen von Anführungszeichen wirklich unruhig ... Trotzdem vielen Dank.gizmo
sich der Pfad nicht befindet oder dass es einen Befehl mit demselben Namen, aber höherer Priorität gibt. sonst könnten Sie einfachen SatzCMDA
zu Ebenegizmo
an erster Stelle.Wenn Sie in die Bash-Manpage schauen, finden Sie:
Also leg ein
in Ihrem Skript.
Stellen Sie sicher, dass Sie Ihre Aliase-Datei als Quelle verwenden, nachdem Sie dies in Ihrem Skript festgelegt haben.
quelle
shopt -s expand_aliases source ~/.bash_aliases
funktioniert perfekt für mich. Häufig gibt es in .bashrc eine Form der interaktiven Shell-Erkennung:# If not running interactively, don't do anything [ -z "$PS1" ] && return
@Zaid, Vielleicht möchten Sie dies in der von Ihnen bereitgestellten Datei überprüfen.shopt -s expand_aliases
muss nicht vor der Alias-Definition, sondern vor der Alias-Verwendung stehen. Hinzufügen zu @FrankSchubert: Die interaktive Shell-Erkennung kann auch mithilfe von ausgeführt werden,$-
die die Optionen für die Shell enthält, insbesonderei
wenn die Shell interaktiv ist.~/.bash_aliases
könnte auf anderen Sachen hängt zuvor geladen auf einer interaktive Shell ... Das nächste , was ich gefunden wird , wenn Sie Ihre Hash - Bang auf#!/bin/bash -li
noch nicht perfekt. Idealerweise sollten Sie Funktionen und keine Aliase verwenden.Aliase können nicht exportiert werden, sodass sie nicht in Shell-Skripten verfügbar sind, in denen sie nicht definiert sind. Mit anderen Worten, wenn Sie sie in definieren, stehen
~/.bashrc
sie nicht zur Verfügungyour_script.sh
(es sei denn, Sie verwenden~/.bashrc
das Skript als Quelle , was ich nicht empfehlen würde, aber es gibt Möglichkeiten, dies ordnungsgemäß zu tun).Funktionen können jedoch exportiert werden und stehen Shell-Skripten zur Verfügung, die in einer Umgebung ausgeführt werden, in der sie definiert sind. Dies können Sie tun, indem Sie dies in Ihren bashrc einfügen:
Im Bash-Handbuch heißt es: "Für fast jeden Zweck werden Shell-Funktionen den Aliasen vorgezogen."
quelle
alias commandA=...
mitcommandA() { ... }
dannexport commandA
und Sie identisches Verhalten an den Alias erhalten. Das ist also, soweit ich weiß, eine ziemlich identische Alternative zu Aliasen, die in Bash-Skripten hervorragend funktioniertalias b=bash
macht es zum Beispiel einfach,b -c "echo test | grep test"
was in Funktionen schwierig wäre.b () { bash "$@"; }
dannb -c "echo test | grep test"
Das
i
ist für interaktive und Quellen deinesbash
Profils für dich.quelle
Ich habe festgestellt, dass Bash-Skripte manchmal auch keinen Export erkennen. Ändern Sie es jedoch auf
funktioniert bei mir.
quelle