Що робить "джерело"?


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

Він існує, і його можна керувати. Чому в Ubuntu немає жодної документації про це? Що це робить? Як я можу встановити документацію про це?



54
ви забули $ type source source is a shell built-in
bnjmn

2
Моя оболонка повернула це $ whatis source source (1) - bash built-in commands, see bash(1). Також man sourceпереносить мене на BASH_BUILTINS(1)сторінки чоловіків. Це на Fedora btw, не маю уявлення, чому ці пакети debian не (або погано) -документовані.
arielnmz

4
@lesmana, чудове посилання. Ця пов'язана відповідь є більш ретельною відповіддю на це питання.
Скотт

5
Спробуйте "джерело довідки"
Джассер,

Відповіді:


470

sourceце вбудована команда bash shell, яка виконує вміст файлу, переданого як аргумент, у поточну оболонку . Він має синонім у .(періоді).

Синтаксис

. filename [arguments]

source filename [arguments]

8
Це sourceкоманда bash, чи інші оболонки мають це? (Я прошу отримати теги прямо на запитання ...)
Jonik

2
Афаїк, sourceбув присутній в оболонці Борна і, отже, мабуть, був присутній у всіх його нащадків. en.wikipedia.org/wiki/Bourne_shell . Я знаю, що не всі оболонки мають sourceкоманду, менш точно визначено, які оболонки містять її.
nagul

13
@nagul, sourceне було в оболонці Bourne, це розширення GNU, яке з’явилося набагато пізніше. Оригінальний і все ще портативний синтаксис (POSIX) полягає у використанні команди "крапка", тобто .замість цього. Я особисто ніколи не використовую, sourceвраховуючи той факт, що він довше друкувати і не має додаткової вартості. Я думаю, що його основна мета - зробити сценарії більш читабельними для новачків.
jlliagre

18
@jlliagre моє особисте "поясніть, чому є джерело" - sourceце не тільки більш описовий характер, але це схоже на щось інше, ніж помилка друку. У мене люди пропускали період / крапку, коли я надсилаю технічні команди електронною поштою.
Багата Гомолка

3
Одне поширене використання для цієї команди - це сценарій оболонки для source"файлу конфігурації", який містить в основному змінні призначення. Потім змінні призначення керують речами, які решта скрипту виконує. Звичайно, хороший скрипт встановить змінні до значущих за замовчуванням перед source, або принаймні перевірять чинні значення.
LawrenceC

276

Будь обережний! ./і sourceце не зовсім те ж саме .

  • ./scriptзапускає скрипт як виконуваний файл, запускаючи нову оболонку для його запуску
  • source scriptчитає і виконує команди з імені файлу в поточному середовищі оболонки

Примітка: ./scriptні . script, але . script==source script

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


27
Ви змішуєте ./command та. сценарій. source-command такий же, як.-command. Використовуючи ./meh каже, запустіть скрипт / двійковий файл з ім'ям meh у поточному каталозі, і нічого спільного з source / не має. -команда. Як пояснено у відповіді у вашому посиланні.
Йоаким Елофссон

2
@JoakimElofsson Він згадується у посиланні, але я зміню відповідь, щоб уникнути помилок. Будь ласка, виправте це.
damphat

3
Наче важливо, щоб прийнята відповідь вказувала і на цю, бо на мить я подумав це./ == source == .
Даніель F

90

Корисно знати команду 'type':

> type source
source is a shell builtin

всякий раз, коли щось є вбудованою оболонкою, це час робити man bash.


1
Завжди знайте щось нове, читаючи man)

19
Ви також можете використовувати help {builtin-name}, тобто help source.
LawrenceC

1
helpпрацює не скрізь (принаймні в zsh). typeробить.
кумархарш

4
Для посилення: якщо ви використовуєте bash, і якщо ви знаєте (можливо, через "type"), це вбудована команда, то "help" переведе вас безпосередньо до потрібного абзацу документації, не перебираючи 4,184 рядків " man bash 'текст.
Рон Берк

38

. (період) - це вбудована команда bash shell, яка виконує команди з файлу, переданого як аргумент, у поточній оболонці. 'source' - синонім '.'. '

З сторінки чоловіка 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' - довга версія '.' командування. У підказці bash можна зробити:

source ~/.bashrc

для перезавантаження вашого (зміненого?) налаштування bash для поточного запущеного bash.

Коротка версія буде:

. ~/.bashrc

Сторінка людини:

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

Це має бути прийнятою відповіддю.
Пітер Мортенсен

25

sourceкоманда виконує наданий скрипт (дозвіл на виконання файлу не є обов'язковим ) у поточному середовищі оболонки, в той час як ./виконується наданий виконуваний сценарій у новій оболонці.

sourceУ команди є синонім . filename.

Щоб зробити це більш зрозумілим, подивіться на наступний сценарій, який встановлює псевдонім.

make_alias

#! /bin/bash

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

Тепер у нас є два варіанти для виконання цього сценарію. Але, маючи лише один варіант, серед цих двох варіантів можна створити бажаний псевдонім для поточної оболонки.

Варіант 1: ./make_alias

Спершу зробіть сценарій виконуваним.

chmod +x make_alias

Виконати

./make_alias

Перевірте

alias

Вихідні дані

**nothing**

Ого! Псевдонім пішов з новою оболонкою.

Перейдемо до другого варіанту.

Варіант 2: source make_alias

Виконати

source make_alias

або

. make_alias

Перевірте

alias

Вихідні дані

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

Так, Псевдонім встановлений.


10

Коли ви сумніваєтесь, найкраще зробити infoкоманду:

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

Чи можете ви надати більше, ніж просто RTFM?
Пітер Мортенсен

5

Введіть команду "довідкове джерело" у вашій оболонці.

Ви отримаєте вихід таким чином:

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

З документаційного проекту Linux, Розширеного посібника з сценаріїв Bash,
Глава 15 - Команди внутрішніх справ та вбудовані елементи :

джерело , . (команда крапки):
Ця команда, коли викликається з командного рядка, виконує скрипт. У межах сценарію ім'я вихідного файлу завантажує ім'я файлу. Додавання файлу (dot-command) імпортує код у скрипт, додаючи до скрипту (такий же ефект, як директива #include в програмі C). Чистий результат такий же, як якщо б "джерельні" рядки коду були фізично присутні в тілі сценарію. Це корисно в ситуаціях, коли кілька сценаріїв використовують загальний файл даних або бібліотеку функцій.
Якщо отриманий файл сам по собі є виконавчим скриптом, він запуститься, а потім поверне управління до сценарію, який його викликав. Створений виконуваний скрипт може використовувати для цього повернення.

Отже, для тих, хто знайомий з мовою програмування на С, пошук файлу має ефект, подібний до #includeдирективи.

Зауважте також, що ви можете передавати позиційні аргументи до файлу, який отримується, наприклад:

$ source $filename $arg1 arg2

Чим ця відповідь відрізняється від попередніх 9 відповідей?
Стівен Рауч

2
Додаю ще одне джерело інформації та додаткову інформацію, не згадану раніше.
Олександро де Олівейра

Я не знав, що sourceможна брати аргументи або використовувати return.
Джо

2

Слід зазначити , що хоча і є дивовижною команда, ні , sourceні його скороченим з .буде джерело більш одного файлу, значення

source *.sh

або

. script1.sh script2.sh

не вийде .

Ми можемо повернутися назад, використовуючи forпетлі, але це може видавати виконуваний файл багато разів, створюючи кілька команд або видаючи його.

Висновок: sourceне приймає декілька файлів як вхідні дані. Аргумент повинен бути одним.

Що смокче ІМХО.


0

За допомогою джерела ви можете передавати змінні або функції з іншого файлу у свій сценарій та використовувати їх, не вимагаючи їх знову писати.

FI:

#!/bin/bash

source /etc/environment

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

Ура

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.