回归:导出的 Bash 函数在经过另一个过程后丢失

2023-12-03

从 Ubuntu 14.04 迁移到 16.04 时,我注意到我的几个 Bash 脚本由于缺少导出函数而失败。我想知道这是否与修复有关炮弹休克虫,尽管我只是简单地export -f函数,而不依赖于 Bash 内部函数表示。仅当中间有另一个进程时,故障才不会发生在直接 Bash 子 shell 中。例如,Bash 调用 awk / Perl / Vim 调用另一个 Bash。下面是一个 Perl 的例子:

Good

$ foo() { echo "foobar"; }
$ export -f foo
$ export -f; foo
foo ()
{
    echo "foobar"
}
declare -fx foo
foobar
$ bash -c "export -f; foo"
foo ()
{
    echo "foobar"
}
declare -fx foo
foobar
$ perl -e 'system("bash -c \"export -f; foo\"")'
foo ()
{
    echo "foobar"
}
declare -fx foo
foobar
$ echo $BASH_VERSION
4.3.11(1)-release

Bad

$ foo() { echo "foobar"; }
$ export -f foo
$ export -f; foo
foo ()
{
    echo "foobar"
}
declare -fx foo
foobar
$ bash -c "export -f; foo"
foo ()
{
    echo "foobar"
}
declare -fx foo
foobar
$ perl -e 'system("bash -c \"export -f; foo\"")'
bash: foo: command not found
$ echo $BASH_VERSION
4.3.42(1)-release

我做错了什么,还是这是一个错误?

Edit:@chepner 指出 Bash 使用专门命名的 shell 标识符来存储函数。当经过dash(0.5.8-2.1ubuntu2,与 0.5.7-4ubuntu1 一起使用),这些标识符将被删除。和ksh,他们还活着。我检查过

$ dash
$ sudo strings /proc/$$/environ | grep foo # Still passed from Bash to Dash
BASH_FUNC_foo%%=() {  echo "foobar"
$ bash
$ sudo strings /proc/$$/environ | grep foo # But went missing from Dash to Bash
$ exit
$ exit
$ ksh
$ sudo strings /proc/$$/environ | grep foo
BASH_FUNC_foo%%=() {  echo "foobar"
$ bash
$ sudo strings /proc/$$/environ | grep foo # Kept from Ksh to Bash
BASH_FUNC_foo%%=() {  echo "foobar"

同样,Vim 的行为可以通过以下方式改变:set shell=/bin/bash / :set shell=/bin/ksh

So, is dash惹的祸?!


长话短说:已知dash问题;灰色区域,可能是固定的;最好不要依赖在非 bash 父级中幸存的导出。

这是由 dash 0.5.8 的变化引起的; cp。dash 从环境中删除导出的 bash 函数.

对于这个问题是否会得到解决,目前尚未达成共识。 POSIX 似乎允许剥离无效的环境条目,其他(更晦涩的)shell 显然也这样做,但它会在各种应用程序中引起问题,特别是因为/bin/sh符号链接到dash(因此也是 Ubuntu 中的默认 shell)。


我的个人用例是我放入我的一些简短的实用函数~/.profile,我在一些 shell 脚本中引用了它。其中之一以自动启动的方式运行Conky守护进程,并且该守护进程错过了这些功能,因为自动启动是通过dash。我可以解决这个问题。这FPATHKorn shell 的自动加载机制在 Bash 中也很不错......

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

回归:导出的 Bash 函数在经过另一个过程后丢失 的相关文章

  • 验证 BASH 脚本时出现问题 [已关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我在尝试验证 bash 脚本时出现代码 lint 错误 bin bash if eq 0 then printf No argum
  • 在bash中将两个变量相除

    我试图在 bash 中划分两个 var 这就是我得到的 var1 3 var2 4 echo var1 var2 我总是遇到语法错误 有谁知道出了什么问题吗 shell 解析仅对整数除法有用 var1 8 var2 4 echo var1
  • 为什么我不能在 while 循环内评估?

    我想在循环中创建 bash 别名 其中循环从命令读取行 为了逐行读取输出 我相信我需要将输出通过管道传输到read 然而 当我这样做时 别名不存在 如果我将以下内容包含在我的 bashrc for x in a1 a2 do eval al
  • 远程 ssh 命令:第一个回显输出丢失

    我试图通过 ssh 1 liner 调用在远程机器上运行多个命令 方法是将它们指定为传递给 bash c 的分号分隔字符串 它适用于某些情况 但不适用于其他情况 看一下这个 Note the echo 1 output is lost ba
  • 在 bash 函数中生成后台进程

    我正在编写一个 Bash 函数来启动需要从某个文件夹启动的服务器 但我不希望启动该服务器影响我当前的工作 我写了以下内容 function startsrv pushd cd TRUNK SERVERCOMMAND popd 我的变量都已设
  • 如何替换每行中出现的所有字符串?

    我想在以下脚本中将所有出现的 用户名 替换为 但它仅替换第一次出现的情况 ls al sed s username 这就是 sed 默认情况下的工作方式吗 提前致谢 你需要g 全局 修饰符 sed s username g
  • 如何摆脱每个新终端会话上运行的某些内容?

    我正在使用狮子 我在每个新的终端会话上都会输出一个错误 bash rvm add to path command not found 这是一个几乎全新的用户帐户 RVM 安装在计算机上的另一个帐户上 bashrc 和 bash profil
  • 如何从脚本向 sudo 提供密码?

    请注意 这是在我的本地计算机上运行的来宾虚拟机 VBox 我不担心安全性 我正在编写一个将在 Linux Ubuntu VM 上执行的脚本myuser用户 该脚本将在下面创建一个非常大的目录树 etc myapp 目前我必须手动完成所有这些
  • -bash: gulp: 在 Mac 中找不到命令

    我尝试在 mac 中安装 gulp 如下所示 Is iMac itop npm root Users itop node modules Is iMac itop npm config set prefix usr local Is iMa
  • Bash 完成脚本在某些参数选项后完成文件路径

    我正在为命令行工具编写 bash 完成脚本 plink local cur prev opts COMPREPLY cur COMP WORDS COMP CWORD prev COMP WORDS COMP CWORD 1 opts 1
  • 按行号和列号对文件进行子集化

    我们想要按行和列对文本文件进行子集化 其中行数和列数是从文件中读取的 不包括标题 第 1 行 和行名称 第 1 列 输入文件 txt制表符分隔的文本文件 header 62 9 3 54 6 1 25 1 2 3 4 5 6 96 1 1
  • 将所有脚本参数复制到另一个变量

    我需要复制所有脚本参数并将它们传递给另一个脚本 我尝试这样做 args printargs sh args echo printargs sh args 但在这种情况下 如果我使用包含空格的参数调用我的父脚本 例如 script sh ar
  • 从重定向到日志文件的程序输出中删除进度条

    我正在运行一个程序 它会输出进度条 我是这样做的 python train py tee train log The train log看起来像下面这样 这是1号线 Training 这是2号线 000 valid 100 2630 263
  • 变量作为 bash 数组索引?

    bin bash set x array counter 0 array value 1 array 0 0 0 for number in array do array array counter array value array co
  • shell 脚本:错误的解释器:使用 pwd 时没有这样的文件或目录

    我想用 for 循环遍历目录中的文件 但这出现了 echo bad interpreter No such file or directory code bin bash count 0 dir pwd echo dir FILES ls
  • 将终端颜色扩展到行尾

    我有一个生成 motd 的 bash 脚本 问题取决于某些终端设置 我不确定颜色是否会延伸到行尾 其他时候则不然 e g v s IIRC 一个只是普通的 gnome 终端 另一个是我的 tmux 术语 所以我的问题是如何才能将其扩展到 8
  • 使用Sed查找并替换json字段

    我有一组 json 文件 其中在最后一个键值对之后有需要替换的逗号 RepetitionTime 0 72 TaskName WM Manufacturer Siemens ManufacturerModelName Skyra Magne
  • 如何在 mac 中使用“getopt”命令让 bash 处理长参数?

    我想让我的 bash 脚本处理长参数 我发现getopt 但 OS X 不支持它 谁能告诉我为什么getoptBSD 实现了 GNU 没有实现 我尝试构建getopt在 GNU C lib 中 但由于我对 Linux 的技能不佳而失败了 有
  • MP4 到 DASH(bash 脚本)

    我有一个网站 用户可以在其中上传视频文件 我想使用 DASH 流式传输所有内容以获得自适应比特率流式传输 因此 我编写了一个 bash 脚本 由 cron 运行 将所有 mp4 文件转换为 DASH 但它无法正常工作 出了什么问题 例如 使
  • bash 自动完成:添加可能完成的描述

    是否可以使 bash 自动完成功能看起来像 Cisco IOS shell 中一样 我的意思是为每个完成添加简短的描述 如下所示 telnet 10 10 10 TAB Pressed 10 10 10 10 routerA 10 10 1

随机推荐

  • 如何使用基于声明的授权保护asp.net core 2.1中的静态文件夹

    我有一个使用 asp net core 2 1 的小项目 我希望保护充满静态资产的文件夹 我尝试实现的是基于这篇文章https odetocode com blogs scott archive 2015 10 06 authorizati
  • 解决为什么 PrintWindow 为空白的问题

    我正在尝试使用 PrintWindow 捕获非活动窗口的屏幕截图 它适用于计算器和捕获 Google Chrome 但对于其他一些应用程序 例如游戏 它可以节省白色区域 PrintWindow 失败的原因可能是什么以及如何验证它们 编辑 我
  • CSS 模块的服务器端渲染

    我将导入样式CSS模块并使其与服务器端渲染一起使用 我尝试了以下方法 但每种方法都有其自己的警告 最好的方法是什么require style scss 是否有副作用 使用css 模块 require hook 优势 易于配置 您只需在服务器
  • 如何使用 c++ 11 使函数在所需的周期执行

    我想使用c 11来实现类似windows API的功能SetTimer 就像 每2秒做某事 假设你想让这个函数每 2 秒执行一次 void foo cout lt lt Hello from foo lt lt endl 您可以提供一个简单
  • Django:如何将 STATIC_URL 设为空?

    是的 我希望它像 Flask 框架一样工作 在那里我可以设置如下参数 static folder os getcwd static static url path 以及其中的所有文件 static files blabla bla可以通过以
  • Entity Framework Code First 和 SQL Server 2012 序列

    我正在实施数据库审计跟踪 通过 Web API 项目中的控制器执行的 CRUD 操作将序列化旧的和新的 poco 并存储它们的值以供以后检索 历史 回滚等 当我让一切正常工作时 我不喜欢它在 POST 期间让我的控制器看起来如何 因为我最终
  • cordova.file.*(所有目录)为空

    我正在从事 Ionic 移动应用程序开发 我的要求是创建客户端记录器来跟踪应用程序中的问题 我使用了中提到的方法https github com pbakondy filelogger 我可以在 Android 和 iOS 中创建日志文件
  • 绘图框 p 值显着性注释

    我已经开始使用并喜欢绘制箱线图来表示我的数据 然而 我很难找到一种方法来对比这两个群体 使用Plotly时有没有办法引入数据之间的统计显着性比较 我想创建这样的图表 其中 对应于 p 值 0 05 我发现使用scipy stats ttes
  • 使用 c# mvc4 读取 rss feed

    这是我的第一篇文章 所以我遇到了这个问题 而且我对这种语言或 c 非常陌生 我有一个读取新闻 rss 的模型 然后使用相同的索引控制器 我必须将其传递给视图 这是我的模型 using System using System Collecti
  • Three.js Raycaster 不与自定义网格相交

    我通过创建带有顶点的几何图形 然后构建面来构建自定义网格 八角棱柱 我现在尝试添加鼠标悬停交互 但是 Raycaster 没有返回该网格的交集 我认为这是网格的问题 因为其他几何图形在场景中的相交处正确返回 完整的例子可以在这里看到 htt
  • java.lang.ClassNotFoundException: org.dom4j.DocumentException

    我编写了一些代码来学习hibernate 它抛出下面的错误 我如何找出问题所在并解决它 dom4j 听起来像是一个 XML 问题 是hibernate cfg xml的问题吗 Exception in thread main java la
  • 我实际上可以在cuda卡上分配多少内存

    我正在编写一个使用 cuda 在 GPU 上执行计算的服务器进程 我想对传入请求进行排队 直到设备上有足够的内存来运行作业 但我很难计算出可以在设备上分配多少内存 我对作业需要多少内存有一个很好的估计 至少从 cudaMalloc 分配多少
  • 如何使用 VS2015 远程运行测试?

    我有一些 CodedUI 测试 我想在 Visual Studio 的远程计算机上运行 现在 过去您需要在某处安装一个测试控制器 在要运行的盒子上安装一个测试代理 让它们说话 然后使用指向该控制器的测试设置文件 我正在经历这个并在我的运行箱
  • 当应用程序处于工作模式时,UILocalNotification 不会触发

    关于为什么本地通知无法正常触发有很多问题here and there 还有几个关于为什么当应用程序处于后台状态时本地通知不会触发的问题 我也经历过them 但令我惊讶的是 我没有找到任何与前台状态或活动状态相关的通知帖子 即在我的应用程序中
  • 如何分组并获取具有最大值的元素 - javascript/node.js

    我有以下数组 我试图通过按 EntryId 分组来获取具有最大 id 的元素node js entryId 7wpNAXhYI id 5 entryId 7wpNAXhYI id 6 entryId 5PGB23RI id 7 entryI
  • Highcharts y 轴天花板未得到尊重

    我在使用 Highcharts 时遇到问题 其中两个 y 轴之一的上限没有得到尊重 Y 轴 1 代表百分比值 因此下限为 0 上限为 100 Y 轴 2 代表货币值 因此下限为 0 上限为null 由于某种原因 y 轴 1 的标签最多为 1
  • 使用 Flexbox 左对齐和居中对齐元素

    我正在使用 Flexbox 来对齐我的子元素 我想做的是将一个元素居中 并使另一个元素靠左对齐 通常我会使用设置左侧元素margin right auto 问题在于将中心元素推离中心 这可能吗without使用绝对定位 HTML 和 CSS
  • 找不到“laravel/homestead”框

    尝试配置 laravel 5 1 克隆了拉拉维尔 家园 将其克隆到之后Home目录 尝试运行 vagrant up 命令时抛出错误 如下所示 user user laravel homestead vagrant up Bringing m
  • 如何在不同的屏幕尺寸上得到完全相同的点?

    我想在用户点击特定区域时调用该操作 转到另一个视图 image 黑点 图像填充整个视图 内容模式为 Aspect Fit 问题是 当我将其设置在一种屏幕尺寸 例如 iPhone 8 上时 点击区域 会发生移动 我尝试使用按钮和约束或使用屏幕
  • 回归:导出的 Bash 函数在经过另一个过程后丢失

    从 Ubuntu 14 04 迁移到 16 04 时 我注意到我的几个 Bash 脚本由于缺少导出函数而失败 我想知道这是否与修复有关炮弹休克虫 尽管我只是简单地export f函数 而不依赖于 Bash 内部函数表示 仅当中间有另一个进程