Ich bin neu im Umgang mit Shell-Skripten und bin auf eine Herausforderung gestoßen. Ich weiß, dass ich meine ".profile" -Datei neu laden kann, indem ich Folgendes mache:
. .profile
aber ich versuche, dasselbe in einem Bash-Skript auszuführen, das ich schreibe, und es funktioniert einfach nicht. Irgendwelche Ideen? Was kann ich sonst noch zur Klärung bereitstellen?
Vielen Dank
Versuchen Sie dies, um Ihre aktuelle Shell neu zu laden:
source ~/.profile
Versuche dies:
cd
source .bash_profile
Das Bash-Skript wird in einer separaten Subshell ausgeführt. Damit dies funktioniert, müssen Sie auch dieses andere Skript als Quelle verwenden.
Beim Versuch, die Datei/source ~/.profile neu zu laden, treten einige Probleme auf. [Dies bezieht sich auf Ubuntu Linux - in einigen Fällen unterscheiden sich die Details der Befehle]
Anzeige. 1)
Wenn Sie dies direkt im Terminal ausführen, wird keine Subshell erstellt. Sie können also zwei Befehle verwenden:
source ~/.bash_profile
oder
. ~/.bash_profile
In beiden Fällen wird die Umgebung mit dem Inhalt der .profile-Datei aktualisiert.
Ad 2) Sie können jedes Bash-Skript entweder durch Aufrufen von starten
sh myscript.sh
oder
. myscript.sh
Im ersten Fall wird eine Subshell erstellt, die die Umgebungsvariablen Ihres Systems nicht beeinflusst und nur für den Subshell-Prozess sichtbar ist. Nach Abschluss des Subshell-Befehls werden keine Exporte usw. angewendet. DIESE IS EIN GEMEINSAMER FEHLER UND VERURSACHT VIELE ENTWICKLER, VIEL ZEIT ZU VERLIEREN.
Damit Ihre in Ihrem Skript vorgenommenen Änderungen für die globale Umgebung wirksam werden, muss das Skript ausgeführt werden
.myscript.sh
befehl.
Um sicherzustellen, dass Ihr Skript nicht in einer Subshel ausgeführt wird, können Sie diese Funktion verwenden. (Wieder ein Beispiel für Ubuntu Shell)
#/bin/bash
preventSubshell(){
if [[ $_ != $0 ]]
then
echo "Script is being sourced"
else
echo "Script is a subshell - please run the script by invoking . script.sh command";
exit 1;
fi
}
Ich hoffe, dies beseitigt einige der häufigsten Missverständnisse! : D Viel Glück!
Versuchen:
#!/bin/bash
# .... some previous code ...
# help set exec | less
set -- 1 2 3 4 5 # fake command line arguments
exec bash --login -c '
echo $0
echo [email protected]
echo my script continues here
' arg0 "[email protected]"