題 “來源”做什麼?


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

它存在,並且可以運行。為什麼在Ubuntu中沒有關於它的文檔? 它有什麼作用?如何安裝有關它的文檔?


505
2017-09-24 10:35


起源


有關: superuser.com/questions/176783/... - lesmana
你忘了 $ type source  source is a shell built-in - bnjmn
我的shell返回了這個 $ whatis source  source (1) - bash built-in commands, see bash(1)。也, man source 把我帶到了 BASH_BUILTINS(1) 手冊頁。這是在Fedora btw上,不知道為什麼那些debian軟件包是非(或嚴重) - 文檔。 - arielnmz
@lesmana,很棒的鏈接。那 相關答案 是這個問題的更徹底的答案。 - Scott
試試“幫助來源” - Jasser


答案:


source 是一個bash shell內置命令,它執行作為參數傳遞的文件的內容, 在當前的shell中。它有一個同義詞 . (期)。

句法

. filename [arguments]

source filename [arguments]

416
2017-09-24 10:47



是 source bash特定命令還是其他shell也有它? (我要求在問題上得到標籤......) - Jonik
據我所知, source 存在於Bourne shell中,因此可能存在於其所有後代中。 en.wikipedia.org/wiki/Bourne_shell。我知道並非所有砲彈都有 source 命令,不太確定哪些shell確實包含它。 - nagul
@nagul, source 在Bourne shell中沒有出現,它是一個GNU擴展,後來出現了很久。原始且仍然可移植的語法(POSIX)是使用“點”命令,即 . 代替。我個人從不使用 source 鑑於它打字的時間更長,沒有附加價值。我想它的主要目的是讓新手的腳本更具可讀性。 - jlliagre
@jlliagre我的個人“解釋為什麼有源”就是這樣 source 不僅更具描述性,而且看起來像拼寫錯誤之外的東西。當我通過電子郵件發送技術命令時,我讓人們跳過句點/點。 - Rich Homolka
此命令的一個常見用途是shell腳本 source 在“配置文件”中,主要包含變量賦值。然後,變量賦值控制腳本的其餘部分。當然,一個好的腳本會在變量之前將變量設置為合理的默認值 source,或至少檢查有效值。 - LawrenceC


小心! ./ 和 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


240
2017-07-11 13:24



你混淆了./command和。腳本。 source-command與。-command相同。使用./meh表示在當前目錄中運行腳本/二進製文件名為meh,與source /無關。 -命令。正如您的鏈接中的答案所述。 - Joakim Elofsson
@JoakimElofsson在鏈接中提到,但我會修改答案以避免誤解。請更正。 - damphat
最佳答案。謝謝! - JedatKinports
接受的答案也指向了這一點,這一點很重要,因為我想了一下 ./ == source == . - Daniel F


知道'type'命令很有用:

> type source
source is a shell builtin

什麼東西都是內置的shell,現在是時候了 man bash


82
2018-01-09 15:45



閱讀時總是知道新的東西 man )
你也可以使用 help {builtin-name},即 help source。 - LawrenceC
help 到處都不起作用(至少在zsh中)。 type 確實。 - kumar_harsh
要放大:如果你正在使用bash,並且如果你知道(也許是通過'type')它是一個內置命令,那麼'help'將直接到達你想要的文檔段落而不涉及4,184行'男人bash'文字。 - Ron Burk


。 (一個時期)是一個 bash shell內置命令 在當前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.

34
2017-09-24 10:48





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

20
2017-09-24 10:46



這應該是公認的答案。 - Peter Mortensen


source 命令執行提供的腳本 (可執行權限是 不是強制性的 在裡面 當前 shell環境,而 ./ 執行提供的 可執行 腳本在  貝殼。

source 命令確實有一個同義詞 . filename

為了更清楚,請查看以下腳本,該腳本設置別名。

make_alias

#! /bin/bash

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

現在我們有兩個選擇來執行這個腳本。但隨著 只要 一個選項,可以在這兩個選項中創建當前shell的所需別名。

選項1: ./make_alias

首先使腳本可執行。

chmod +x make_alias

執行

./make_alias

校驗

alias

產量

**nothing**

哎呦! Alias與新shell一起消失了。

我們選擇第二種選擇。

選項2: source make_alias

執行

source make_alias

要么

. make_alias

校驗

alias

產量

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

是啊 別名已設置。


17
2018-03-27 13:57





如果有疑問,最好的辦法是使用 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.

5
2017-11-11 05:44



你能提供的不僅僅是RTFM嗎? - Peter Mortensen


在shell中鍵入命令“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.

3
2017-09-19 14:14





從Linux Documentation Project,Advanced Bash Scripting Guide,
第15章 - 內部命令和內置

資源 (點命令):
  從命令行調用此命令時,將執行腳本。在腳本中,源文件名加載文件文件名。獲取文件(dot-command)將代碼導入腳本,附加到腳本(與C程序中的#include指令相同)。最終結果與“源”代碼行實際存在於腳本正文中的情況相同。這在多個腳本使用公共數據文件或函數庫的情況下非常有用。
如果源文件本身是可執行腳本,則它將運行,然後將控制權返回給調用它的腳本。源代碼可執行腳本可以為此目的使用返回。

因此,對於熟悉C編程語言的人來說,獲取文件的效果類似於 #include 指示。

另請注意,您可以將位置參數傳遞給源文件,例如:

$ source $filename $arg1 arg2

2
2018-06-12 00:13



這個答案與之前的9個答案有何不同? - Stephen Rauch
我添加了另一個未提及的信息來源和其他信息。 - Alexandro de Oliveira