Was macht "Quelle"?

584
$ whatis source
source: nothing appropriate.
$ man source
No manual entry for source
$ source
bash: source: filename argument required
source: usage: source filename [arguments]

Es existiert und ist lauffähig. Warum gibt es in Ubuntu keine Dokumentation dazu? Was tut es? Wie kann ich Dokumentation dazu installieren?

Andrea Ambu
quelle
5
bezogen werden : superuser.com/questions/176783/...
Lesmana
54
du hast vergessen $ type source source is a shell built-in
bnjmn
2
Meine Muschel hat das zurückgegeben $ whatis source source (1) - bash built-in commands, see bash(1). Auch man sourcenimmt mich auf die BASH_BUILTINS(1)man - Seiten. Dies ist übrigens auf Fedora, keine Ahnung, warum diese Debian-Pakete nicht (oder schlecht) dokumentiert sind.
Arielnmz
4
@lesmana, tolle Verbindung. Diese verknüpfte Antwort ist die gründlichere Antwort auf diese Frage.
Scott
5
Versuchen Sie "Hilfe-Quelle"
Jasser

Antworten:

470

sourceist ein in die Bash-Shell integrierter Befehl, der den Inhalt der als Argument übergebenen Datei in der aktuellen Shell ausführt . Es hat ein Synonym in .(Punkt).

Syntax

. filename [arguments]

source filename [arguments]
Nagul
quelle
8
Ist sourceein bash-spezifischer Befehl oder haben ihn auch andere Shells? (Ich bitte, Tags direkt auf die Frage zu bekommen ...)
Jonik
2
Afaik sourcewar in der Bourne-Muschel vorhanden und daher wahrscheinlich in allen ihren Nachkommen vorhanden. en.wikipedia.org/wiki/Bourne_shell . Ich weiß, dass nicht alle Shells den sourceBefehl haben, noch weniger sicher, welche Shells ihn enthalten.
Nagul
13
@nagul, sourcewar nicht in der Bourne-Shell vorhanden, es ist eine GNU-Erweiterung, die viel später kam. Die ursprüngliche und noch tragbare Syntax (POSIX) besteht darin, .stattdessen den Befehl "dot" zu verwenden. Ich persönlich benutze sourcees nie, da es länger zu tippen ist und keinen Mehrwert hat. Ich denke, sein Hauptzweck ist es, Skripte für Neulinge lesbarer zu machen.
Juli
18
@jlliagre meine persönliche "erklären, warum haben Quelle" ist, dass sourcenicht nur aussagekräftiger ist, aber es sieht aus wie etwas anderes als ein Tippfehler. Ich habe Leute den Punkt überspringen lassen, wenn ich technische Befehle per E-Mail sende.
Rich Homolka
3
Eine gebräuchliche Verwendung für diesen Befehl besteht darin, ein Shell-Skript sourcein einer "Konfigurationsdatei" zu speichern, die hauptsächlich variable Zuweisungen enthält. Die Variablenzuweisungen steuern dann die Aufgaben, die der Rest des Skripts ausführt. Natürlich setzt ein gutes Skript die Variablen vor dem auf sinnvolle Standardwerte sourceoder sucht zumindest nach gültigen Werten.
LawrenceC
276

Achtung! ./und sourcesind nicht ganz dasselbe .

  • ./scriptFührt das Skript als ausführbare Datei aus und startet eine neue Shell , um es auszuführen
  • source scriptLiest und führt Befehle aus dem Dateinamen in der aktuellen Shell- Umgebung aus

Hinweis: ./scriptist nicht . script, aber . script==source script

https://askubuntu.com/questions/182012/is-there-a-difference-between-and-source-in-bash-after-all?lq=1

Dampfer
quelle
27
Sie mischen ./command und. Skript. source-command ist dasselbe wie.-command. Mit ./meh wird gesagt, dass Sie das Skript / binary mit dem Namen meh im aktuellen Verzeichnis ausführen und nichts mit source / zu tun haben. -Befehl. Wie in der Antwort in Ihrem Link erklärt.
Joakim Elofsson
2
@JoakimElofsson Es wird im Link erwähnt, aber ich werde die Antwort ändern, um Missverständnisse zu vermeiden. Bitte korrigiere es.
Damphat
3
Es ist irgendwie wichtig, dass die akzeptierte Antwort auch auf diese verweist, denn für einen Moment dachte ich, dass./ == source == .
Daniel F
90

Es ist nützlich, den Befehl 'type' zu kennen:

> type source
source is a shell builtin

Wann immer etwas eine eingebaute Shell ist, ist es Zeit zu tun man bash.

micans
quelle
1
Immer etwas Neues beim Lesen man)
19
Sie können auch verwenden help {builtin-name}, dh help source.
LawrenceC
1
helpfunktioniert nicht überall (zumindest in zsh). typetut.
Kumarharsh
4
Um es zu erweitern: Wenn Sie bash verwenden und wissen, dass es sich um einen eingebauten Befehl handelt (möglicherweise über 'type'), bringt Sie 'help' direkt zum gewünschten Dokumentationsabschnitt, ohne durch 4.184 Zeilen von 'zu waten. Mann bash 'Text.
Ron Burk
38

. (ein Punkt) ist ein in die Bash-Shell integrierter Befehl , der die Befehle aus einer Datei ausführt, die als Argument in der aktuellen Shell übergeben wurde. 'source' ist ein Synonym für '.'.

Aus der Bash-Manpage:

. filename [arguments]
source filename [arguments]
       Read  and  execute  commands  from filename in the current shell
       environment and return the exit status of the last command  exe
       cuted from filename.  If filename does not contain a slash, file
       names in PATH are used to find the  directory  containing  file
       name.   The  file  searched  for in PATH need not be executable.
       When bash is  not  in  posix  mode,  the  current  directory  is
       searched  if no file is found in PATH.  If the sourcepath option
       to the shopt builtin command is turned  off,  the  PATH  is  not
       searched.   If any arguments are supplied, they become the posi
       tional parameters when  filename  is  executed.   Otherwise  the
       positional  parameters  are unchanged.  The return status is the
       status of the last command exited within the  script  (0  if  no
       commands  are  executed),  and false if filename is not found or
       cannot be read.
Jawa
quelle
27

'source' ist die lange Version von '.' Befehl. Auf der Bash-Eingabeaufforderung kann man Folgendes tun:

source ~/.bashrc

um die (geänderte?) Bash-Einstellung für die aktuelle laufende Bash neu zu laden.

Kurzfassung wäre:

. ~/.bashrc

Die Manpage:

. filename [arguments]
source filename [arguments]
    Read and execute commands from filename in the current shell environment and
    return the exit status of the last command executed from filename. If 
    filename does not contain a slash, file names in PATH are used to find the
    directory containing filename. The file searched for in PATH need not be
    executable. When bash is not in posix mode, the current directory is
    searched if no file is found in PATH. If the sourcepath option to the short
    builtin command is turned off, the PATH is not searched. If any arguments
    are supplied, they become the positional parameters when filename is
    executed. Otherwise the positional parameters are unchanged. The return 
    status is the status of the last command exited within the script (0 if no
    commands are executed), and false if filename is not found or cannot be
    read. 
Joakim Elofsson
quelle
Dies sollte die akzeptierte Antwort sein.
Peter Mortensen
25

sourceDer Befehl führt das bereitgestellte Skript in der aktuellen Shell-Umgebung aus (ausführbare Berechtigungen sind nicht erforderlich ) , während das bereitgestellte ausführbare Skript in einer neuen Shell ausgeführt wird../

sourceBefehl haben ein Synonym . filename.

Schauen Sie sich zur Verdeutlichung das folgende Skript an, mit dem der Alias ​​festgelegt wird.

make_alias

#! /bin/bash

alias myproject='cd ~/Documents/Projects/2015/NewProject'

Jetzt haben wir zwei Möglichkeiten, um dieses Skript auszuführen. Mit nur einer Option kann der gewünschte Alias ​​für die aktuelle Shell unter diesen beiden Optionen erstellt werden.

Option 1: ./make_alias

Machen Sie das Skript zuerst ausführbar.

chmod +x make_alias

Ausführen

./make_alias

Überprüfen

alias

Ausgabe

**nothing**

Hoppla! Alias ​​ist mit der neuen Shell verschwunden.

Fahren wir mit der zweiten Option fort.

Option 2: source make_alias

Ausführen

source make_alias

oder

. make_alias

Überprüfen

alias

Ausgabe

alias myproject='cd ~/Documents/Projects/2015/NewProject'

Ja, Alias ​​ist festgelegt.

Harte Vakharia
quelle
10

Im Zweifelsfall verwenden Sie am besten den folgenden infoBefehl:

[root@abc ~]# info source

BASH BUILTIN COMMANDS
       Unless otherwise noted, each builtin command documented in this section
       as accepting options preceded by - accepts -- to signify the end of the
       options.   The  :, true, false, and test builtins do not accept options
       and do not treat -- specially.  The exit, logout, break, continue, let,
       and  shift builtins accept and process arguments beginning with - with-
       out requiring --.  Other builtins that accept  arguments  but  are  not
       specified  as accepting options interpret arguments beginning with - as
       invalid options and require -- to prevent this interpretation.
       : [arguments]
              No effect; the command does nothing beyond  expanding  arguments
              and  performing any specified redirections.  A zero exit code is
              returned.

        .  filename [arguments]
       source filename [arguments]
              Read and execute commands from filename  in  the  current  shell
              environment  and return the exit status of the last command exe-
              cuted from filename.  If filename does not contain a slash, file
              names  in  PATH  are used to find the directory containing file-
              name.  The file searched for in PATH  need  not  be  executable.
              When  bash  is  not  in  posix  mode,  the  current directory is
              searched if no file is found in PATH.  If the sourcepath  option
              to  the  shopt  builtin  command  is turned off, the PATH is not
              searched.  If any arguments are supplied, they become the  posi-
              tional  parameters  when  filename  is  executed.  Otherwise the
              positional parameters are unchanged.  The return status  is  the
              status  of  the  last  command exited within the script (0 if no
              commands are executed), and false if filename is  not  found  or
              cannot be read.
Akshay Upadhyaya
quelle
Können Sie mehr als nur RTFM bereitstellen?
Peter Mortensen
5

Geben Sie den Befehl "help source" in Ihre Shell ein.

Sie erhalten folgende Ausgabe:

source: source 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.
Jasser
quelle
4

Aus dem Linux-Dokumentationsprojekt, Advanced Bash Scripting Guide,
Kapitel 15 - Interne Befehle und integrierte Funktionen :

Quelle , Geburtsort . (Punktbefehl):
Dieser Befehl führt ein Skript aus, wenn er über die Befehlszeile aufgerufen wird. Innerhalb eines Skripts lädt ein Quelldateiname die Datei Dateiname. Durch die Beschaffung einer Datei (Punkt-Befehl) wird Code in das Skript importiert und an das Skript angehängt (gleicher Effekt wie bei der Anweisung #include in einem C-Programm). Das Nettoergebnis ist dasselbe, als ob die "bezogenen" Codezeilen physisch im Hauptteil des Skripts vorhanden wären. Dies ist in Situationen nützlich, in denen mehrere Skripts eine gemeinsame Datendatei oder Funktionsbibliothek verwenden.
Wenn die Quelldatei selbst ein ausführbares Skript ist, wird sie ausgeführt und die Steuerung an das Skript zurückgegeben, das sie aufgerufen hat. Ein ausführbares Skript mit Quellen kann zu diesem Zweck eine Rückgabe verwenden.

Für diejenigen, die mit der Programmiersprache C vertraut sind, hat die Beschaffung einer Datei einen ähnlichen Effekt wie die #includeDirektive.

Beachten Sie auch, dass Sie Positionsargumente an die zu beschaffende Datei übergeben können, wie zum Beispiel:

$ source $filename $arg1 arg2
Alexandro de Oliveira
quelle
Wie unterscheidet sich diese Antwort von den 9 vorherigen Antworten?
Stephen Rauch
2
Ich füge eine weitere Informationsquelle und zusätzliche Informationen hinzu, die zuvor nicht erwähnt wurden.
Alexandro de Oliveira
Ich wusste nicht, dass sourcedas Argumente oder Verwendung nehmen könnte return.
Joe
2

Es sei darauf hingewiesen , dass , obwohl seine ein fantastischer Befehl, weder sourcenoch die Stenografie von .würde Quelle mehr als eine Datei, bedeutung

source *.sh

oder

. script1.sh script2.sh

wird nicht funktionieren.

Wir können mithilfe von forSchleifen zurückgreifen , aber die ausführbare Datei wird oft ausgegeben, wobei mehrere Befehle erstellt oder ausgegeben werden.

Fazit: sourceNimmt nicht mehrere Dateien als Eingabe. Das Argument muss eins sein.

Was meiner Meinung nach scheiße ist.

Peter Mortensen
quelle
0

Mit source können Sie Variablen oder Funktionen aus einer anderen Datei an Ihr Skript übergeben und verwenden, ohne sie erneut schreiben zu müssen.

FI:

#!/bin/bash

source /etc/environment

source /myscripts/jetty-common/config/jetty-functions.sh

Prost

DimiDak
quelle