为什么要避免使用子shell?

2023-12-22

我在 Stack Overflow 上看到了很多答案和评论 提到做一些事情来避免子shell。在一些 情况下,给出了一个功能性原因 (最常见的是,可能需要读取变量 在其内部分配的子 shell 之外),但是在 在其他情况下,回避似乎被视为结束 在自身。例如

  • tsv 文件的两列的并集 https://stackoverflow.com/q/19020255/#19022363
    建议{ ... ; } | ...而不是( ... ) | ...,所以无论如何都有一个子 shell。

  • 使用 sed 和 mv 命令取消隐藏 unix 中的隐藏文件 https://stackoverflow.com/q/20059064/#20063013

  • Linux bash 脚本复制文件 https://stackoverflow.com/q/7945656/#comment29349903_7945712
    明确指出, “目标只是避免子外壳”

为什么是这样?是为了风格/优雅/美丽吗?为了 性能(避免分叉)?为了防止可能 错误?还有别的事吗?


有一些事情正在发生。

首先,分叉子 shell 只发生一次时可能不易察觉,但如果您在循环中执行此操作,则会对性能产生可衡量的影响。在 Windows 等平台上,性能影响也更大,因为在 Windows 上,分叉不像现代 Unix 那样便宜。

其次,分叉一个子 shell 意味着您拥有多个上下文,并且在它们之间切换时信息会丢失 - 如果您更改代码以在子 shell 中设置变量,那么当子 shell 退出时该变量就会丢失。因此,您的代码中包含的子 shell 越多,您在以后修改它时就必须越小心,以确保您所做的任何状态更改实际上都会持续存在。

See Bash常见问题解答#24 http://mywiki.wooledge.org/BashFAQ/024有关子 shell 引起的令人惊讶的行为的一些示例。

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

为什么要避免使用子shell? 的相关文章

  • 以受限用户身份运行 monit 并使其监视需要 root 权限的进程

    我有一个用 Ruby 编写的特定脚本 需要 root 权限 大多数其他进程不需要它 因此很容易在 Monit 中设置 不是这个 服务器需要监听386 这个端口只有root可用 我不会详细说明原因 因为 1 我不是一个低级的人 2 到目前为止
  • Bash + sed/awk/cut 删除第 n 个字符

    我试图删除每行的第 6 7 和第 8 个字符 下面是包含文本格式的文件 实际输出 cat test 18 40 12 172 16 70 217 UP 18 42 15 172 16 70 218 DOWN 格式化后如下所示 cat tes
  • 如何使用 bash 测试文件系统的目录限制

    我需要测试可以在文件系统 网络安装驱动器和本地 USB 驱动器 上创建多少目录和文件 我现在使用这个 bash 行 for i in 0 999999 do mkdir p i pushd i done 我知道可能可以做得更好 并且我想知道
  • 如何将数据通过管道传输到交互式 bash 脚本并将输出通过管道传输到另一个命令?

    我想将数据通过管道传输到交互式命令中 并将交互式命令的输出作为另一个命令的输入接收 例如 我希望能够执行以下操作 echo Zaphod hello sh goodbye sh 并让输出为 再见 你好 赞福德 这是我对此的初步破解 但我遗漏
  • 如何将后台作业的输出分配给 bash 变量?

    我想在 bash 中运行后台作业并将其结果分配给一个变量 我不喜欢使用临时文件 并且希望同时运行多个类似的后台任务 root root var echo hello world root root echo var hello world
  • 如何使用ssh直接连接远程docker容器

    我想直接使用 ssh 连接到远程运行的 Docker 容器 通常我可以 ssh i privateKey user host docker ps which will list all running containers docker e
  • 如何从 mysqldump 中删除表

    如何删除 mysqldump 中包含大量表的一个大表的输出 我有一个 6 GB 大的数据库转储 但其中 90 只是一个日志记录表 cache entries 我的备份中不再需要它 如何轻松删除转储中描述大型日志记录表的部分 我找到了这个 h
  • 检查 Bash 数组中是否存在元素[重复]

    这个问题在这里已经有答案了 我想知道是否有一种有效的方法来检查 Bash 数组中是否存在元素 我正在寻找类似于我可以在Python中做的事情 例如 arr a b c d if d in arr do your thing else do
  • 带有存储在文件中的通配符的 grep

    我希望 grep 通过读取需要从文本文件中过滤掉的内容来过滤掉行 这是我给 grep 的内容 它存储在foo txt Users 1337 X Users 1337 R Users 1337 W 这是它应该过滤的内容 它存储在bar txt
  • 将 mysql 查询输出存储到 shell 变量中

    我需要一个变量来保存从数据库检索的结果 到目前为止 这基本上是我正在尝试但没有成功的事情 myvariable mysql database u user p password SELECT A B C FROM table a 正如你所看
  • Bash 和双引号传递给 argv

    我重新设计了这个示例以使其简单 但我想做的是在 bash shell 执行它时获取一个嵌套双引号字符串作为单个 argv 值 这是脚本示例 set x command1 key1 value1 key2 value2 key3 value3
  • Python bash 管道

    我想将 python 脚本的输出通过管道传输到 bash 脚本 到目前为止我所做的是尝试使用os popen sys subprocess 并试图给出一个管道的例子 os popen echo P 1 1 591336 4927369 1
  • Bash - 比较 2 个文件列表及其 md5 校验和

    我有 2 个列表 其中包含带有 md5sum 检查的文件 即使文件相同 列表也具有不同的路径 我想检查每个文件的 md5 和 我们正在讨论数千个文件 这就是为什么我需要脚本来仅显示差异 第一个列表是普通列表 第二个列表是文件的当前状态 我想
  • 运行 shell 命令并将输出发送到文件?

    我需要能够通过 php 脚本修改我的 openvpn 身份验证文件 我已将我的 http 用户设置为免通 sudoer 因为这台机器仅在我的家庭网络中可用 我目前有以下命令 echo shell exec sudo echo usernam
  • 在cmake中集成bash测试脚本

    我有一个 C cmake 项目 它使用 Boost Test 进行单元测试 现在我想向 cmake 公开一系列 bash 脚本 用于集成测试 假设每个脚本在以下情况下返回 0PASS或某些情况下 0FAILURE 我希望每次运行时都执行每个
  • Grep 搜索带有换行符的字符串

    如何使用 grep 输出下面给出的输入文件中出现的字符串 export to excel 具体来说 如何处理搜索字符串之间发生的换行符 grep 中是否有一个开关可以执行此操作或其他命令 输入文件 文件a txt 等等 导出到优秀 巴拉巴拉
  • 通过 Node.js 运行 bash 脚本 - 非法选项 -o pipelinefail

    我正在尝试使用 Node js 执行 bash 脚本child process exec 然而它在文件的第二行爆炸 usr bin env bash set eo pipefail TRACE set x echo we are here
  • 通过 ssh 运行 Bash 脚本

    我正在尝试编写一个 Bash 脚本 它将通过 SSH 连接到计算机并创建一个目录 长期目标有点复杂 但现在我从简单的开始 然而 虽然很简单 但我似乎不太明白 这是我的代码 bin bash ssh T email protected cdn
  • 如何运行 bash 压缩脚本?

    有没有一种方法可以直接运行带有 参数 的压缩bash脚本 而无需将其解压缩到文件中 然后运行解压缩的文件 例如 我需要使用一些给定的参数执行 setup mysql gzip 压缩脚本 n wordpress locahost 而不先解压缩
  • 在unix、bash中合并csv文件

    我有一些 csv 文件 其格式如下 测试1 csv field port1 a1 0 2 a2 0 3 a3 0 6 测试2 csv field port2 b1 0 5 b2 0 6 b3 0 7 b4 0 1 b5 0 5 测试3 cs

随机推荐

  • 加快 Xcode Swift 构建时间

    随着我的项目在过去一年中不断增长 其构建时间也不断增长 在过去的几个月里 它从 4 分钟缩短到了 7 分钟左右 时间包括 GitHub 拉取 单元测试等 我调查过 Xfrontend debug time function bodies找到
  • 过期时间为“会话结束时”的 cookie 何时过期?

    有一个带有过期时间的会话 cookie 其内容为 会话结束时 它到底什么时候过期还是会永远存在 饼干 会话结束时过期 从用户的角度来看 过期是不可预测的 在带有 Safari 的 iOS 上 只要您切换应用程序 它们就会过期 在带有 Chr
  • Mingw 和 Eclipse 无法找到库

    我遇到的问题与描述的类似here https stackoverflow com questions 9127623 mingw eclipse ld exe does not find libraries 我创建了一个新项目 在 Ecli
  • 单击“通知”后打开应用程序

    我的应用程序中有一条通知 代码如下 Notification Start notificationManager NotificationManager getSystemService Context NOTIFICATION SERVI
  • 如何使用 highchart 使两个图表使用 div 并排显示在同一行中

    我想使用 div 在同一行显示两个图表 你能帮忙吗 这是我正在尝试的 但它显示为两行 div div style width 200px height 200px div div style width 200px height 200px
  • Perl - 使用编码方法读取文件?

    我在编码方面不太好 我想弄清楚如何以与开始时相同的编码返回数据 我有一个文件 其中包含一些字符 例如 当我编辑并插入数据库时 它们已经变成了 decode entities 什么都不做 encode entities 再次对字符进行编码 因
  • Symfony2 Monolog 到电子邮件错误为什么 swiftmailer.transport.real 服务不存在

    更新 symfony 后2 3 to 2 4 i got ServiceNotFoundException Fatal error Uncaught exception Symfony Component DependencyInjecti
  • HTML5 视频,视频内无缝循环

    我正在编写一个交互式视频 一种游戏 用户在侧面板上进行操作 并且操作发生在视频中 对于一部分来说 视频正在等待用户在面板上执行操作 因此它必须循环播放 直到用户启动该操作 所以在 15 秒时 只要用户没有做出动作 我就会回到 11 秒 视频
  • 如何以编程方式检测 iPhone XS 或 iPhone X? [复制]

    这个问题在这里已经有答案了 我的一个应用程序连接到一项 Web 应用程序服务 该服务向用户提供设备特定的新闻 为了适应最新的 iPhone 版本 我需要以编程方式区分 iPhone XS 和 iPhone X 如何做到这一点 UIScree
  • ASP.NET AutoPostBack 正在清除表单数据

    我有一个单选按钮列表 我想在用户做出选择时执行一些操作
  • 通过 WSO2 ESB 访问 WSO2 数据服务服务

    我创建了一个服务 产品 它接受 ProductID 值并返回数据 我有此服务的 SOAP 和 HTTP 请求和响应 我可以通过执行 h p localhost 9763 services Products HTTPEndpoint Prod
  • 每次都是相同的随机数

    我正在通过命令行运行脚本R CMD BATCH script in R script out R 我有以下行 它选择 12 个随机行 id 并对它们进行排序 test index lt sort sample 1 nrow recoded
  • Base64 DataURL 图像的大小限制是多少?

    我想知道浏览器中加载的 Base64 DataURL 图像的最大长度是多少 Thanks Citing MDN 对此 https developer mozilla org en US docs data URIs Common probl
  • 为什么 Linux 服务器响应的 TCP 数据包多于客户端请求的 MSS

    嗯 我看到了一件奇怪的事情 这不是我所期望的 TCP 理论 客户端在握手时将 MSS 最大段大小 设置为 1360 窗口大小为 64K 但 Linux 服务器发送的 TCP 数据包包含 4KB 7KB 一些 8KB 的数据包 超过 1360
  • 具有队列基​​本功能的最快 Java 集合是什么?

    Java 中最快的集合是什么 我只需要添加和删除操作 顺序并不重要 equals元素不是问题 无非添加和删除很重要 没有限制的大小也很重要 这些集合里面都会有Object 目前我正在使用 ArrayDeque 因为我发现这是更快的队列实现
  • 设置 Android 日期选择器日期限制

    我在 android 中使用 datePicker 根据用户选择的日期显示图像 我需要将所述日期限制为某些日期 例如 2010 年 1 月 1 日至 2010 年 12 月 31 日 我想这很简单 但我在哪里可以找到有关如何限制这些日期的答
  • 如何将视频从 iOS 设备发送到服务器?

    我必须将视频从 iPhone 实时发送到服务器 我创建捕获会话并使用 AVCaptureMovieFileOutput NSError error nil captureSession AVCaptureSession alloc init
  • iOS:从后台线程创建 UIImage?

    苹果文档说 由于图像对象是不可变的 因此创建后无法更改其属性 大多数图像属性是使用随附图像文件或图像数据中的元数据自动设置的 图像对象的不可变性质也意味着它们可以安全地从任何线程创建和使用 Link https developer appl
  • 如何通过名称删除会话

    如何通过名称删除php会话 我的例子session sec and session page 我需要删除session page 没有删除session sec for a single variable unset SESSION ses
  • 为什么要避免使用子shell?

    我在 Stack Overflow 上看到了很多答案和评论 提到做一些事情来避免子shell 在一些 情况下 给出了一个功能性原因 最常见的是 可能需要读取变量 在其内部分配的子 shell 之外 但是在 在其他情况下 回避似乎被视为结束