'แหล่งที่มา' ทำอะไร


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 มันทำอะไร? ฉันจะติดตั้งเอกสารเกี่ยวกับมันได้อย่างไร


5
เกี่ยวข้อง: superuser.com/questions/176783/…
lesmana

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 ไม่มีความคิดว่าทำไมแพ็คเกจเดเบียนเหล่านั้นจึงไม่ได้ (หรือไม่ดี) - เอกสาร
arielnmz

4
@lesmana ลิงค์ที่ดี ว่าคำตอบที่เชื่อมโยงเป็นคำตอบอย่างละเอียดมากขึ้นกับคำถามนี้
Scott

5
ลองใช้ "แหล่งความช่วยเหลือ"
Jasser

คำตอบ:


470

sourceเป็นเปลือกทุบตีในตัวคำสั่งที่รันเนื้อหาของไฟล์ผ่านเป็นอาร์กิวเมนต์ในเปลือกปัจจุบัน มันมีคำพ้องใน.(จุด)

วากยสัมพันธ์

. filename [arguments]

source filename [arguments]

8
คือsourceทุบตีคำสั่งที่ระบุหรือหอยอื่น ๆ ที่มีมันมากเกินไป? (ฉันขอให้ติดแท็กกับคำถาม ... )
Jonik

2
Afaik sourceมีอยู่ในบอร์นเชลล์และอาจมีอยู่ในลูกหลานทั้งหมด en.wikipedia.org/wiki/Bourne_shell ฉันรู้ว่าเชลล์บางตัวไม่มีsourceคำสั่ง แต่มีความแน่นอนน้อยกว่าเกี่ยวกับเชลล์ที่มีอยู่
nagul

13
@nagul sourceไม่ได้อยู่ในเชลล์ Bourne มันเป็นส่วนขยายของ GNU ที่มาในภายหลัง ไวยากรณ์ดั้งเดิมและยังพกพาได้ (POSIX) คือการใช้คำสั่ง "จุด" คือ.แทน ฉันไม่เคยใช้บุคคลsourceเนื่องจากความจริงมันยาวกว่าการพิมพ์และไม่มีมูลค่าเพิ่ม ฉันเดาว่าจุดประสงค์หลักของมันคือการทำให้สคริปต์อ่านง่ายขึ้นสำหรับมือใหม่
jlliagre

18
@jlliagre ส่วนตัวของฉัน "อธิบายว่าทำไมมีแหล่งที่มา" นั้นsourceไม่เพียง แต่อธิบายเพิ่มเติม แต่ดูเหมือนว่าสิ่งอื่นนอกเหนือจากการพิมพ์ผิด ฉันมีคนข้ามช่วงเวลา / จุดเมื่อฉันส่งคำสั่งเทคโนโลยีในอีเมล
Rich Homolka

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
คุณกำลังผสม. / คำสั่งและ ต้นฉบับ source-command เหมือนกับ.-command การใช้. / meh ให้เรียกใช้สคริปต์ / ไบนารีชื่อ meh ในไดเรกทอรีปัจจุบันและไม่เกี่ยวข้องกับซอร์ส / คำสั่ง ตามที่อธิบายไว้ในคำตอบในลิงค์ของคุณ
Joakim Elofsson

2
@JoakimElofsson มันถูกกล่าวถึงในลิงค์ แต่ฉันจะแก้ไขคำตอบเพื่อหลีกเลี่ยงการพลาด โปรดแก้ไขให้ถูกต้อง
ชื้น

3
มันเป็นเรื่องสำคัญที่คำตอบที่ได้รับการยอมรับนั้นชี้ไปที่สิ่งนี้เพราะในขณะที่ฉันคิดว่า./ == source == .
Daniel F

90

การรู้คำสั่ง 'type' มีประโยชน์:

> type source
source is a shell builtin

เมื่อใดก็ตามที่เป็นสิ่งที่เปลือก builtin man bashมันเป็นเวลาที่จะทำ


1
รู้อะไรใหม่ ๆ อยู่เสมอเมื่ออ่านman)

19
นอกจากนี้คุณยังสามารถใช้คือhelp {builtin-name} help source
LawrenceC

1
helpไม่สามารถใช้งานได้ทุกที่ (atleast in zsh) typeทำ.
kumarharsh

4
หากต้องการขยาย: ถ้าคุณใช้ bash และถ้าคุณรู้ (อาจจะผ่าน 'type') มันเป็นคำสั่งในตัว 'ช่วย' จะนำคุณไปยังย่อหน้าของเอกสารที่คุณต้องการโดยไม่ต้องลุย 4,184 บรรทัดของ ' ข้อความของผู้ชายทุบตี
Ron Burk

38

. (จุด) เป็นคำสั่งในตัวของbash shellซึ่งดำเนินการคำสั่งจากไฟล์ที่ส่งเป็นอาร์กิวเมนต์ในเชลล์ปัจจุบัน 'แหล่งที่มา' เป็นคำพ้องความหมายสำหรับ '.'

จากหน้า 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.

27

'source' เป็นรุ่นยาวของ '.' คำสั่ง บน bash prompt เราสามารถทำได้:

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. 

นี่ควรเป็นคำตอบที่ยอมรับได้
Peter Mortensen

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'

ใช่แล้ว Alias ​​ถูกตั้งค่าไว้


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 ได้ไหม
Peter Mortensen

5

พิมพ์คำสั่ง "help source" ในเชลล์ของคุณ

คุณจะได้ผลลัพธ์ดังนี้:

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

จากโครงการเอกสารลินุกซ์, คู่มือการเขียนสคริปต์ทุบตีขั้นสูง,
บทที่ 15 - คำสั่งภายในและ Builtins :

แหล่งที่มา, (คำสั่ง dot):
คำสั่งนี้เมื่อเรียกใช้จากบรรทัดคำสั่งรันสคริปต์ ภายในสคริปต์ชื่อไฟล์ต้นฉบับจะโหลดไฟล์ชื่อไฟล์ การจัดหาไฟล์ (คำสั่ง dot) นำเข้ารหัสลงในสคริปต์ต่อท้ายสคริปต์ (มีผลเหมือนกับ #include directive ในโปรแกรม C) ผลลัพธ์สุทธินั้นเหมือนกับว่าบรรทัดของโค้ด "ที่มา" นั้นมีอยู่ในเนื้อความของสคริปต์ สิ่งนี้มีประโยชน์ในสถานการณ์ที่หลายสคริปต์ใช้ไฟล์ข้อมูลหรือไลบรารีฟังก์ชันทั่วไป
หากไฟล์ที่มานั้นเป็นสคริปต์ที่สามารถเรียกใช้งานได้เองไฟล์นั้นจะถูกเรียกใช้จากนั้นส่งคืนการควบคุมไปยังสคริปต์ที่เรียกมันว่า สคริปต์ที่สามารถเรียกทำงานที่มาอาจใช้การส่งคืนเพื่อจุดประสงค์นี้

ดังนั้นสำหรับผู้ที่คุ้นเคยกับภาษาการเขียนโปรแกรม C การจัดหาไฟล์มีผลคล้ายกับ#includeคำสั่ง

โปรดทราบว่าคุณอาจส่งผ่านข้อโต้แย้งตำแหน่งไปยังไฟล์ที่มีที่มาเช่น:

$ source $filename $arg1 arg2

คำตอบนี้แตกต่างจากคำตอบก่อนหน้า 9 คำตอบอย่างไร
สตีเฟ่น Rauch

2
ฉันเพิ่มแหล่งข้อมูลอื่นและข้อมูลเพิ่มเติมที่ไม่ได้กล่าวถึงก่อนหน้านี้
Alexandro de Oliveira

ฉันไม่รู้ว่าsourceสามารถโต้แย้งหรือใช้งานreturnได้
Joe

2

ควรสังเกตว่าถึงแม้จะเป็นคำสั่งที่ยอดเยี่ยมไม่sourceย่อท้อและแหล่งที่มา.จะมากกว่าหนึ่งไฟล์ความหมาย

source *.sh

หรือ

. script1.sh script2.sh

จะไม่ทำงาน

เราสามารถย้อนกลับมาใช้forลูป แต่มันจะออกปฏิบัติการได้หลายครั้งสร้างหลายคำสั่งหรือปัญหาของมัน

สรุป: sourceไม่ใช้ไฟล์หลายไฟล์เป็นอินพุต อาร์กิวเมนต์ต้องเป็นหนึ่ง

ซึ่งดูด IMHO


0

ด้วยแหล่งที่มาคุณสามารถส่งผ่านตัวแปรหรือฟังก์ชั่นจากไฟล์อื่นไปยังสคริปต์ของคุณและใช้พวกเขาโดยไม่ต้องเขียนอีกครั้ง

FI:

#!/bin/bash

source /etc/environment

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

ไชโย

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.