'Nguồn' làm gì?


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

Nó tồn tại, và nó có thể chạy được. Tại sao không có tài liệu nào về nó trong Ubuntu? Nó làm gì? Làm thế nào tôi có thể cài đặt tài liệu về nó?



54
bạn đã quên $ type source source is a shell built-in
bnjmn

2
Vỏ của tôi trả lại cái này $ whatis source source (1) - bash built-in commands, see bash(1). Ngoài ra, man sourceđưa tôi đến các BASH_BUILTINS(1)trang người đàn ông. Đây là trên Fedora btw, không biết tại sao các gói debian đó lại không được (hoặc xấu).
arielnmz

4
@lesmana, liên kết tuyệt vời. Câu trả lời liên kết đó là câu trả lời kỹ lưỡng hơn cho câu hỏi này.
Scott

5
Hãy thử "nguồn trợ giúp"
Jasser

Câu trả lời:


470

sourcelà một lệnh bash shell tích hợp thực thi nội dung của tệp được truyền dưới dạng đối số, trong trình bao hiện tại . Nó có một từ đồng nghĩa trong .(thời gian).

Cú pháp

. filename [arguments]

source filename [arguments]

8
sourcemột lệnh cụ thể bash hoặc các shell khác cũng có nó? (Tôi đang yêu cầu lấy thẻ ngay trong câu hỏi ...)
Jonik

2
Afaik, sourceđã có mặt trong vỏ Bourne và do đó có lẽ có mặt trong tất cả các hậu duệ của nó. vi.wikipedia.org/wiki/Bourne_shell . Tôi biết rằng không phải tất cả các shell đều có sourcelệnh, ít chắc chắn hơn về các shell nào chứa nó.
nagul

13
@nagul, sourcekhông có trong shell Bourne, nó là một phần mở rộng GNU xuất hiện muộn hơn nhiều. Cú pháp gốc và vẫn di động (POSIX) là sử dụng lệnh "dot", tức là .thay vào đó. Tôi cá nhân không bao giờ sử dụng sourcevới thực tế là nó dài hơn để gõ và không có giá trị gia tăng. Tôi đoán mục đích chính của nó là làm cho các kịch bản dễ đọc hơn cho người mới.
jlliagre

18
@jlliagre "giải thích tại sao có nguồn" cá nhân của tôi sourcekhông chỉ mang tính mô tả mà còn giống như một lỗi đánh máy. Tôi đã có người bỏ qua dấu chấm / dấu chấm khi tôi gửi các lệnh công nghệ trong email.
Rich Homolka

3
Một cách sử dụng phổ biến cho lệnh này là cho tập lệnh shell sourcetrong "tệp cấu hình" có chứa phần lớn các phép gán biến. Các bài tập biến sau đó kiểm soát những thứ còn lại của tập lệnh. Tất nhiên, một tập lệnh tốt sẽ đặt các biến thành mặc định hợp lý trước sourcehoặc ít nhất là kiểm tra các giá trị hợp lệ.
LawrenceC

276

Hãy cẩn thận! ./sourcekhông hoàn toàn giống .

  • ./scriptchạy tập lệnh dưới dạng tập tin thực thi, khởi chạy shell mới để chạy tập lệnh
  • source scriptđọc và thực thi các lệnh từ tên tệp trong môi trường shell hiện tại

Lưu ý: ./scriptkhông phải . script, nhưng . script==source script

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


27
Bạn đang trộn lẫn ./command và. kịch bản. lệnh nguồn giống như lệnh-lệnh. Sử dụng ./meh cho biết chạy script / binary có tên meh trong thư mục hiện tại và không có gì để làm với nguồn /. -chỉ huy. Như đã giải thích trong câu trả lời trong liên kết của bạn.
Joakim Elofsson

2
@JoakimElofsson Nó được đề cập trong liên kết, nhưng tôi sẽ sửa đổi câu trả lời để tránh hiểu sai. Xin vui lòng sửa lại.
damphat

3
Điều quan trọng là câu trả lời được chấp nhận cũng chỉ ra câu hỏi này, bởi vì trong một khoảnh khắc tôi đã nghĩ rằng./ == source == .
Daniel F

90

Thật hữu ích khi biết lệnh 'loại':

> type source
source is a shell builtin

Bất cứ khi nào một cái gì đó là một vỏ được xây dựng, đó là thời gian để làm man bash.


1
Luôn biết điều gì đó mới khi đọc man)

19
Bạn cũng có thể sử dụng help {builtin-name}, tức là help source.
LawrenceC

1
helpkhông hoạt động ở mọi nơi (ít nhất là trong zsh). typelàm.
kumarharsh

4
Để khuếch đại: nếu bạn đang sử dụng bash và nếu bạn biết (có thể thông qua 'loại') thì đó là một lệnh tích hợp, sau đó 'trợ giúp' sẽ đưa bạn trực tiếp đến đoạn tài liệu bạn muốn mà không phải lướt qua 4.184 dòng ' người đàn ông bash 'văn bản.
Ron Burk

38

. (một dấu chấm) là một lệnh bash shell tích hợp thực thi các lệnh từ một tệp được truyền dưới dạng đối số, trong shell hiện tại. 'Nguồn' là từ đồng nghĩa với '.'.

Từ trang Bash của người đàn ông:

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

27

'nguồn' là phiên bản dài của '.' chỉ huy. Trên dấu nhắc bash người ta có thể làm:

source ~/.bashrc

để tải lại cài đặt bash (đã thay đổi?) của bạn cho bash đang chạy hiện tại.

Phiên bản ngắn sẽ là:

. ~/.bashrc

Trang nam:

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

Đây phải là câu trả lời được chấp nhận.
Peter Mortensen

25

sourcelệnh thực thi tập lệnh được cung cấp (quyền thực thi là không bắt buộc ) trong môi trường shell hiện tại , trong khi ./thực thi tập lệnh thực thi được cung cấp trong trình bao mới .

sourcelệnh nào có từ đồng nghĩa . filename.

Để làm cho nó rõ ràng hơn, hãy xem đoạn script sau, đặt bí danh.

đặt bí danh

#! /bin/bash

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

Bây giờ chúng tôi có hai lựa chọn để thực hiện kịch bản này. Nhưng chỉ với một tùy chọn, bí danh mong muốn cho shell hiện tại có thể được tạo trong số hai tùy chọn này.

Lựa chọn 1: ./make_alias

Làm cho kịch bản thực thi đầu tiên.

chmod +x make_alias

Thi hành, hành hình

./make_alias

Kiểm chứng

alias

Đầu ra

**nothing**

Rất tiếc! Bí danh đã biến mất với vỏ mới.

Hãy đi với tùy chọn thứ hai.

Tùy chọn 2: source make_alias

Thi hành, hành hình

source make_alias

hoặc là

. make_alias

Kiểm chứng

alias

Đầu ra

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

Bí danh Yeah được thiết lập.


10

Khi nghi ngờ, điều tốt nhất để làm là sử dụng infolệnh:

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

Bạn có thể cung cấp nhiều hơn chỉ RTFM?
Peter Mortensen

5

Nhập lệnh "nguồn trợ giúp" trong trình bao của bạn.

Bạn sẽ nhận được đầu ra như thế này:

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

Từ Dự án Tài liệu Linux, Hướng dẫn lập trình Bash nâng cao,
Chương 15 - Các lệnh và nội bộ bên trong :

nguồn , . (lệnh dot):
Lệnh này, khi được gọi từ dòng lệnh, sẽ thực thi một tập lệnh. Trong tập lệnh, tên tệp nguồn tải tên tệp của tệp. Tìm nguồn tệp (lệnh dot) nhập mã vào tập lệnh, nối thêm vào tập lệnh (có tác dụng tương tự như lệnh #incoide trong chương trình C). Kết quả cuối cùng giống như khi các dòng mã "có nguồn gốc" có mặt vật lý trong phần thân của tập lệnh. Điều này hữu ích trong các tình huống khi nhiều tập lệnh sử dụng một tệp dữ liệu chung hoặc thư viện hàm.
Nếu tệp có nguồn gốc tự nó là một tập lệnh thực thi, thì nó sẽ chạy, sau đó trả lại quyền điều khiển cho tập lệnh đã gọi nó. Một tập lệnh thực thi có nguồn gốc có thể sử dụng trả về cho mục đích này.

Vì vậy, đối với những người quen thuộc với ngôn ngữ lập trình C, tìm nguồn cung cấp một tệp có hiệu lực tương tự như lệnh #include.

Cũng lưu ý rằng bạn có thể chuyển các đối số vị trí cho tệp đang có nguồn gốc, như:

$ source $filename $arg1 arg2

Câu trả lời này khác với 9 câu trả lời trước như thế nào?
Stephen Rauch

2
Tôi thêm một nguồn thông tin và thông tin bổ sung không được đề cập trước đó.
Alexandro de Oliveira

Tôi không biết rằng sourcecó thể tranh luận hoặc sử dụng return.
Joe

2

Cần lưu ý rằng mặc dù là một lệnh tuyệt vời, nhưng sourcecũng không phải là tốc ký của .nó sẽ cung cấp nhiều hơn một tệp, có nghĩa là

source *.sh

hoặc là

. script1.sh script2.sh

sẽ không hoạt động.

Chúng ta có thể quay lại bằng cách sử dụng forcác vòng lặp, nhưng nó sẽ phát hành nhiều lần thực thi, tạo ra nhiều lệnh hoặc vấn đề của nó.

Kết luận: sourcekhông lấy nhiều tệp làm đầu vào. Đối số phải là một.

Mà hút IMHO.


0

Với nguồn, bạn có thể chuyển các biến hoặc hàm từ tệp khác vào tập lệnh của mình và sử dụng chúng mà không phải viết lại chúng.

FI:

#!/bin/bash

source /etc/environment

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

Chúc mừng

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.