在 $0 和 BASH_SOURCE 之间选择

2023-12-02

一个人如何选择"$0" and "${BASH_SOURCE[0]}"

这段描述来自GNU对我帮助不大。

    BASH_SOURCE
    
 An array variable whose members are the source filenames where the
 corresponding shell function names in the FUNCNAME array variable are
 defined. The shell function ${FUNCNAME[$i]} is defined in the file
 ${BASH_SOURCE[$i]} and called from ${BASH_SOURCE[$i+1]}

Note: For a POSIX-compliant solution, see this answer.

${BASH_SOURCE[0]} (or, more simply, $BASH_SOURCE[1] ) contains the (potentially relative) path of the containing script in all invocation scenarios, notably also when the script is sourced, which is not true for $0.

Furthermore, as Charles Duffy points out, $0 can be set to an arbitrary value by the caller.
On the flip side, $BASH_SOURCE can be empty, if no named file is involved; e.g.:
echo 'echo "[$BASH_SOURCE]"' | bash

下面的例子说明了这一点:

Script foo:

#!/bin/bash
echo "[$0] vs. [${BASH_SOURCE[0]}]"

$ bash ./foo
[./foo] vs. [./foo]

$ ./foo
[./foo] vs. [./foo]

$ . ./foo
[bash] vs. [./foo]

$0是 POSIX shell 规范的一部分,而BASH_SOURCE顾名思义,是 Bash 特有的。


[1] 可选阅读:${BASH_SOURCE[0]} vs. $BASH_SOURCE:

Bash 允许你引用元素0 of an array变量使用scalar记法:代替书写${arr[0]}, 你可以写$arr;换句话说:如果您引用变量就好像它是一个标量,你得到索引处的元素0.

使用此功能掩盖了这样一个事实:$arr是一个数组,这就是流行 shell-code linter 的原因shellcheck.net发出以下警告(截至撰写本文时):

SC2128:扩展没有索引的数组仅给出第一个元素。

旁注:虽然此警告很有帮助,但它可以更准确,因为您不一定会得到firstelement:具体是索引处的元素0返回,因此如果第一个元素具有更高的索引(这在 Bash 中是可能的),您将得到空字符串;尝试a[1]='hi'; echo "$a".
(相比之下,zsh,永远的叛徒,回归all元素作为单个字符串,用第一个字符分隔。存储在$IFS,这是一个space默认情况下)。

由于它的晦涩难懂,您可能会选择避开此功能,但它的工作原理是可以预见的,而且,务实地说,您很少(如果有的话)需要访问索引other than 0数组变量的${BASH_SOURCE[@]}.


可选阅读,第 2 部分:在什么条件下BASH_SOURCE数组变量实际上包含multiple元素?:

BASH_SOURCE只有多个条目如果涉及函数调用,在这种情况下它的元素平行于FUNCNAME包含所有函数名称的数组当前位于调用堆栈上.

也就是说,在一个函数内部,${FUNCNAME[0]}包含执行函数的名称,以及${BASH_SOURCE[0]}包含定义该函数的脚本文件的路径,${FUNCNAME[1]}包含调用当前正在执行的函数的函数名称(如果适用),等等。

如果给定函数是直接从定义该函数的脚本文件中的顶级作用域调用的$i调用堆栈的,${FUNCNAME[$i+1]}包含:

  • main(伪函数名),如果调用脚本文件directly (e.g., ./script)

  • source(伪函数名),如果脚本文件是sourced (e.g. source ./script or . ./script).

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

在 $0 和 BASH_SOURCE 之间选择 的相关文章

  • Bash 循环遍历具有行和列的变量

    经过几个小时的搜索测试不同的解决方案后 我尚未找到可行的解决方案 Bash 和 Shell 脚本不是我的强项 我有一个变量 其中有行 换行 和列 制表符分隔 我想要做的是循环遍历行并获取 Column X 然后将该项目放入变量中 以便我可以
  • bash:使用 scp 检查远程文件是否存在

    我正在编写一个 bash 脚本来将文件从远程服务器复制到本地计算机 我需要检查该文件是否可用 以便在该文件不存在时可以采取替代操作 我知道如何测试本地文件是否存在 但是 使用 scp 会使事情变得有点复杂 常识告诉我 一种方法是无论如何尝试
  • 如何 cd 到 Mac OSX 终端中的别名目录

    有没有办法使用命令 cd 从 shell 进入别名目录 它总是返回 htdocs 不是目录 编辑 我使用操作系统 GUI 创建了快捷方式 gt 右键单击 htdocs 目录并选择 别名 我使用的是德语操作系统 如果它不是别名 也许它在英语中
  • 在同一变量集行中组合多个 bash 参数替换,而不使用任何其他命令[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我想要组合的示例 sVar whoami sVar sVar sVar sVar 1 Output 用户名第一个字符大写 要求 单线
  • Linux Bash - 日期格式

    我的日期格式是 yyyy mm dd hh mm ss 如何检查我的输入 它应该是这样的 bin bash read p Date format yy mm dd HH MM SS input check date Y m d H M S
  • bash 中的 SIGINT 和进程替换

    我发现如果我有类似的东西 usr bin env bash function abort politely echo Aborting politely sleep 5 touch stop trap abort politely SIGI
  • 为什么 bash for 循环出错?

    我正在尝试使用 for 循环运行以下代码 但出现语法错误 请帮忙 输入格式 输入的第一行包含一个整数N 表示整数的个数 下一行包含 N 个空格分隔的整数 它们构成数组 A read n sum 0 for i 1 i lt n i do r
  • $@ 中 args 的 bash 参数大小写

    我有一个带有一长串可选参数的脚本 有些具有相关的值 Such as script first 2012 12 25 last 2012 12 26 copy remove script first 2012 12 25 因此有以下案例陈述
  • SQLPlus 中的运行循环

    我制作了一个 bash 脚本 它通过 SQLPlus 连接到数据库并运行一个包含 For 循环的 SQL 脚本 如下所示 但是一旦运行它 它就会卡在循环的 BEGIN 中 如下所示 我尝试直接通过SQLPlus运行 结果是一样的 那么任何人
  • 当远程(Http)文件更改时如何执行操作?

    我想创建一个脚本 用于检查 URL 并在远程文件的 Last Modified 标头更改时执行操作 下载 解压缩 我考虑过使用curl 获取标头 但随后我必须将其存储在每个文件的某个位置并执行日期比较 有没有人对使用 大部分 标准 UNIX
  • 在詹金斯管道作业中将变量传递给bash脚本

    我有一个 Jenkins 管道作业 其中我使用名为 setup sh 的 bash 脚本配置我的环境 如下所示 bin bash export ARCH 1 echo architecture ARCH 在 Jenkins 管道脚本中 我使
  • 安装heroku toolbelt后出现Ruby错误

    我正在 win 7 32 位系统上使用 Heroku 但我没有管理员权限 我已经下载并安装了heroku工具带如下http community webfaction com questions 11803 heroku toolbelt h
  • awk 在Linux终端中输出类似表格或类似Excel的列?

    我做了一个长管子 最后是 awk print 5 t t 3 t 4 在 Linux 终端中 这些列用选项卡填充 第一列条目具有不同数量的字符 因此第二列结果并不完全垂直 怎样才能让桌子看起来更完美呢 尝试将结果通过管道传输到列 t awk
  • Bash IF:多个条件

    我已经尝试让这件事工作几个小时 但我无法让它工作 if P SFTP a PORT 22 P FTPS PORT 990 a PORT 21 then 有人能帮我吗 我知道多个条件可以这样写 if P SFTP PORT 22 then 但
  • 使用环境变量将参数传递给命令

    我正在尝试编写一个 bash 脚本 该脚本采用环境变量并将其传递给命令 所以如果我有类似的东西 export OUT a arg1 b arg2 0 arg2 1 我想在我的 bash 脚本中执行以下操作
  • PS1 定义中的条件 pwd

    我想显示当前工作目录如果我处于symlink比没有 到目前为止我已经 pwd P pwd echo 1 31m pwd P echo 1 32m pwd 将返回所需的输出 但它不能替代 w在命令提示符下 我尝试用反引号括起来 但这只会导致p
  • 使用sed插入文件内容

    我试图在给定模式之前插入文件内容 这是我的代码 sed i pattern i r scriptPath adapters default permissions xml manifestFile 它添加路径而不是文件的内容 有任何想法吗
  • 为什么 sed 将替换文本放在行首?

    在 Mac OS X bash 上 我在命令行中使用以下 sed sed s S 1 file1 txt gt file2 txt file1 txt有这样的行 some path to somewhere some stuff here
  • 如何仅使用 grep/sed 提取子字符串和数字

    我有一个包含文本和数字的文本文件 我想使用 grep 只提取我需要的数字 例如 给定一个文件如下 miss rate 0 21 ipc 222 stalls n shdmem 112 所以说我只想提取数据miss rate这是0 21 如何
  • 从名称获取 AWS EMR 集群 ID

    AWS CLI 命令aws emr list clusters返回以下 json 有没有一种方法可以通过 bash 或 groovy 使用名称来获取 Id 我不能只使用 ID 因为我正在删除集群并仅使用相同的名称重建它们 所以我知道集群的名

随机推荐

  • 为什么函数在画布中返回错误的颜色?

    我的画布颜色是 50 255 50 155 当我执行代码时 function getClickedAreaColor x y var data ctx getImageData x y 1 1 data color for var i 0
  • ItemSend 事件未触发

    我有一个 Outlook 2007 加载项 VSTO 任何使用 Outlook 发送的邮件都应在此之前进行修改 我用Application ItemSend事件 如果我直接从 Outlook 发送电子邮件 Inspector 或通过 使用的
  • 如何在 Windows Phone 中的计划任务代理上裁剪图像

    我需要使用 ScheduledTaskAgent 裁剪图像 由于它在后台运行 因此在尝试实例化 WriteableBitmap 时出现跨线程异常 因为它需要在 UI 线程中创建 我有一个图像流 如何在不使用 WriteableBitmap
  • 如何捕获 select2 的 Enter 按键

    我有一个国家 地区的 select2 下拉列表 多选 当用户输入关键字时 它会在菜单中显示相关项目 例如 如果用户输入ind 菜单显示India and 印度尼西亚 如果按下 Enter 键 则第一项 India 被选中 这是默认行为 现在
  • Visual Studio 2015 初始化部分 Nuget.PackageManagement.VisualStudio.VSolutionManager 必须在 UI 线程上调用

    在尝试在最近更新的 Visual Studio 2015 14 0 25431 01 Update 3 中构建或打开项目时 我不断收到有关 nuget 包管理的错误 每当我打开 VS 后第一次构建项目时 都会收到以下错误消息 当我尝试打开
  • 在考虑多个条件的方法中返回 null

    考虑以下方法 private static String method String string if string equals conditionOne return value else if string equals condi
  • 如何在 C++ 中可移植地计算 sha1 哈希值?

    目标是计算SHA1作为 C 程序一部分的一个或多个缓冲区的哈希值 我不确定使用 boost 的 UUID 是否会正确地在哈希值中添加前导零 据我所知 您的字符串应该始终具有相同的长度 因此这里是上面示例的简化版本 可以做到这一点 inclu
  • css3 动画停止

    目前我正在制作带有滑块动画的标题 仅限 css3 http jimmytenbrink nl slider 一切工作正常 除了有时从中心向右移动时滑块会出现故障 看来我需要停止动画几毫秒才能完成 然而 我在互联网上到处搜索 但似乎无法让它工
  • 无法访问 Metro 应用中的资产文件

    我正在尝试读取一个文本文件 该文件作为 Metro 应用程序中的资产提供 如果将文件路径指定为 ms appx Assets file txt 我会收到访问被拒绝错误 显然我需要设置一些访问安装位置文件夹的功能 我尝试启用清单设计器中的所有
  • Visual Studio 安装和部署构建失败,没有错误

    我有一个设置和部署项目 在我们的构建服务器上 在摘要中报告以下内容 全部重建 25 成功 2 失败 0 跳过 我不知道失败的两个是什么 但我相信其中之一是 vdproj 项目 因为如果我在没有安装程序的情况下运行构建 则根本不会报告任何错误
  • 如何用PHP下载大文件?

    我花了一周的时间来找到这个问题的正确答案 Right 我的意思是绝对符合现有的网络标准 可靠且性能有效 最后 我找到了解决方案 我在 StackOverflow 上找到的所有内容 在 PHP 中可靠地下载大文件 如何通过PHP脚本下载大文件
  • 使用 Quartz.NET 3.0.3 和简单注入器进行构造函数注入操作方法

    我正在尝试在 Windows 服务中使用 Quartz Net v3 0 3 和简单注入器 我有一个作业类 我想在其下面注入一些依赖项 例如我的记录器 public class JobWorker IJob private ILogger
  • 向按钮添加彩色阴影

    我需要向具有 来自 zeplin 这些属性的按钮添加阴影 这就是设计 我试过这段代码
  • React 中生成器的调用次数超出预期

    我发现生成器似乎被调用两次的行为 下面是一个简单的代码 它从生成器获取一个数字并将其输出到控制台 它期望控制台输出 0 和 1 但实际上输出的是 0 和 2 import useState useEffect from react func
  • <%= 导轨 4 中有一个块

    我正在尝试在助手中使用块 但这给了我这个错误 SyntaxError syntax error unexpected rbout concat green title do to s erbout concat n erb 4254 syn
  • 大多数静态数据流的 CRC 计算

    背景 我有一段内存 1024字节 最后 1020 字节始终相同 前 4 个字节将发生变化 产品的序列号 我需要计算CRC 16 CCITT 0xFFFF 起始 0x1021 掩码 对于整个内存部分 CRC WHOLE 问题 是否可以仅计算前
  • 如何在 XAML 中绑定到静态属性?

    我试图将不同类的静态属性绑定到 TextBlock 的 Text 属性 并且可以使绑定正常工作 但是当静态属性的值发生更改时 Text 属性不会更新 我读过 我无法使用 INotifyPropertyChanged 因为该属性是静态的 并且
  • 导航推送新的根控制器

    我正在尝试将新的根控制器推送到导航堆栈 但使用侧面显示菜单 我的应用程序委托具有以下内容 welcomeViewController MyWelcomeViewController alloc initWithNibName MyWelco
  • ORACLE 中的利斯塔格

    我正在尝试使用 LISTAGG 来获取两列以上 SELECT deptname deptno LISTAGG ename WITHIN GROUP ORDER BY ename AS employees FROM emp GROUP BY
  • 在 $0 和 BASH_SOURCE 之间选择

    一个人如何选择 0 and BASH SOURCE 0 这段描述来自GNU对我帮助不大 BASH SOURCE An array variable whose members are the source filenames where t