The source
Linux 中的 command 是一个内置的 shell 命令,用于从文件中读取和执行命令。
这意味着脚本定义的任何变量或函数在脚本执行完成后仍然可用。
现在,让我们开始探索它的功能source
命令。
子 shell 和 Source 命令
当您在 shell 中运行脚本时,subshell通常会生成一个单独的执行进程。
这允许在生成的 shell 中隔离、封装变量和函数,这样它们就不会干扰父环境。
对于 source 命令,shell 在当前 shell 本身中执行脚本。
因此,任何变量、函数或更改都会影响当前环境。
获取不带参数的脚本
让我们考虑一个简单的脚本,script.sh
,内容如下:
#!/bin/bash
var="Hello, World!"
我们可以使用以下命令在当前 shell 中获取此脚本source
命令:
source script.sh
运行命令后,变量var
在当前 shell 中可用。您可以通过运行以下命令来确认这一点:
echo $var
这将输出:
Hello, World!
这表明source
命令已从以下位置导入变量script.sh
进入当前的 shell 环境。
获取文件后运行命令
The -c
or --command
选项允许您在获取指定文件后在当前 shell 中运行命令。
例如,给定script.sh
和以前一样,您可以获取它,然后立即运行命令:
source -c "echo $var" script.sh
这将输出:
Hello, World!
该命令来源script.sh
,然后执行echo $var
在当前外壳中。
即使禁用 dotglob,也允许获取 .file
The -d
or --dot
选项允许获取以点开头的文件,即使dotglob
您的 shell 中禁用了该选项。考虑一个文件.file
:
#!/bin/bash
dot_var="Hidden message!"
您可以按如下方式获取该文件:
source -d .file
Then, echo $dot_var
将输出:
Hidden message!
从 stdin 读取并执行命令
The -s
or --stdin
选项允许您从标准输入 (stdin) 读取和执行命令。您可以按如下方式使用它:
echo "stdin_var='Reading from stdin'" | source -s
Then, echo $stdin_var
将输出:
Reading from stdin
这表明-s
允许我们获取通过管道传递给它的内容。
在获取每个文件之前打印一条消息
The -v
or --verbose
选项在获取每个文件之前打印一条消息。这在调试复杂脚本时非常有用。再考虑一下script.sh
从之前开始,如果我们使用:
source -v script.sh
这将输出:
source script.sh
Hello, World!
它提供一条消息,显示其来源的文件的名称。这允许您跟踪多个源文件的执行。
使用位置参数
获取脚本以将参数传递给脚本时可以使用位置参数。考虑一个脚本greet.sh
:
#!/bin/bash
echo "Hello, $1!"
您可以使用位置参数来获取此脚本,如下所示:
source greet.sh World
这将输出:
Hello, World!
这表明位置参数可以在获取脚本时传递给脚本,类似于脚本正常运行时的传递方式。
使用特殊的 Shell 变量
还可以从源脚本访问特殊的 shell 变量。让我们来创建special.sh
:
#!/bin/bash
echo "Number of parameters: $#"
echo "All parameters: $@"
echo "PID of shell: $$"
现在,来源special.sh
:
source special.sh Hello World
这将输出:
Number of parameters: 2
All parameters: Hello World
PID of shell: 1260
特殊的 shell 变量$#
, $@
, and $$
从源脚本访问并具有通常的含义:分别是参数数量、所有参数和 shell 的 PID。
使用 。 (点)作为源的替代
The .
(点)命令相当于source
在许多贝壳中。为了说明这一点,您可以像这样使用它:
. script.sh
运行此命令后,echo $var
将输出:
Hello, World!
The .
命令提供了更短的替代方案source
,同时提供相同的功能。
源和 之间的区别。在不同的壳里
在 Bourne 衍生的 shell(如 Bash)中,source
and .
是可以互换的。然而,在 C shell (csh) 及其衍生版本中,只有source
命令可用。
此外,有些 shell 无法识别source
作为命令并且只接受.
.
所以一般来说使用比较安全.
为了兼容性。
使用函数获取脚本
就像变量一样,功能在源脚本中定义的也可在当前 shell 中使用。考虑functions.sh
:
#!/bin/bash
function hello() {
echo "Hello, function!"
}
您可以来源functions.sh
然后打电话hello
:
source functions.sh
hello
这将输出:
Hello, function!
取消设置变量和函数
获取脚本后,您可能想要取消设置在该脚本中定义的变量或函数。
您可以使用unset
命令。考虑unset_var
and hello
来自早期的脚本:
unset persist_var
unset -f hello
运行这些命令后,echo $persist_var
and hello
将不返回任何内容,表明变量和函数已被取消设置。
安全脚本采购
获取脚本时,重要的是要考虑脚本将使用当前 shell 的权限执行。
这意味着如果脚本包含有害命令,则可能会造成很大的损害。在获取脚本之前,请务必先检查其内容。
您应该只从可信来源获取脚本。
如果您不确定某个脚本,您可以在子 shell 中运行它,这样它就不会影响父 shell 的环境:
bash script.sh
这会在新的 shell 中运行脚本,不会影响当前 shell 的环境。