.Profil im Bash-Shell-Skript (unter Unix) neu laden?

130

Ich bin neu im Bash-Shell-Scripting und bin auf eine Herausforderung gestoßen. Ich weiß, dass ich meine ".profile" -Datei neu laden kann, indem ich einfach Folgendes mache:

. .profile

Aber ich versuche, dasselbe in einem Bash-Skript auszuführen, das ich schreibe, und es funktioniert einfach nicht. Irgendwelche Ideen? Kann ich noch etwas zur Klärung bereitstellen?

Vielen Dank

Amir Rustamzadeh
quelle
Wie Ignacio weiter unten ausführt, wird Ihr Skript in einer Subshell ausgeführt. Die Subshell kann die Haupt-Shell nicht ändern (der untergeordnete Prozess kann die übergeordnete nicht ändern). Sie müssen das Skript also mit dem "." Befehl (der auch als "Quelle" geschrieben werden kann). Wenn Ihr Skript beispielsweise Umgebungsvariablen ändern möchte, müssen Sie beispielsweise "Quell-Myskript" oder "Myskript" ausführen (beide bedeuten dasselbe). Dadurch wird die Umgebung Ihrer Haupt-Shell geändert. (Was ich denke, ist, was Sie versuchen, lassen Sie mich wissen, wenn dies falsch ist.)
Bstpierre
1
Ich habe meine Antwort von Ihrer Frage bekommen :)
Kolob Canyon

Antworten:

195

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

source ~/.profile
Kofriel
quelle
1
Haben Sie eine alternative Lösung? Da die Verwendung von sourceBefehl wird die Datei als Script ... Im schlimmsten Fall führen, wenn jemand eine variable Zuordnung wie verwenden würde MyVar="$foo$MyVar"in ihrer bash_profile, dann source ~/.profilewürde das Endergebnis geben MyVar="$foo$MyVar$MyVar", daher $MyVarhätte den falschen Wert danach. (Unabhängig von schlechten Praktiken, fragen Sie einfach nach einer alternativen Lösung)
Jeffrey Mvutu Mabilama
9

Versuche dies:

cd 
source .bash_profile
girardengo
quelle
5

Beim Versuch, die Datei / source ~ / .profile neu zu laden, treten einige Probleme auf. [Dies bezieht sich auf Ubuntu Linux - in einigen Fällen sind die Details der Befehle unterschiedlich]

  1. Führen Sie dies direkt im Terminal oder in einem Skript aus?
  2. Wie führt man 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 Profildatei aktualisiert.

Anzeige 2) Sie können jedes Bash-Skript entweder durch Aufrufen starten

sh myscript.sh 

oder

. myscript.sh

Im ersten Fall wird eine Unterschale erstellt, die die Umgebungsvariablen Ihres Systems nicht beeinflusst und nur für den Unterschalenprozess sichtbar ist. Nach Beendigung des Unterschalenbefehls wird keiner der Exporte usw. angewendet. Dies ist ein häufiger Fehler und führt dazu, dass viele Entwickler viel Zeit verlieren.

Damit Ihre in Ihrem Skript vorgenommenen Änderungen Auswirkungen auf die globale Umgebung haben, muss das Skript ausgeführt werden

.myscript.sh

Befehl.

Um sicherzustellen, dass Ihr Skript nicht in einem Subshel ​​ausgeführt wird, können Sie diese Funktion verwenden. (Wieder ist 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!

twboc
quelle
4

Das Bash-Skript wird in einer separaten Subshell ausgeführt. Damit dies funktioniert, müssen Sie auch dieses andere Skript als Quelle verwenden.

Ignacio Vazquez-Abrams
quelle
Ich bin mir nicht sicher (noch neu in all dem), was Sie genau mit "Quelle" des anderen Skripts meinen. Könnte bitte etwas näher darauf eingehen. Ich habe jedoch versucht: $. ~ / .profile $. / etc / profile ohne Erfolg. Ich danke dir sehr.
Amir Rustamzadeh
1
@amirrustan: Ihr Skript muss Ihre .profileDatei ungefähr so ​​beziehen: . $HOME/.profileund Sie müssen Ihr Skript starten, indem Sie es auch beziehen . So etwas wie. /path/to/yourscript
Bis auf weiteres angehalten.
1
@amirrustam bitte lesen superuser.com/questions/176783/...
Lesmana
1

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 $@
echo my script continues here
' arg0 "$@"
Tilo
quelle