问题标签 [subshell]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
780 浏览

powershell - 如何防止命令/脚本改变全局环境

我需要从当前的顶级 shell 运行脚本块/脚本,并且我希望它们保持全局范围不变。

到目前为止,我只能想到以下几种可能性:

问题是,它们非常慢。

例如,我希望能够做到:

...这样我的 shell 的工作目录就不会改变,$env:NEW_VAR也不会在全局范围内设置。

有没有更多的选择来实现这一点?

0 投票
6 回答
528 浏览

environment-variables - 如果调用它的 shell 是交互式 shell,我如何从 shell 脚本中判断?

我正在尝试设置一个 shell 脚本,该脚本screen仅在从交互式 shell 调用时才会启动会话(或重新加入现有会话)。我看到的解决方案是检查是否$-包含字母“i”:

但是,这会失败,因为脚本是由一个新的非交互式 shell 运行的,该 shell 作为#!/bin/sh顶部的结果调用。如果我获取脚本而不是运行它,它会按需要工作,但这是一个丑陋的 hack。我宁愿让它在我运行时工作。

那么如何测试脚本中的交互性呢?

0 投票
1 回答
1065 浏览

bash - 如何在陷阱代码中再次设置 bash 陷阱?

我有一个被调用的 bash 函数必须在第一次调用后被 EXIT 陷阱调用。该函数将再次设置陷阱以在函数退出后立即触发。

我遇到的问题是陷阱只触发一次,换句话说doStuff只执行了两次。

我不使用简单的 for 循环来执行doStuff k时间的原因是,我实际上launchNextExperiment为我的 CPU 子集的每个调用该函数一次,并且一次只希望一个实例doStuff在 CPU 上运行,因为它非常处理密集的。这也是我有互斥锁的原因。然后,一旦一个实例doStuff返回,我就想启动下一个k实例doStuff(实际上它们都是不同的模拟)。

如何确保为每个嵌套的子 shell 设置了陷阱,最后launchNextExperiment是执行时间,但每个 CPUk只有一个?doStuff

0 投票
2 回答
6544 浏览

bash - bash 中的局部变量:local vs subshel​​l

据我所知,有两种方法可以在 bash 函数中创建局部变量:创建子 shell 或将每个变量声明为局部变量。

例如:

或者

显然,使用 subshel​​l 的版本更容易编写,因为您不必关心将所有变量声明为本地变量(更不用说由getopts等工具创建/导出的(环境)变量)。但我可以想象创建一个子shell 有一个开销。

那么更好的方法是什么?有什么优点/缺点?

0 投票
2 回答
9623 浏览

bash - 管道的左侧是子壳?

编辑:

我在下面关于 sed 's@^@ @' <(f1)不正确的评论虽然$BASH_SUBSHELL表明我们与启动处于同一级别,但变量在主脚本中丢失了。根据戈登斯的回答,我f1 > >(sed 's@^@ @')改为测试,这似乎工作正常。不过,第一种形式的 BASH_SUBSHELL 不应该是 1 而不是 0 吗?


考虑这个小测试

具有以下输出:

(目的sed只是为了有一个管道,不要指望它做任何事情,因为 f1 输出到 stderr)

函数 f1 记录当前 BASH_SUBSHELL 和 i 的当前值

我知道为什么在我们得到的脚本末尾,这i=1是因为第二次调用是在一个子shell中,并且子shell 1 处的 i 的值丢失了。

我不知道的是为什么管道的左侧没有在当前的shell中执行

虽然我认为我可以避免这种情况,但sed 's@^@ @' <(f1) 我想知道为什么左侧与主脚本不在同一级别

0 投票
6 回答
39789 浏览

bash - 用 subshel​​l 和 substring 进行 Bash 错误替换

一个人为的例子......给出

这有效(在bash中)

这不

我的问题是哪个规则导致这个 [子shell 替换] 评估不正确?如果有的话,在 1 跳中执行此操作的正确方法是什么?

0 投票
1 回答
6042 浏览

bash - 可以在 bash 子shell 中调用函数作为后台作业吗?

假设我有一个 bash 功能

我可以在子外壳中将函数作为后台作业调用吗?例如:

你怎么看?

0 投票
2 回答
1079 浏览

bash - 为什么重定向(<)不创建子shell

我写了以下代码

现在据我了解,管道 (|) 将导致创建一个子 shell,因此第 1 行的变量 var 在最后一行将具有相同的值。

但是,这将解决它:

我的问题是为什么重定向不会导致创建子shell,或者如果您喜欢为什么管道会导致创建子shell?

谢谢

0 投票
1 回答
819 浏览

arrays - Bash:在while循环中的大括号内设置数组?(分壳问题)

我在获取一个 variable 时遇到了问题"${Error[*]}",它是一个常规索引数组,从它被声明到被检查时一直保持设置。在我看来,必须启动一个子外壳,这样声明才不会生效。我认为使用大括号时没有打开子外壳{ stuff...; }。我想知道如何获取我的变量,Error以坚持我试图写的情况。这是我的脚本示例:


xtrace 输出:


现在显然我知道cpio, zipinfo, 并且unzip无法处理 cab 文件...我故意将 'cab' 放在扩展名列表中以导致错误。

我想留在TestFunction并继续与不同的归档程序循环,直到成功(文件列表被转储,cabextract在这种情况下很乐意这样做)而不重复已经失败的归档程序。

最后,因为这工作正常......

...我不得不假设问题出在大括号上,因为我想要grep马上得到结果。但是,我需要那些大括号,因为如果没有结果,我不想Error[run]被设置,只有在失败时。由于其他原因,我不想在外面grep (我必须完全重写)。grepcpioTestFunction

没有大量重写的任何快速解决方案?也许echo 'cpio'对一些 fd 和read -u6ing 它以某种方式?

我更希望不必为文件列表设置一个数组,然后for loop | grep遍历每个文件,因为它真的会减慢速度。

0 投票
3 回答
5944 浏览

bash - 在从管道读取的 while 读取循环后重置变量

我正在编写一个 bash shell 脚本,用于bzip2压缩.bsp目录中的所有文件。在这个脚本中,我有几个用于计算总数的变量(文件、成功的 zip、成功的完整性扫描),但是我似乎遇到了问题。

find $loc -name "*.bsp"文件用完while readwhile read退出时,它会将 out和$filcount(所有这些都在内部更改(增加),(在 期间调用)或(也称为 in )归零。$zipcount$scacountinitiate ()bzip ()initiate ()bzipint ()initiate ()

为了测试它是否与内部变量的变化initiate ()或从中访问的其他函数有关,我使用了 echo $valid,它是在外部定义的initiate ()(如$filcount$zipcount等),但不会从内部initiate ()或内部的另一个函数更改initiate ()

有趣的是,$valid它不会像内部的其他变量一样重置为 0。

谁能告诉我为什么我的变量在读取退出时会神奇地重置?