Que fait 'source'?

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

Il existe et il est exécutable. Pourquoi n'y a-t-il pas de documentation à ce sujet dans Ubuntu? Qu'est ce que ça fait? Comment puis-je installer la documentation à ce sujet?

Andrea Ambu
la source
54
vous avez oublié $ type source source is a shell built-in
bnjmn
2
Mon shell a renvoyé ceci $ whatis source source (1) - bash built-in commands, see bash(1). En outre, man sourceme amène aux BASH_BUILTINS(1)pages de manuel. Ceci est sur Fedora btw, aucune idée de la raison pour laquelle ces paquets Debian sont non (ou mal) documentés.
arielnmz
4
@lesmana, excellent lien. Cette réponse liée est la réponse la plus complète à cette question.
Scott
5
Essayez "help source"
Jasser

Réponses:

468

sourceest une commande intégrée du shell bash qui exécute le contenu du fichier passé en argument, dans le shell actuel . Il a un synonyme dans .(période).

Syntaxe

. filename [arguments]

source filename [arguments]
Nagul
la source
8
Est-ce sourcequ'une commande spécifique à Bash ou est-ce que d'autres obus l'ont aussi? (Je demande à ce que les
mots soient exacts
2
Afaik sourceétait présent dans la coquille de Bourne et donc probablement dans tous ses descendants. en.wikipedia.org/wiki/Bourne_shell . Je sais que tous les obus n'ont pas le sourcecommandement, moins sûr de savoir quel obus le contient.
Nagul
13
@nagul, sourcen'était pas présent dans le shell Bourne, c'est une extension GNU qui est arrivée beaucoup plus tard. La syntaxe originale et toujours portable (POSIX) consiste à utiliser la commande "point", c'est-à-dire à la .place. Personnellement, je n’utilise jamais, sourceétant donné qu’il est plus long de taper et n’a aucune valeur ajoutée. Je suppose que son objectif principal est de rendre les scripts plus lisibles pour les débutants.
jeudi
18
@jlliagre mon commentaire "expliquer pourquoi avoir une source" est sourcenon seulement plus descriptif, mais il ressemble à autre chose qu'une faute de frappe. Des personnes ont sauté le point / le point lorsque j'envoie des commandes techniques par courrier électronique.
Rich Homolka
3
Une utilisation courante de cette commande est qu'un script de shell se trouve sourcedans un "fichier de configuration" qui contient principalement des affectations de variables. Les affectations de variables contrôlent ensuite le reste du script. Bien sûr, un bon script définira les variables sur des valeurs par défaut raisonnables avant le source, ou au moins, vérifiera les valeurs valides.
LawrenceC
273

Faites attention! ./et nesource sont pas tout à fait les mêmes .

  • ./scriptexécute le script en tant que fichier exécutable, en lançant un nouveau shell pour l'exécuter
  • source scriptlit et exécute les commandes du nom de fichier dans l' environnement shell actuel

Note: ./scriptn'est pas . script, mais . script==source script

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

mouiller
la source
26
Vous mélangez ./command et. scénario. source-command est identique à.-command. Utiliser ./meh indique que le script / binaire nommé meh est exécuté dans le répertoire en cours et n’a rien à voir avec source /. -commander. Comme expliqué en réponse dans votre lien.
Joakim Elofsson
2
@JoakimElofsson Il est mentionné dans le lien, mais je modifierai la réponse pour éviter tout malentendu. Veuillez corriger s'il vous plait.
damphat
2
Il est un peu important que la réponse acceptée renvoie également à celle-ci, car pendant un instant, j'ai pensé que./ == source == .
Daniel F
90

Il est utile de connaître la commande 'type':

> type source
source is a shell builtin

chaque fois que quelque chose est construit dans un shell, il est temps de le faire man bash.

micans
la source
1
Toujours savoir quelque chose de nouveau lors de la lecture man)
19
Vous pouvez également utiliser help {builtin-name}, à savoir help source.
LawrenceC
1
helpne fonctionne pas partout (au moins en zsh). typeEst-ce que.
Kumarharsh
4
Pour amplifier: si vous utilisez bash, et si vous savez (peut-être via 'type') que c'est une commande intégrée, alors 'help' vous mènera directement au paragraphe de la documentation que vous voulez sans parcourir 4.184 lignes de ' homme bash 'texte.
Ron Burk
38

. (un point) est une commande intégrée du shell bash qui exécute les commandes à partir d'un fichier passé en argument, dans le shell actuel. "source" est un synonyme de ".".

De la page de manuel Bash:

. 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
la source
26

"source" est la version longue de "." commander. Sur l'invite bash, on peut faire:

source ~/.bashrc

pour recharger votre réglage (modifié?) de bash pour le bash en cours.

La version courte serait:

. ~/.bashrc

La page de manuel:

. 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
la source
Cela devrait être la réponse acceptée.
Peter Mortensen
25

sourceLa commande exécute le script fourni (l’autorisation exécutable n’est pas obligatoire ) dans l’ environnement actuel du shell, tandis que ./le script exécutable fourni est exécuté dans un nouveau shell.

sourcecommande a un synonyme . filename.

Pour plus de clarté, jetez un coup d’œil au script suivant, qui définit l’alias.

make_alias

#! /bin/bash

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

Nous avons maintenant deux choix pour exécuter ce script. Mais avec une seule option, l'alias souhaité pour le shell actuel peut être créé entre ces deux options.

Option 1: ./make_alias

Rendre le script exécutable en premier.

chmod +x make_alias

Exécuter

./make_alias

Vérifier

alias

Sortie

**nothing**

Oups! Alias ​​est parti avec le nouveau shell.

Allons avec la deuxième option.

Option 2: source make_alias

Exécuter

source make_alias

ou

. make_alias

Vérifier

alias

Sortie

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

Oui, Alias ​​est prêt.

Harsh Vakharia
la source
10

En cas de doute, la meilleure chose à faire est d'utiliser la infocommande:

[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
la source
Pourriez-vous fournir plus que du RTFM?
Peter Mortensen
5

Tapez la commande "help source" dans votre shell.

Vous obtiendrez une sortie comme ceci:

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
la source
4

Dans le projet de documentation Linux, Guide de rédaction avancée de scripts Bash,
chapitre 15 - Commandes internes et éléments intégrés :

la source , . (commande à point):
cette commande, lorsqu'elle est appelée à partir de la ligne de commande, exécute un script. Dans un script, un nom de fichier source charge le fichier nom de fichier. La création d'un fichier (commande par points) importe le code dans le script, en l'ajoutant au même effet (même effet que la directive #include dans un programme C). Le résultat net est le même que si les lignes de code "générées" étaient physiquement présentes dans le corps du script. Ceci est utile dans les cas où plusieurs scripts utilisent un fichier de données commun ou une bibliothèque de fonctions commune.
Si le fichier source est lui-même un script exécutable, il s'exécutera puis rendra le contrôle au script qui l'a appelé. Un script exécutable recherché peut utiliser un retour à cette fin.

Donc, pour ceux qui sont familiers avec le langage de programmation C, la recherche d’un fichier a un effet similaire à celui de la #includedirective.

Notez également que vous pouvez transmettre des arguments de position au fichier en cours d’origine, comme:

$ source $filename $arg1 arg2
Alexandro de Oliveira
la source
Comment cette réponse diffère-t-elle des 9 réponses précédentes?
Stephen Rauch
2
J'ajoute une autre source d'information et des informations supplémentaires non mentionnées auparavant.
Alexandro de Oliveira
Je ne savais pas que cela sourcepouvait prendre des arguments ou utiliser return.
Joe
2

Il convient de noter que bien qu'étant une commande impressionnante, ni , sourceni son sténographie .serait la source de plus d'un fichier, ce qui signifie

source *.sh

ou

. script1.sh script2.sh

ne pas travailler.

Nous pouvons nous replier en utilisant des forboucles, mais cela relâcherait l'exécutable plusieurs fois, créant plusieurs commandes ou en émettant plusieurs.

Conclusion: sourcene prend pas plusieurs fichiers en entrée. L'argument doit être un.

Ce qui craint à mon humble avis.

Peter Mortensen
la source
0

Avec source, vous pouvez transmettre des variables ou des fonctions d’un autre fichier à votre script et les utiliser sans avoir à les réécrire.

FI:

#!/bin/bash

source /etc/environment

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

À votre santé

DimiDak
la source