问题标签 [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 脚本、子shell、子脚本、管道 - WEIRD (?) CTRL+C 信号传播
因此,我发现了我觉得奇怪的 bash 脚本的一个行为。
这是一个测试脚本:
因此,如您所见,我使用括号创建子shell 来轻松管道输出以进行日志记录。
在这个子shell 中,我运行一个脚本来捕获 ctrl+c 信号并简单地退出脚本。
因此,根据我是否通过管道传输子shell的输出,在下标(睡眠 10)期间按 ctrl+c 时的行为会有所不同。
与| tee -a /tmp/$$.log,输出显示:
没有管道和三通,输出显示:
有人可以解释这种行为吗?有没有办法确保下标的结尾不会像管道和三通那样被跳过?
谢谢
bash - 将多个命令通过管道传输到一个命令中
如何将多个命令的标准输出通过管道传输到单个命令?
示例 1:对所有三个 echo 命令的输出进行组合和排序:
所需的输出:
示例 2:重写以下内容,以便所有命令都在使用管道的单个命令行中,而不重定向到临时文件:
bash - 如何在不使用“kill 0”的情况下终止 Bash 中某个子 shell 级别的所有内容?
语境:
说我有:
我有一个外部子shell(不必是一个;它可以是一个命令组,也可以完全删除)。在那里面,我有两个同时被调用的管道连接的命令组。我希望两个组都开始执行,然后,当第一组完成时(第二组仍然在运行sleep
),我希望外部子shell的执行停止,即#die, somehow
行所在的位置。
问题:
我应该怎么做才能确保#die, somehow
到达该行时,#outer subshell
关卡中的所有内容都终止,但在它之后继续执行(即被out
打印)?
我试过的:
一种解决方案是使用kill 0
(杀死当前进程组中的所有内容)来退出两个内部命令组,但这种echo "out"
情况永远不会发生;整个小组都将被杀死,而不仅仅是外部子壳。
我也尝试过暂时覆盖然后unset
ingexit
函数,但这似乎只是将问题推到了另一个位置。也许我做错了;我绝不是 Bash 大师。
为什么?
在不深入细节的情况下,奇怪的 subshell 连接的命令组是必要的,因为使用&
fork out 进程在我的系统上无法确定地工作(嵌入式 *nix)。因此,管道连接的组确保如果do_first_thing
运行时间过长(在上面的示例中为 10 秒),do_second_thing
将会发生。实际用例要复杂得多,但这是问题的根源。
干杯!
bash - 为什么在 sed 中使用双反斜杠来运行 ssh?
我在 Gentoo Linux 的 wiki 中遇到了以下关于动态 jumphost 列表的内容:
它有效,但我想sed
完全理解这个表达。
阅读其原始参考资料,我能够很好地理解使用该Host *+*
模式的命令的递归调用。但我有两个问题:
- 表达式使用
%%
. 为了了解原因,我使用ssh -v
了 ,并观察到当ssh
客户端解析时$HOME/.ssh/config
,似乎第一个%
被剥离了。试图确认上述内容,我下载了openssh 源代码,但readconf.c
没有给我任何线索。我是 OpenSSH 源代码的新手,但不怕用调试信息和它来编译gdb
它。不过,如果有更快的方法来证实我的猜想,我将不胜感激。 ssh -v
还透露:即
\(
现在\
在子shell 中用a 转义。为什么这是必要的?
谢谢,
——扎克
alias - xargs 采购 tcsh 中的别名
我正在尝试运行使用别名的 xargs 命令。搜索想出了这个
但它返回
变化会回来
bash - 从另一个函数调用时,函数中的子shell 找不到基本的 bash 命令
我有以下 bash 脚本(这是更复杂脚本的简化版本)。
当我运行它时,我得到以下输出:
因此chmod
,当execute
直接调用该函数时有效,但从另一个函数调用它时失败,即使调试输出似乎完全相同......
谁能解释这种行为?
ruby - 从 ruby 运行一个子进程而不等待它返回
可能重复:
在 Ruby 中生成一个后台进程
花了几天时间戳这个。直到最近,我一直在使用操作系统中的 ruby 1.8.7。我会用反引号调用一个子shell。subshell 是一个 bash 包装器,它会在 stdout 和 stderr 都关闭的情况下调用在后台运行任何程序。然后它运行 disown 让 init 接管该过程,它会立即返回。这多年来一直很好,我会让这个循环过程在后台启动工作并立即报告“是的,它运行了,这就是我要告诉你的全部内容”。
我将所有东西都升级到 rvm 1.9.3 并且一切都很好,除了这个技巧。我开始怀疑这比我想承认的更像是一种黑客行为。在 1.9.3 中,当我生成该子 shell 时,我总是收到 EPIPE 错误。它说它的管道坏了。我可以接受它在 1.9.3 中不起作用,因为我在 1.8.7 中所做的似乎有点恶心。
我试过使用系统命令,也试过 open3:popen2。他们还和我一起抛出了一个 EPIPE,我称之为 disown wrapper。
这是 disown 包装器。在红宝石中,我有类似的东西
当它运行时,它会抛出
如果我不将(零)输出分配给 r 变量,则效果是相同的。并具有系统功能和Open3:popen2。
所以我的目标是简单地从 ruby 运行命令,而不是等待它返回。这需要几个小时,我不需要跟踪它,只需生成它。如果它开始听起来像 ruby 不能再这样做,或者如果我的 disown 包装器太令人发指而无法获得任何批准,我可能会尝试一个工作线程池。行。谢谢。
*编辑:感谢大家的精彩回答。我认为 Casper 向我展示了,如果我对红宝石术语有更好的处理,我可能会专注于此。对不起,如果这有点行人。我感谢大家的快速回答!
bash - bash中的errexit问题
我正在编写一个 bash 脚本,我希望它在第一个错误时崩溃。但是,在我在下面简化的特定情况下,我无法做到这一点:
预期的行为将是bad_command
子()
外壳的崩溃,传播到子外壳的崩溃,传播到外壳的崩溃。但是这些都没有崩溃,两个 NO 都被打印出来了(!?)
如果我取消注释该exit 1
语句,则不再打印 NO,但 NOO 仍然是(!?)
我尝试set -e
在 3 个 shell 中的每一个中显式使用(函数中的第一行,之后(
的第一个语句,但没有变化。
注意:我需要在子shell 内执行管道()
,因为这是对更复杂脚本的简化。没有()
subshell,一切都按预期工作,没有任何 NOfalse
或exit 1
.
ruby - 在子shell中退出红宝石而不杀死父母
我有 Ruby programA 调用 Ruby programB :
在某些情况下,我希望 programB 终止其操作(以及相关的子 shell),但允许 programA 继续执行下一组参数。
但是,exit()
并abort()
杀死子外壳和父外壳,我无法Process.kill("SIGTERM",0)
在 programB 中工作(不幸的是,这是在 Windows 上)。我正在运行 ruby 1.9.2。
如何在不杀死程序A的情况下终止程序B?
bash - bash 脚本在启动时有效,在终端中无效
我正在 Amazon ec2 中创建一个服务器,并将一个 bash 脚本作为用户数据传递给它,该脚本在服务器首次启动时运行。它包括一个使用此处给出的答案为用户添加一行到 crontab 的命令。
此脚本在启动期间似乎工作正常,因为它不显示错误消息并且 cronjob 已安装在 crotab 中。
但是,我还希望脚本在服务器升级期间运行。尝试从命令行运行脚本会出现错误:
我需要什么来修复这个错误?