使用 source 命令将函数和变量导入 Bash | Linux 中国
本文字数:3145,阅读时长大约:4分钟
导读:source 就像 Python 的 import 或者 Java 的 include。学习它来扩展你的 Bash 能力。
https://linux.cn/article-12346-1.html
作者:Seth Kenlon
译者:geekpi
source 就像 Python 的 import 或者 Java 的 include。学习它来扩展你的 Bash 能力。
登录 Linux shell 时,你将继承特定的工作环境。对于 shell 而言,“环境”意味着已经为你设置了某些变量,以确保你的命令可以按预期工作。例如,PATH 环境变量定义 shell 从哪里查找命令。没有它,几乎在 Bash 中尝试执行的所有操作都会因“命令未发现” 错误而失败。在执行日常任务时,环境对你几乎是不可见的,但它很重要。
有多种方法可以影响你的 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
下,因此无论你在哪,当你导入它们时,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 导入它们。
via: https://opensource.com/article/20/6/bash-source-command
作者:Seth Kenlon 选题:lujun9972 译者:geekpi 校对:wxy
本文由 LCTT 原创编译,Linux中国 荣誉推出
智能推荐
Hadoop实战(4)_Hadoop的集群管理和资源分配
系列目录: Hadoop实战(1)_阿里云搭建Hadoop2.x的伪分布式环境 Hadoop实战(2)_虚拟机搭建Hadoop的全分布模式 Hadoop实战(3)_虚拟机搭建CDH的全分布模式 DataNode数据目录 如果有多个挂载点,可以有多个DataNode数据目录。 目前服务器硬件,标准小型机配置:32核、64G(128G)、64T(4T*16盘SAS盘)。通常为了提升磁盘吞吐量,每个盘单...
Tornado day02
一,项目模板: Tornado的项目也可以像Django和flask一样,将功能细分为几个模块 1.1 _ _ init _ _.py 1.2 setting .py 1.3 urls .py 1.4 views .py 1.5 manage .py 将这个模板拷贝下来,以后创建新项目的时候可以直接拷贝一份,在此模板上修改使用 文件链接 链接:https://pan.baidu.com/s/11E...
PAT乙级 | 1095 解码PAT准考证 (25分)(做题过程+注意事项+运行超时解决方法)
PAT 准考证号由 4 部分组成: 第 1 位是级别,即 T 代表顶级;A 代表甲级;B 代表乙级; 第 2~4 位是考场编号,范围从 101 到 999; 第 5~10 位是考试日期,格式为年、月、日顺次各占 2 位; 最后 11~13 位是考生编号,范围从 000 到 999。 现给定一系列考生的准考证号和他们的成绩,请你按照要求输出各种统计信息。 输入格式: 输入首先在一行中给出两个正整数 ...
谈谈Java异常
0 概述 对于java工程师来说,是经常和异常打交道的,本文主要来谈一谈java中的异常。 1 异常类的继承关系 从下图(说明:图中只是列出部分异常类)可以看出: 异常的基类为Throwable,主要分为两个分支,即Error体系和Exception体系。 Exception下面分为RuntimeException和非RuntimeException(如IOException) 2 几种异常的区别...
通过设立FatFS隐藏分区,实现系统文件和用户文件的隔离
嘛。。这是一个关于个人使用FatFS文件系统的 一点小的经验。 我知道大家都会百度和谷歌,关于文件系统有什么用,文件系统怎么移植上自己的平台,看看资料也就懂了,在这里不再详述( 打字太慢一分钟50-60字懒得写)。本系列默认已经可以将设备模拟成u盘,并且已经通过修改diskio.c,可以实现ff.c中的各项功能( 不能实现的自行面壁)。FatFS项目官网 http://elm-chan.org/f...
猜你喜欢
Mysql之锁与事务知识要点小结
Mysql之锁与事务 平时的业务中,顶多也就是写写简单的sql,连事务都用的少,对锁这一块的了解就更加欠缺了,之前一个大神分享了下mysql的事务隔离级别,感觉挺有意思的,正好发现一个很棒的博文,然后也收集了一些相关知识,正好来学习下,mysql中锁与事务的神秘面纱,主要内容包括 共享锁和排它锁的区别以及适合范围 mysql的表锁和行锁的区别 怎么判断一个sql是否执行了锁,执行的是表锁还是行锁 ...
响应式图片二 通过srcset实现
具体方法如下: srcset=”图片地址+空格+尺寸描述符,图片地址+空格+尺寸描述符,图片地址+空格+尺寸描述符….” 浏览器会当前浏览的环境进行感知,这个感知包括网速、界面分辨率、DPR(屏幕像素比)等等,然后在图片中选择一个进行加载。 实际上,在相同DPR下,浏览器会根据屏幕的分辨率加载图片,但是加载了大的图片后再缩小还是会使用大的图片。综合考虑的算法非...
Training_model(2)
已经清洗处理了两个数据文件: application_{train|test}.csv :客户详细信息 bureau.csv : 客户历史信用报告 下面对这两个数据中的特征进行合并,然后Light Gradient Boosting Machine训练模型,之前只用客户数据的预测评分结果是0.734,这次加入了客户信用报告信息 load data 新增加了客户历史信用记录 Build Model ...
微信小程序 页面跳转(传参跟不传参)
跳转页面传参 1.首先我的目录结构是这样的,并在 cinema.wxml 定义了一个点击事件 bindtap=‘indetai’ 2.然后在 cinema.js 的data里面定义了一个 score,并实现了 indetai 方法 3.在 detai.js 的 data 里面也定义一个 score ,再在 onLoad 函数里面接收传递过来的值 4.在页面上显示得到的值 这...
JavaSE 10(二维数组)
前言: 在经历了血雨腥风的地狱模式后本以为迎来了学习的平静,但二维数组又打破了这难得的平静!!!二维数组在java编程中同样也是很重要的知识点,因此在这里我将整理二维数组的知识点与重点,以及习题,便于自己的复习与巩固。 二维数组的声明与创建: 下面是声明二维数组的语法: 数据类型[][]数组名 : 数据类型数组名[][]; (允许这种方式 ,但并不推荐使用它...