使用 source 命令在 Linux 中获取脚本

2023-10-22

The sourceLinux 中的 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 的环境。

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 source 命令在 Linux 中获取脚本 的相关文章

  • 何时用引号将 shell 变量括起来?

    我应该或不应该在 shell 脚本中用引号括住变量吗 例如 下列说法正确的是 xdg open URL eq 2 or xdg open URL eq 2 如果是这样 为什么 一般规则 如果它可以为空或包含空格 或实际上任何空格 或特殊字符
  • 如何通过ssh获取远程命令的退出代码

    我正在通过 ssh 从远程计算机运行脚本 ssh some cmd my script 现在 我想在本地计算机上存储 shell 脚本的退出状态 我该怎么做 假设没有任何问题ssh其本身 其退出状态是在远程主机上执行的最后一个命令的退出状态
  • PIL 的 Image.show() 带来*两个*不同的查看器

    在 python shell 中处理图像时 我使用 image show 其中 image 是 Image 的实例 很久以前什么也没发生 但在定义了一个名为 xv 的 Mirage 符号链接后 我很高兴 最近几天 show 将显示 Imag
  • 如何将一个文本文件拆分为多个 *.txt 文件?

    我有一个文本文件file txt 12 MB 包含 something1 something2 something3 something4 有没有办法分开file txt分成 12 个 txt 文件 比方说file2 txt file3 t
  • 任何退出 bash 脚本但不退出终端的方法

    当我使用exitshell 脚本中的命令 该脚本将终止终端 提示符 有什么方法可以终止脚本然后停留在终端中吗 我的剧本run sh预计通过直接获取或从另一个脚本获取来执行 编辑 更具体地说 有两个脚本run2 sh as run sh ec
  • 在本地主机上使用相同的 IP 和端口创建套接字

    我在 Linux 上看到奇怪的行为 我看到远程端和本地端都显示相同的 IP 和端口组合 以下是 netstat 输出 netstat anp 网络统计grep 6102 tcp 0 0 139 185 44 123 61020 0 0 0
  • 使用脚本检查 git 分支是否领先于另一个分支

    I have branch1 and branch2我想要某种 git branch1 isahead branch2 这将显示如果branch1已承诺branch2没有 也可能指定这些提交 我无法检查差异原因branch2 is在之前br
  • Vagrant 遇到问题 - “404 - 未找到”

    我正在尝试使用 Vagrant 制作一个 LAMP 盒子 有人告诉我它使用起来非常简单 我对网络和虚拟机完全陌生 对 Linux Ubuntu 的经验也很少 我目前已尝试按照官方文档页面上的教程进行操作 http docs vagrantu
  • Bash:将字符串添加到文件末尾而不换行

    如何将字符串添加到文件末尾而不换行 例如 如果我使用 gt gt 它将添加到文件末尾并换行 cat list txt yourText1 root host 37 echo yourText2 gt gt list txt root hos
  • Linux shell 从用户输入中获取设备 ID

    我正在为一个程序编写安装脚本 该程序需要在其配置中使用 lsusb 的设备 ID 因此我正在考虑执行以下操作 usblist lsusb put the list into a array for each line use the arr
  • LINUX:如何锁定内存中进程的页面

    我有一个 LINUX 服务器 运行一个具有大量内存占用的进程 某种数据库引擎 该进程分配的内存太大 需要将其中一部分换出 换出 我想做的是将所有其他进程 或正在运行的进程的子集 的内存页面锁定在内存中 以便只有数据库进程的页面被换出 例如
  • Linux无法删除文件

    当我找到文件时 我在删除它们时遇到问题 任务 必须找到带有空格的文件并将其删除 我的尝试 rm find L root grep i 但我有错误 rm cannot remove root test No such file or dire
  • 如何在 Linux 上通过 FTP 递归下载文件夹 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话 但却具有历史意义 目前不接受新的答案
  • awk 在循环中使用时不打印任何内容[重复]

    这个问题在这里已经有答案了 我有一堆使用 file 1 a 1 txt 格式的文件 如下所示 A 1 B 2 C 3 D 4 并使用以下命令添加包含每个文件名称的新列 awk print FILENAME NF t 0 file 1 a 1
  • 在 docker 中重定向命令输出

    我想为我的服务器做一些简单的日志记录 它是一个在 Docker 容器中运行的小型 Flask 应用程序 这是 Dockerfile Dockerfile FROM dreen flask MAINTAINER dreen WORKDIR s
  • Linux 中 m 标志和 o 标志将存储在哪里

    我想知道最近收到的路由器通告的 m 标志和 o 标志的值 从内核源代码中我知道存储了 m 标志和 o 标志 Remember the managed otherconf flags from most recently received R
  • 如何使用 JSch 将多行命令输出存储到变量中

    所以 我有一段很好的代码 我很难理解 它允许我向我的服务器发送命令 并获得一行响应 该代码有效 但我想从服务器返回多行 主要类是 JSch jSch new JSch MyUserInfo ui new MyUserInfo String
  • 在 C 中使用单个消息队列是否可以实现双向通信

    我希望服务器向客户端发送一些消息 并让客户端确认它 我被分配了这个任务 我可以在 C linux 中使用单个消息队列来完成它还是我需要创建两个 谢谢 是的 可以使用 sysV 消息队列来做到这一点 从您之前的问题来看 您正在使用该队列 您可
  • 调用 printf 系统子例程在汇编代码中输出整数错误[重复]

    这个问题在这里已经有答案了 来回 在windows7控制台窗口中运行gcc s2 asm 然后生成一个exe文件 运行a exe 然后崩溃 为什么 s2 asm 代码由以下源代码生成 int m m 1 iprint m s2 asm请参考
  • 通过 Visual Studio 2017 使用远程调试时 Linux 控制台输出在哪里?

    我的Visual Studio 2017 VS2017 成功连接Linux系统 代码如下 include

随机推荐

  • 如何通过 PPA 在 Ubuntu 18.04 和 16.04 上安装 MongoDB 4.4

    MongoDB 是一个完全灵活的索引支持和丰富的查询数据库 Mongodb 是一个 NoSQL 数据库 MongoDB 通过 GridFS 提供大型媒体存储 点击here有关此版本 MongoDB 的更多详细信息 本教程将帮助您在 Ubun
  • 如何在 Ubuntu 18.04 和 16.04 LTS 上安装 Webmin

    Webmin是一个类似于 CPanel 的网络托管控制面板 它提供了易于使用的界面来管理类 Unix 系统 Webmin 非常易于使用 轻量级应用程序可以在一分钟内轻松安装到系统上 Webmin 删除了所有通过命令行完成的手动任务 本文将帮
  • 如何检查 OpenSSH 版本

    OpenSSH是一个安全的网络实用程序 用于使用 SSH 协议进行远程登录 这是大多数基于 Linux 的系统用于远程 SSH 登录的主要工具 OpenSSH 为您提供通过 SSH 协议连接远程系统的选项 它提供了两个系统之间通信的端到端加
  • 如何在 CentOS/RHEL 9/8/7 上安装 NRPE

    NRPE Nagios Remote Plugin Executor 是一个 Nagios 插件 用于在远程主机上远程执行插件和脚本 这允许您监视远程主机上的资源 例如磁盘使用情况 CPU 负载和网络活动 在本文中 我们将向您展示如何在 C
  • 如何在 Ubuntu 20.04 中安装 PostgreSQL 和 pgAdmin4

    PostgreSQL是一个强大 可靠 健壮且开源的对象关系数据库系统 该数据库系统的最新版本是 PostgreSQL 13 2 而版本 12 6 11 11 10 16 9 6 21 和 9 5 25 仍在定期更新 本教程介绍如何在 Ubu
  • 如何在 Ubuntu 和 Debian 中切换 Python 版本

    Python 是一种高级编程语言 广泛用于系统编程 它适用于所有流行的操作系统 您可以在单个系统上安装多个 Python 版本 安装多个 Python 版本后 您可以使用 update alternatives 工具切换默认 Python
  • 如何在 CentOS 7 上安装和使用 Docker

    Docker 是一种容器化技术 可让您快速构建 测试和部署应用程序 作为可移植 自给自足的容器 几乎可以在任何地方运行 在本教程中 我们将介绍如何在 CentOS 7 上安装 Docker CE 并探索基本的 Docker 概念和命令 先决
  • 如何在 CentOS 8 上安装 CouchDB

    Apache CouchDB 是由 Apache 软件基金会开发的免费开源 NoSQL 数据库 它可以用作单节点或集群数据库 CouchDB 服务器将其数据存储在命名数据库中 其中包含具有以下内容的文档JSON结构 每个文档由许多字段和附件
  • 如何在 Ubuntu 20.04 上安装 Kvm

    KVM 基于内核的虚拟机 是内置于 Linux 内核中的开源虚拟化技术 使用 KVM 运行多个 Linux 或 Windows 来宾虚拟机 每个来宾都与其他来宾完全隔离 并拥有自己的操作系统和专用虚拟硬件 例如 CPU 内存 网络接口和存储
  • 如何在 Ubuntu 20.04 上安装 OpenCV

    OpenCV 开源计算机视觉库 是一个开源计算机视觉库 绑定了 C Python 和 Java 并支持所有主要操作系统 它可以利用多核处理并具有 GPU 加速功能来实现实时操作 OpenCV 的应用范围很广 包括医学图像分析 拼接街景图像
  • 如何在 Debian 10 Linux 上添加交换空间

    交换空间是磁盘上的空间 当物理内存已满时使用 当 Linux 系统耗尽 RAM 时 非活动页面将从 RAM 移至交换空间 交换空间可以采用专用交换分区或交换文件的形式 通常 运行 Debian 虚拟机时不存在交换分区 因此唯一的选择是创建交
  • 如何在 CentOS 8 上安装 Apache Maven

    Apache Maven 是一个开源项目管理和理解工具 主要用于 Java 项目 Maven 使用项目对象模型 POM 它本质上是一个 XML 文件 其中包含有关项目 配置详细信息 项目依赖项等的信息 在本教程中 我们将解释如何在 Cent
  • 如何在 Ubuntu 18.04 上安装 TensorFlow

    TensorFlow是由 Google 构建的免费开源机器学习平台 许多组织都在使用它 包括 Twitter PayPal 英特尔 联想和空中客车公司 TensorFlow 可以在 Python 虚拟环境中安装在系统范围内 作为Docker
  • Linux 中的 Chattr 命令(文件属性)

    在 Linux 中 文件属性是描述文件行为的元数据属性 例如 属性可以指示文件是否被压缩或指定文件是否可以被删除 一些属性 如不变性 可以设置或清除 而其他属性 如加密 是只读的 只能查看 对某些属性的支持取决于所使用的文件系统 本文介绍了
  • 在Ubuntu上安装RPM包

    Ubuntu 存储库包含数千个 deb 软件包 可以从 Ubuntu 软件中心或使用apt命令行实用程序 Deb 是所有基于 Debian 的发行版 包括 Ubuntu 都使用的安装包格式 有些软件包在标准 Ubuntu 存储库中不可用 但
  • 如何检查PHP版本

    PHP 是最常用的服务器端编程语言之一 PHP 版本之间存在一些重要差异 因此在某些情况下可能需要了解您的服务器上运行的是哪个版本 例如 如果您在开始安装之前升级应用程序或安装需要特定 PHP 版本的新应用程序 则需要找出 PHP 服务器的
  • 如何在 Debian 10 Linux 上安装 Google Chrome 网络浏览器

    谷歌浏览器是世界上最流行的网络浏览器 它是专为现代网络打造的快速 直观且安全的浏览器 Chrome 不是开源浏览器 并且不包含在官方 Debian 存储库中 它是基于Chromium 一个开源浏览器 可在默认 Debian Buster 存
  • 如何在 Ubuntu 中将用户添加到 Sudoers

    sudo是一个命令行程序 允许受信任的用户以 root 或其他用户身份执行命令 在本文中 我们将向您展示两种向用户授予 sudo 权限的方法 第一个是将用户添加到sudoers 文件 该文件包含控制向哪些用户和组授予 sudo 权限以及权限
  • 检查 gzip 文件而不解压缩:zcat、zless 和 zmore

    Linux 提供了多个用于处理压缩文件的命令 例如 zcat zless 和 zmore 本教程将深入探讨这些命令的用法 让您可以导航和检查压缩文件 而无需解压缩它们 下表总结了这 3 种工具之间的差异 Tool Description P
  • 使用 source 命令在 Linux 中获取脚本

    The sourceLinux 中的 command 是一个内置的 shell 命令 用于从文件中读取和执行命令 这意味着脚本定义的任何变量或函数在脚本执行完成后仍然可用 现在 让我们开始探索它的功能source命令 目录 hide 1 子