问题标签 [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.
bash - 如何在不创建子shell的情况下将命令的输出存储在变量中[Bash
ksh有一个非常有趣的结构来做到这一点,在这个答案中有详细说明:https ://stackoverflow.com/a/11172617/636849
从 Bash 4.0 开始,有一个内置的m
ksh有一个非常有趣的结构来做到这一点,在这个答案中有详细说明:https ://stackoverflow.com/a/11172617/636849
从 Bash 4.0 开始,有一个内置的mapfile内置命令可以解决这个问题:
http ://www.gnu.org/software/bash/manual/html_node/Bash-Builtins.html
但奇怪的是,它似乎不适用于进程替换:
但是如何在 Bash v3.2 中做到这一点?
这是我能想到的——它有点乱,但是foo
在顶级 shell 上下文中运行,并且它的输出在a
顶级 shell 上下文中的变量中提供:
这当然假设了两件事:
- 允许先进先出
- 正在做缓冲的命令组被允许进入后台
我测试了它在这些bash版本中的工作:
- 3.00.15(1)-release (x86_64-redhat-linux-gnu)
- 3.2.48(1)-release (x86_64-apple-darwin12)
- 4.2.25(1)-release (x86_64-pc-linux-gnu)
附录
我不确定mapfile
bash 4.x 中的方法是否符合您的要求,因为进程替换<()
会创建一个全新的 bash 进程(尽管不是该 bash 进程中的 bash 子shell):
所以虽然$BASH_SUBSHELL
这里是0,是因为它在进程替换中处于新shell进程60780的顶层。
ksh有一个非常有趣的结构来做到这一点,在这个答案中有详细说明:https ://stackoverflow.com/a/11172617/636849
从 Bash 4.0 开始,有一个内置的m
ksh有一个非常有趣的结构来做到这一点,在这个答案中有详细说明:https ://stackoverflow.com/a/11172617/636849 从 Bash 4.0 开始,有一个内置的mapfile内置命令可以解决这个问题:
http ://www.gnu.org/software/bash/manual/html_node/Bash-Builtins.html 但奇怪的是,它似乎不适用于进程替换: 但是如何在 Bash v3.2 中做到这一点? 这是我能想到的——它有点乱,但是 这当然假设了两件事: 我测试了它在这些bash版本中的工作: 我不确定 所以虽然
foo
在顶级 shell 上下文中运行,并且它的输出在a
顶级 shell 上下文中的变量中提供:
附录
mapfile
bash 4.x 中的方法是否符合您的要求,因为进程替换<()
会创建一个全新的 bash 进程(尽管不是该 bash 进程中的 bash 子shell):$BASH_SUBSHELL
这里是0,是因为它在进程替换中处于新shell进程60780的顶层。
bash - 子外壳优先级
昨天我得到了一些关于使用的澄清flock
,一些简单的概念对我来说变得清晰了。
我现在的问题是关于子壳。看看这个块
我的理解是以前200>/var/lock/mylockfile
运行过 flock -s 200
,但是如果我尝试这样的事情
我从 BASH 收到一个错误
引入分号
修复错误,但导致子外壳返回后command
运行。
所以我想知道初始示例如何导致重定向首先运行。这与>
over sub-shell(list)
符号的优先级有关吗?查看 BASH 联机帮助页,我发现
运算符按优先级顺序计算。括号中的子表达式首先被评估,并且可以覆盖上面的优先规则。
shell - 从文件中读取输入并将其传递给子 shell
我有一个场景,我必须监视在不同服务器上运行的作业,作业详细信息(作业名称、主机服务器等)存在于 dat 文件中。
我编写了一个脚本,该脚本从 dat 文件中读取详细信息并调用存在作业监视逻辑的本地方法。
该脚本运行良好,并且正在按顺序监控作业,即一次一项作业。
我想同时监视作业,即将作业详细信息传递给子shell,以便同时监视每个作业。
我已经为每个作业添加了创建子外壳的逻辑(在方法的末尾附加 & ),但作业仍在按顺序进行监控。
有没有其他方法可以在子 shell 中调用本地方法?
监控脚本
输入数据文件
bash - 为什么要避免子shell?
我在 Stack Overflow 上看到了很多答案和评论,其中提到了做一些事情来避免 subshell。在某些情况下,给出了这样做的功能原因(通常,可能需要读取在其内部分配的子shell外部的变量),但在其他情况下,避免似乎被视为本身的目的。例如
tsv 文件的两列的并集
建议{ ... ; } | ...
而不是( ... ) | ...
,因此无论哪种方式都有一个子shell。用于复制文件的 Linux bash 脚本
明确指出,“目标只是避免使用子外壳”
为什么是这样?是为了风格/优雅/美丽吗?为了性能(避免分叉)?为了防止可能的错误?还有什么?
bash - 如何区分脚本中的“命令替换”和“子shell”?
我需要区分两种情况:( ...subshell... ) vs $( ...命令替换...)
我已经有了以下函数,它可以区分在命令替换或子 shell 中运行和直接在脚本中运行。
示例输出:
期望的输出
但我想更新代码,以便区分命令替换和子shell。我希望它产生输出:
trap
PS 我需要区分这些情况,因为当在命令替换和子 shell 中运行时,Bash 对内置命令有不同的行为。
PPS 我也关心echoScriptRunWay | cat
命令。但这对我来说是我在这里创建的新问题。
bash - 如何在bash中将变量传输到子进程
大约一个小时前我发布了一个问题,但没有得到任何回应,我现在正在尝试不同的东西,我将通过包含更少的代码来简化我的问题,但是如果你想查看我正在使用的其余代码,请检查我的最后一个问题bash 比特币监视器中记录到 sql 泄漏数据的并行进程?. 我无法让这些变量成功传输到子shell ./test。感谢您的帮助。阵列的 IP 端口名称和地址是在 for 循环之外定义的,我可以输入 echo 命令来验证它们是否通过。
bash - 管道时疏水阀是否按预期工作?
这是问题演示的最小代码:http: //pastebin.com/5TXDpSh5
输出
预期产出
注意:我测试了 OSX 10.9.2 bash (3.2.51) - 其他版本的 bash 与实际预期输出有相同的差异,如下所述
bash - ( ) & 和 ( &) 的区别?
我想知道这两种语法在 bash:( &)
和( ) &
.
我注意到的唯一区别是,(tty &)
将返回“不是 tty”,而(tty) &
将返回当前的 tty 名称,但为什么呢?
举个例子,我应该运行(setsid startx &)
还是(setsid startx) &
?
shell - ksh --> 是否可以在子 shell 中在父 shell(主 shell)上运行命令?
我正在尝试编写一个简单的脚本来更改我的主 shell 中的目录。我让它在子外壳中更改目录(如上所示),但显然当脚本运行完成时,它会将我踢回外壳,我又回到原来的目录中。
是否可以从子外壳中将命令传递给外壳?我可以将 cd 命令传递给外壳吗?
例如,如果我运行:
我希望我的目录是:
一旦我回到外壳。
tee - tee>(...) 的退出状态
我正在执行:
我希望Command2根据grep的退出状态执行,而在当前配置中,它是根据tee的结果执行的。
据我所知 pipefail 和 pipestatus 在这里不起作用(如果我错了,请纠正我)。
基于 Alexej Answer 修改 Origian 问题
我也试过Command1 | tee >(grep sth || Command2)
了,这适用于我原来的问题,但是当我试图在子shell中设置我的测试状态时;例如,Command 1 | tee>(grep sth || Result="PASSED")
以后可以访问我代码的其他块中的结果。所以我还是有问题。
谢谢