使用 source 命令将函数和变量导入 Bash

Source 就像 Python 的 import 或 Java 的 include。学习它来扩展你的 Bash 技能。
302 位读者喜欢这篇文章。
bash logo on green background

Opensource.com

当您登录 Linux shell 时,您会继承一个特定的工作环境。在 shell 的上下文中,环境意味着已经为您设置了某些变量,这确保您的命令按预期工作。例如,PATH 环境变量定义了 shell 在哪里查找命令。如果没有它,您在 Bash 中尝试做的几乎所有事情都会因 command not found 错误而失败。您的环境虽然在您进行日常任务时大多是不可见的,但至关重要。

有很多方法可以影响您的 shell 环境。您可以在配置文件(例如 ~/.bashrc~/.profile)中进行修改,您可以在启动时运行服务,并且您可以创建自己的自定义命令或编写您自己的 Bash 函数

使用 source 添加到您的环境

Bash(以及其他一些 shell)有一个名为 source 的内置命令。这里可能会让人感到困惑:source 执行的功能与命令 . (是的,只是一个点)相同,并且它不是Tcl 命令相同的 source(如果您键入 man source,可能会在屏幕上出现)。事实上,内置的 source 命令根本不在您的 PATH 中。它是一个作为 Bash 一部分包含在内的命令,要获取有关它的更多信息,您可以键入 help source

. 命令是 POSIX 兼容的。source 命令未由 POSIX 定义,但可以与 . 命令互换使用。

根据 Bash helpsource 命令在您当前的 shell 中执行文件。“在您当前的 shell 中”这个子句非常重要,因为它意味着它不会启动子 shell;因此,您使用 source 执行的任何操作都会在您当前的环境中发生并影响您的环境。

在探索 source 如何影响您的环境之前,请在测试文件上尝试 source,以确保它按预期执行代码。首先,创建一个简单的 Bash 脚本并将其另存为名为 hello.sh 的文件

#!/usr/bin/env bash
echo "hello world"

使用 source,即使不设置可执行位,您也可以运行此脚本

$ source hello.sh
hello world

您也可以使用内置的 . 命令获得相同的结果

$ . hello.sh
hello world

source. 命令成功执行了测试文件的内容。

设置变量和导入函数

您可以使用 source 将文件“导入”到您的 shell 环境中,就像您可能在 C 或 C++ 中使用 include 关键字来引用库,或者在 Python 中使用 import 关键字来引入模块一样。这是 source 最常见的用途之一,并且通常在 .bashrc 文件中默认包含 source 一个名为 .bash_aliases 的文件,以便您定义的任何自定义别名在您登录时导入到您的环境中。

这是一个导入 Bash 函数的示例。首先,在名为 myfunctions 的文件中创建一个函数。这将打印您的公共 IP 地址和您的本地 IP 地址

function myip() {
	curl http://icanhazip.com	

	ip addr | grep inet$IP | \
	cut -d"/" -f 1 | \
	grep -v 127\.0 | \
	grep -v \:\:1 | \
	awk '{$1=$1};1'
}

将函数导入您的 shell

$ source myfunctions

测试您的新函数

$ myip
93.184.216.34
inet 192.168.0.23
inet6 fbd4:e85f:49c:2121:ce12:ef79:0e77:59d1
inet 10.8.42.38

搜索 source

当您在 Bash 中使用 source 时,它会在您当前目录中搜索您引用的文件。这并非发生在所有 shell 中,因此如果您不使用 Bash,请查看您的文档。

如果 Bash 找不到要执行的文件,它会改为搜索您的 PATH。同样,这不是所有 shell 的默认设置,因此如果您不使用 Bash,请查看您的文档。

这些都是 Bash 中非常方便的功能。这种行为非常强大,因为它允许您将常用函数存储在驱动器上的集中位置,然后将您的环境视为集成开发环境 (IDE)。您不必担心您的函数存储在哪里,因为您知道它们在您本地等效于 /usr/include 的位置,因此无论您在何处 source 它们,Bash 都会找到它们。

例如,您可以创建一个名为 ~/.local/include 的目录作为常用函数的存储区域,然后将此代码块放入您的 .bashrc 文件中

for i in $HOME/.local/include/*;
  do source $i
done

这会将 ~/.local/include 中包含自定义函数的任何文件“导入”到您的 shell 环境中。

当您使用 source. 命令时,Bash 是唯一会同时搜索当前目录和您的 PATH 的 shell。

使用 source 进行开源

使用 source. 执行文件可能是影响您的环境同时保持更改模块化的一种便捷方式。下次当您考虑将大块代码复制粘贴到您的 .bashrc 文件中时,请考虑将相关函数或别名组放入专用文件中,然后使用 source 来引入它们。

接下来阅读什么

Bash 脚本自动化入门

在本四部分系列文章的第一篇中,了解如何创建简单的 shell 脚本以及为什么它们是自动化任务的最佳方式。

(特约撰稿人)
2019 年 12 月 18 日
Seth Kenlon
Seth Kenlon 是一位 UNIX 极客、自由文化倡导者、独立多媒体艺术家和 D&D 爱好者。他曾在电影和计算机行业工作,经常同时进行。

2 条评论

Seth,这是一篇很棒的文章!您关于 Bash 的系列文章非常有教育意义!

很棒的一篇!谢谢!

© . All rights reserved.