Was bedeutet ein Punkt vor einem Befehl in der Shell?


75

Während ich dem Android Eclipse Debug Tutorial folge, stoße ich auf folgende Befehle.

cd /path/to/android/root 
. build/envsetup.sh 
lunch 1    
make       
emulator

Mein Problem ist, was der Punkt vor build/envsetup.shbedeutet?

Antworten:


79

Ein Punkt in diesem Kontext bedeutet, den Inhalt dieser Datei in die aktuelle Shell zu "importieren". Mit sourcesich selbst ein Shell-Builtin-Befehl. Und sourceund der Punktoperator sind Synonyme.

Beispiel

Angenommen, ich hatte den folgenden Inhalt in einer sample.shDatei.

$ cat sample.sh 
echo "hi"
echo "bye?"

Wenn ich es jetzt beziehe:

$ . sample.sh 
hi
bye?
$

Dateien wie diese werden häufig verwendet, um Setup-Befehle zu integrieren, z. B. um Dinge zu Umgebungsvariablen hinzuzufügen.

Beispiele

Angenommen, ich hatte diese Befehle in einer anderen Datei addvars.sh.

$ cat addvars.sh 
export VAR1="some var1 string"
export VAR2="some var2 string"

Beachten Sie, dass die aktuelle Shell-Umgebung keine Variablen enthält.

$ env | grep VAR
$

Nun, wenn ich diese Datei quelle:

$ . addvars.sh 
$

OK, es scheint nicht so, als hätte es irgendetwas getan, aber wenn wir die envVariablen noch einmal überprüfen :

$ env | grep VAR
VAR1=some var1 string
VAR2=some var2 string

71

Um die Antwort von slm zu ergänzen:

Es gibt zwei Möglichkeiten, ein Shell-Skript auszuführen. Zum einen muss das Skript in einem separaten Prozess ausgeführt werden, was bedeutet, dass die Umgebung der Shell (Speicherstatus) auf den Status der übergeordneten Shell zurückgesetzt wird, bevor der untergeordnete Shell-Prozess ausgeführt wird.

Beispielsweise wird das aktuelle Arbeitsverzeichnis (der Speicherort im Dateisystem, in dem sich eines befindet) pro Prozess ermittelt. Also, lassen Sie uns ein Skript haben, das so aussieht:

#!/bin/bash
cd ~
cd ..
pwd

Nennen wir dieses Skript foo. Und lassen Sie uns dieses Skript wie folgt ausführen:./foo

Wir werden folgendes sehen:

/home

(Standard-Haftungsausschluss, dass es eine große Anzahl von Linux- und anderen UNIX-Clone-Distributionen gibt, von denen einige keine Benutzerverzeichnisse enthalten /home. Oder, wie wir früher sagten: "Ihre Laufleistung kann variieren")

Nachdem Sie dieses Skript ausgeführt haben, geben Sie diesen Befehl ein

pwd

Um zu sehen, in welchem ​​Verzeichnis wir uns befinden, sehen wir etwa Folgendes:

/home/username

Der Grund dafür war wiederum, dass das von uns ausgeführte Shell-Skript eine eigene Umgebung hatte (einschließlich eines eigenen Verzeichnisses, in dem Befehle ausgeführt wurden), und diese Umgebung verschwand, sobald das Skript ausgeführt wurde.

Lassen Sie uns das fooSkript jetzt so ausführen

. ./foo

Oder äquivalent:

source ./foo

Wenn wir pwddanach eine machen, werden wir folgendes sehen:

/home

Der Grund dafür ist: Die Beschaffung eines Skripts ruft keinen separaten Prozess auf. Es ist so, als würden Sie alle Befehle im übergeordneten Prozess von Hand eingeben. Die Umgebung bleibt nach Beendigung des Skripts erhalten.


Lassen Sie mich ein einfacheres Beispiel nennen. Lassen Sie uns ein Skript erstellen, das so aussieht:

#!/bin/bash
exit

Nennen wir es foo. Lassen Sie uns sicherstellen , dass wir es laufen kann: chmod 755 foo. Dann lassen Sie es uns so laufen:

./foo

Nichts passiert. Auf der anderen Seite, wenn wir dies tun:

. ./foo

Oder dieses:

source ./foo

Wir melden uns ab.


6
Ihre Antwort ist besser als die akzeptierte, ich habe verstanden, wie Sie erklärt haben, danke!
Ahmed

Dun-da-da-duuuun! (drumroll please) ... und der wichtigste Satz hier ist !: Der Grund dafür
Gabriel Staples vor

5

Der Punkt steht für die eingebaute Bash source. Es liest und führt Befehle aus einer Datei in der aktuellen Umgebung aus und gibt den Beendigungsstatus des zuletzt ausgeführten Befehls zurück. Die Dateien können sich im aktuellen Verzeichnis oder an einer beliebigen Stelle im Internet befinden PATH. Es muss nicht ausführbar sein.


1

Wie finde ich es heraus?

# type .
. is a shell builtin

# help .
.: . filename [arguments]
    Execute commands from a file in the current shell.

    Read and execute commands from FILENAME in the current shell.  The
    entries in $PATH are used to find the directory containing FILENAME.
    If any ARGUMENTS are supplied, they become the positional parameters
    when FILENAME is executed.

    Exit Status:
    Returns the status of the last command executed in FILENAME; fails if
    FILENAME cannot be read.

Ich denke, dass im Handbuch ein Komma fehlt. Es sollte "Befehle aus einer Datei in der aktuellen Shell
ausführen

1

. (Quell- oder Punktoperator)
Liest und führt Befehle aus dem Dateinamenargument im aktuellen Shell-Kontext aus.

Syntax
      . filename [arguments]

      source filename [arguments]

source ist ein Synonym für dot / period '.' In Bash, aber nicht in POSIX sh. Verwenden Sie für maximale Kompatibilität den Punkt.

Wenn ein Skript unter Verwendung von source ausgeführt wird, wird es in der vorhandenen Shell ausgeführt. Alle vom Skript erstellten oder geänderten Variablen bleiben nach Abschluss des Skripts verfügbar. Im Gegensatz dazu wird, wenn das Skript nur als Dateiname ausgeführt wird, eine separate Subshell (mit einem vollständig separaten Satz von Variablen) erstellt, um das Skript auszuführen.

Es gibt einen subtilen Unterschied zwischen der Ausführung eines Skripts durch Ausführen von .ss64script (dot ss64script) und. ss64script (Punktraum ss64script)

Die erste Option führt eine Datei aus, die vor dem Befehl 'ls' verborgen ist (obwohl ls -a verborgene Dateien anzeigt). Die zweite Option führt ss64script aus, selbst wenn sie nicht als ausführbare Datei mit chmod festgelegt wurde.

Quelle


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.