当您登录 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 help
,source
命令在您当前的 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
来引入它们。
2 条评论