wake-up-neo.com

Reload .profile im Bash-Shell-Skript (in Unix)?

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

114

Versuchen Sie dies, um Ihre aktuelle Shell neu zu laden:

source ~/.profile
173
kofriel

Versuche dies:

cd 
source .bash_profile
9
girardengo

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]

  1. Führen Sie dies direkt im Terminal oder in einem Skript aus?
  2. Wie führe ich das in einem Skript aus?

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!

2
twboc

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]"
1
tilo