Co robi „źródło”?


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

Istnieje i można go uruchomić. Dlaczego w Ubuntu nie ma dokumentacji na ten temat? Co to robi? Jak mogę zainstalować dokumentację na ten temat?



54
zapomniałeś $ type source source is a shell built-in
bnjmn

2
Moja skorupa zwróciła to $ whatis source source (1) - bash built-in commands, see bash(1). Ponadto, man sourcezabiera mnie do BASH_BUILTINS(1)stron podręcznika. Dzieje się tak na Fedorze, nie mam pojęcia, dlaczego te pakiety Debiana są nieudokumentowane (lub źle).
arielnmz

4
@lesmana, świetny link. Ta powiązana odpowiedź jest dokładniejszą odpowiedzią na to pytanie.
Scott

5
Spróbuj „źródło pomocy”
Jasser,

Odpowiedzi:


470

sourceto wbudowane polecenie powłoki bash, które wykonuje zawartość pliku przekazanego jako argument w bieżącej powłoce . Ma synonim w .(kropka).

Składnia

. filename [arguments]

source filename [arguments]

8
Czy jest sourceto polecenie specyficzne dla basha, czy też inne powłoki go mają? (Proszę o dokładne
trafienie

2
Afaik sourcebył obecny w skorupie Bourne'a, a zatem prawdopodobnie był obecny u wszystkich jego potomków. en.wikipedia.org/wiki/Bourne_shell . Wiem, że nie wszystkie powłoki mają sourcepolecenie, mniej pewni, które powłoki je zawierają.
nagul

13
@nagul, sourcenie był obecny w powłoce Bourne'a, jest to rozszerzenie GNU, które pojawiło się znacznie później. Oryginalna i wciąż przenośna składnia (POSIX) polega na użyciu polecenia „kropka”, tzn .. Zamiast tego. Osobiście nigdy nie używam, sourcebiorąc pod uwagę fakt, że jest on dłuższy i nie ma wartości dodanej. Myślę, że jego głównym celem jest uczynienie skryptów bardziej czytelnymi dla początkujących.
jlliagre

18
@jlliagre moje osobiste „wyjaśnienie, dlaczego mam źródło” jest sourcenie tylko bardziej opisowe, ale wygląda na coś innego niż literówkę. Ludzie pomijają kropkę / kropkę, gdy wysyłam polecenia techniczne pocztą e-mail.
Rich Homolka

3
Jednym z powszechnych zastosowań tego polecenia jest skrypt powłoki sourcew „pliku konfiguracyjnym”, który zawiera głównie przypisania zmiennych. Przypisania zmiennych kontrolują następnie czynności wykonywane przez resztę skryptu. Oczywiście dobry skrypt ustawi zmienne na rozsądne wartości domyślne przed source, lub przynajmniej sprawdzi poprawne wartości.
LawrenceC

276

Bądź ostrożny! ./i niesourcecałkiem takie same .

  • ./scripturuchamia skrypt jako plik wykonywalny, uruchamiając nową powłokę, aby go uruchomić
  • source scriptodczytuje i wykonuje polecenia z nazwy pliku w bieżącym środowisku powłoki

Uwaga: ./scriptnie jest . script, ale . script==source script

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


27
Mieszasz ./command i. scenariusz. Komenda source jest taka sama jak komenda. Korzystanie z ./meh mówi o uruchomieniu skryptu / pliku binarnego o nazwie meh w bieżącym katalogu i nie ma nic wspólnego ze źródłem /. -Komenda. Jak wyjaśniono w odpowiedzi w linku.
Joakim Elofsson

2
@JoakimElofsson Jest wspomniany w linku, ale zmodyfikuję odpowiedź, aby uniknąć nieporozumień. Proszę popraw to.
damphat

3
To ważne, że zaakceptowana odpowiedź wskazuje również na tę, ponieważ przez chwilę myślałem, że./ == source == .
Daniel F

90

Warto znać polecenie „typ”:

> type source
source is a shell builtin

kiedy tylko coś jest wbudowane w powłokę, czas to zrobić man bash.


1
Zawsze czytaj coś nowego podczas czytania man)

19
Możesz także użyć help {builtin-name}, tj help source.
LawrenceC

1
helpnie działa wszędzie (przynajmniej w Zsh). typerobi.
kumarharsh

4
Aby wzmocnić: jeśli używasz bash i jeśli wiesz (być może za pomocą „type”), jest to wbudowane polecenie, wówczas „help” przeniesie Cię bezpośrednio do akapitu dokumentacji, który chcesz, bez brodzenia w 4184 wierszach „ tekst man bash.
Ron Burk

38

. (kropka) to wbudowane polecenie powłoki bash, które wykonuje polecenia z pliku przekazanego jako argument w bieżącej powłoce. „źródło” jest synonimem „.”.

Ze strony podręcznika użytkownika 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.

26

„source” to długa wersja „”. Komenda. W wierszu poleceń bash można wykonać:

source ~/.bashrc

aby ponownie załadować (zmienione?) ustawienie bash dla aktualnie uruchomionego basha.

Krótka wersja to:

. ~/.bashrc

Strona podręcznika:

. 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. 

To powinna być zaakceptowana odpowiedź.
Peter Mortensen

25

sourcepolecenie wykonuje podany skrypt (uprawnienie do wykonywania nie jest obowiązkowe ) w bieżącym środowisku powłoki, natomiast ./wykonuje podany skrypt wykonywalny w nowej powłoce.

sourcepolecenie mają synonim . filename.

Aby to wyjaśnić, spójrz na poniższy skrypt, który ustawia alias.

make_alias

#! /bin/bash

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

Teraz mamy dwie możliwości wykonania tego skryptu. Ale tylko z jedną opcją można utworzyć pożądany alias dla bieżącej powłoki wśród tych dwóch opcji.

Opcja 1: ./make_alias

Najpierw wykonaj skrypt.

chmod +x make_alias

Wykonać

./make_alias

Zweryfikować

alias

Wynik

**nothing**

Ups! Alias ​​zniknął z nową powłoką.

Przejdźmy do drugiej opcji.

Opcja 2: source make_alias

Wykonać

source make_alias

lub

. make_alias

Zweryfikować

alias

Wynik

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

Tak, Alias ​​jest ustawiony.


10

W razie wątpliwości najlepiej jest użyć infopolecenia:

[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.

Czy możesz podać coś więcej niż tylko RTFM?
Peter Mortensen,

5

Wpisz polecenie „źródło pomocy” w swojej powłoce.

Otrzymasz dane wyjściowe w następujący sposób:

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.

4

Z projektu dokumentacji Linux, Advanced Bash Scripting Guide,
Rozdział 15 - Wewnętrzne polecenia i wbudowane :

źródło , . (polecenie kropki):
To polecenie, wywołane z wiersza polecenia, wykonuje skrypt. W skrypcie źródłowa nazwa-pliku ładuje plik nazwa-pliku. Pozyskanie pliku (polecenie kropki) importuje kod do skryptu, dołączając do skryptu (taki sam efekt jak dyrektywa #include w programie C). Wynik netto jest taki sam, jakby „pozyskane” wiersze kodu były fizycznie obecne w treści skryptu. Jest to przydatne w sytuacjach, gdy wiele skryptów korzysta ze wspólnego pliku danych lub biblioteki funkcji.
Jeśli sam plik źródłowy jest skryptem wykonywalnym, zostanie uruchomiony, a następnie zwróci kontrolę nad skryptem, który go wywołał. Skrypt wykonywalny pochodzący ze źródła może w tym celu użyć zwrotu.

Zatem dla osób zaznajomionych z językiem programowania C pozyskiwanie pliku ma efekt podobny do #includedyrektywy.

Zauważ również, że możesz przekazać argumenty pozycyjne do pozyskiwanego pliku, takie jak:

$ source $filename $arg1 arg2

Czym różni się ta odpowiedź od 9 poprzednich odpowiedzi?
Stephen Rauch

2
Dodaję inne źródło informacji i dodatkowe informacje, o których wcześniej nie wspominałem.
Alexandro de Oliveira,

Nie wiedziałem, że sourcemożna wziąć argumenty lub użyć return.
Joe

2

Należy zauważyć, że mimo iż jest to niesamowite poleceń, ani sourceani skróconej od .by pozyskać więcej niż jeden plik, znaczenia

source *.sh

lub

. script1.sh script2.sh

będzie nie działać.

Możemy wycofać się za pomocą forpętli, ale wydałoby to plik wykonywalny wiele razy, tworząc wiele poleceń lub problem.

Wniosek: sourcenie przyjmuje wielu plików jako danych wejściowych. Argument musi być jeden.

Co do bani IMHO.


0

Za pomocą źródła możesz przekazywać zmienne lub funkcje z innego pliku do skryptu i używać ich bez konieczności ponownego ich zapisywania.

FI:

#!/bin/bash

source /etc/environment

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

Twoje zdrowie

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.