Apa yang dilakukan 'sumber'?

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

Itu ada, dan itu bisa dijalankan. Mengapa tidak ada dokumentasi tentang hal itu di Ubuntu? Apa fungsinya? Bagaimana saya bisa menginstal dokumentasi tentangnya?

Andrea Ambu
sumber
54
Anda lupa $ type source source is a shell built-in
bnjmn
2
Shell saya mengembalikan ini $ whatis source source (1) - bash built-in commands, see bash(1). Juga, man sourcebawa saya ke BASH_BUILTINS(1)halaman manual. Ini ada di Fedora btw, tidak tahu mengapa paket-paket debian itu tidak (atau buruk) didokumentasikan.
arielnmz
4
@lesmana, tautan bagus. Itu jawaban terkait merupakan jawaban yang lebih menyeluruh untuk pertanyaan ini.
Scott
5
Coba "sumber bantuan"
Jasser

Jawaban:

469

sourceadalah perintah built-in bash shell yang mengeksekusi konten file yang dilewatkan sebagai argumen, di shell saat ini . Ini memiliki sinonim dalam .(periode).

Sintaksis

. filename [arguments]

source filename [arguments]
Nagul
sumber
8
Apakah sourceperintah khusus bash atau apakah shell lain juga memilikinya? (Saya meminta untuk mendapatkan tag tepat pada pertanyaan ...)
#
2
Afaik, sourcehadir di kulit Bourne dan karenanya mungkin ada di semua keturunannya. en.wikipedia.org/wiki/Bourne_shell . Saya tahu bahwa tidak semua shell memiliki sourceperintah, kurang yakin tentang shell mana yang mengandungnya.
nagul
13
@ Nagul, sourcetidak ada dalam shell Bourne, itu adalah ekstensi GNU yang datang jauh kemudian. Sintaksis asli dan masih portabel (POSIX) adalah menggunakan perintah "dot", yaitu .sebagai gantinya. Saya pribadi tidak pernah menggunakan sourcemengingat lebih lama untuk mengetik dan tidak memiliki nilai tambah. Saya kira tujuan utamanya adalah membuat skrip lebih mudah dibaca untuk pemula.
jlliagre
18
@ jlliagre pribadi saya "jelaskan mengapa memiliki sumber" adalah yang sourcetidak hanya lebih deskriptif, tetapi juga terlihat seperti sesuatu selain kesalahan ketik. Saya memiliki orang yang melewati titik / titik ketika saya mengirim perintah teknologi dalam email.
Rich Homolka
3
Salah satu penggunaan umum untuk perintah ini adalah untuk skrip shell sourcedalam "file konfigurasi" yang sebagian besar berisi tugas variabel. Tugas variabel kemudian mengontrol hal-hal yang dilakukan skrip lainnya. Tentu saja, skrip yang baik akan menetapkan variabel ke default yang masuk akal sebelum source, atau setidaknya memeriksa nilai yang valid.
LawrenceC
276

Hati-hati! ./dan sourceyang tidak persis sama .

  • ./scriptmenjalankan skrip sebagai file yang dapat dieksekusi, meluncurkan shell baru untuk menjalankannya
  • source scriptmembaca dan mengeksekusi perintah dari nama file di lingkungan shell saat ini

Catatan: ./scriptbukan . script, tapi . script==source script

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

basah
sumber
27
Anda mencampuradukkan ./command dan. naskah. source-command sama dengan.-command. Menggunakan ./meh mengatakan jalankan script / binary bernama meh di direktori saat ini, dan tidak ada hubungannya dengan sumber /. -perintah. Seperti dijelaskan dalam jawaban di tautan Anda.
Joakim Elofsson
2
@ JoakimElofsson Disebutkan di tautan, tetapi saya akan mengubah jawaban untuk menghindari kesalahpahaman. Harap perbaiki.
damphat
3
Agak penting bahwa jawaban yang diterima juga menunjuk ke yang ini, karena untuk sesaat saya berpikiran./ == source == .
Daniel F
90

Berguna untuk mengetahui perintah 'type':

> type source
source is a shell builtin

setiap kali sesuatu adalah shell builtin saatnya untuk melakukan man bash.

micans
sumber
1
Selalu tahu sesuatu yang baru saat membaca man)
19
Anda juga dapat menggunakan help {builtin-name}, yaitu help source.
LawrenceC
1
helptidak bekerja di mana-mana (minimal zsh). typetidak.
kumarharsh
4
Untuk memperkuat: jika Anda menggunakan bash, dan jika Anda tahu (mungkin melalui 'type') itu adalah perintah bawaan, maka 'bantuan' akan mengarahkan Anda langsung ke paragraf dokumentasi yang Anda inginkan tanpa mengarungi 4.184 baris ' teks man bash '.
Ron Burk
38

. (a period) adalah perintah built-in bash shell yang mengeksekusi perintah dari file yang diteruskan sebagai argumen, dalam shell saat ini. 'sumber' adalah sinonim untuk '.'

Dari halaman manual 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
sumber
27

'sumber' adalah versi panjang dari '.' perintah. Pada prompt bash, seseorang dapat melakukannya:

source ~/.bashrc

untuk memuat ulang pengaturan bash Anda (diubah?) untuk bash yang sedang berjalan.

Versi singkatnya adalah:

. ~/.bashrc

Halaman manual:

. 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 shopt
    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
sumber
Ini harus menjadi jawaban yang diterima.
Peter Mortensen
25

sourceperintah mengeksekusi skrip yang disediakan (izin yang dapat dieksekusi tidak wajib ) di lingkungan shell saat ini , sementara ./mengeksekusi skrip yang dapat dieksekusi yang disediakan di shell baru .

sourceperintah memang memiliki sinonim . filename.

Untuk membuatnya lebih jelas, lihat skrip berikut, yang mengatur alias.

membuat alias

#! /bin/bash

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

Sekarang kita memiliki dua pilihan untuk menjalankan skrip ini. Tetapi dengan hanya satu opsi, alias yang diinginkan untuk shell saat ini dapat dibuat di antara dua opsi ini.

Pilihan 1: ./make_alias

Jadikan skrip dapat dieksekusi terlebih dahulu.

chmod +x make_alias

Menjalankan

./make_alias

Memeriksa

alias

Keluaran

**nothing**

Aduh! Alias ​​pergi dengan shell baru.

Mari kita pergi dengan opsi kedua.

Pilihan 2: source make_alias

Menjalankan

source make_alias

atau

. make_alias

Memeriksa

alias

Keluaran

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

Ya Alias ​​sudah diatur.

Harsh Vakharia
sumber
10

Jika ragu, hal terbaik yang harus dilakukan adalah menggunakan infoperintah:

[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
sumber
Bisakah Anda memberikan lebih dari sekadar RTFM?
Peter Mortensen
5

Ketikkan perintah "sumber bantuan" di shell Anda.

Anda akan mendapatkan output seperti ini:

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
sumber
4

Dari Proyek Dokumentasi Linux, Panduan Script Advanced Bash,
Bab 15 - Perintah dan Bangun Internal :

sumber , . (titik perintah):
Perintah ini, ketika dipanggil dari baris perintah, mengeksekusi skrip. Di dalam skrip, nama file sumber memuat nama file file. Sumber file (dot-command) mengimpor kode ke dalam skrip, menambahkan ke skrip (efek yang sama dengan arahan #include dalam program C). Hasil bersihnya sama seperti jika baris kode "bersumber" secara fisik ada di badan skrip. Ini berguna dalam situasi ketika banyak skrip menggunakan file data umum atau pustaka fungsi.
Jika file bersumber itu sendiri merupakan skrip yang dapat dieksekusi, maka itu akan berjalan, lalu kembali kontrol ke skrip yang memanggilnya. Skrip yang dapat dieksekusi bersumber dapat menggunakan pengembalian untuk tujuan ini.

Jadi, bagi mereka yang akrab dengan bahasa pemrograman C, sumber file memiliki efek yang mirip dengan #includearahan.

Perhatikan juga bahwa Anda dapat memberikan argumen posisi ke file yang sedang dibuat, seperti:

$ source $filename $arg1 arg2
Alexandro de Oliveira
sumber
Apa perbedaan jawaban ini dengan 9 jawaban sebelumnya?
Stephen Rauch
2
Saya menambahkan sumber informasi lain dan informasi tambahan yang tidak disebutkan sebelumnya.
Alexandro de Oliveira
Saya tidak tahu apakah sourcebisa mengambil argumen atau menggunakan return.
Joe
2

Perlu dicatat bahwa walaupun menjadi perintah yang luar biasa, baik sourcesteno atau tidaknya .akan sumber lebih dari satu file, artinya

source *.sh

atau

. script1.sh script2.sh

tidak akan bekerja

Kita bisa mundur menggunakan forloop, tetapi itu akan mengeluarkan eksekusi berkali-kali, menciptakan banyak perintah atau mengeluarkannya.

Kesimpulan: sourcetidak mengambil banyak file sebagai input. Argumennya harus satu.

Yang menyebalkan IMHO.

Peter Mortensen
sumber
0

Dengan sumber Anda dapat mengirimkan variabel atau fungsi dari file lain ke skrip Anda dan menggunakannya tanpa harus menulisnya lagi.

FI:

#!/bin/bash

source /etc/environment

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

Tepuk tangan

DimiDak
sumber