问题标签 [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 投票
1 回答
976 浏览

bash - shell 脚本、子shell、子脚本、管道 - WEIRD (?) CTRL+C 信号传播

因此,我发现了我觉得奇怪的 bash 脚本的一个行为。

这是一个测试脚本:

因此,如您所见,我使用括号创建子shell 来轻松管道输出以进行日志记录。

在这个子shell 中,我运行一个脚本来捕获 ctrl+c 信号并简单地退出脚本。

因此,根据我是否通过管道传输子shell的输出,在下标(睡眠 10)期间按 ctrl+c 时的行为会有所不同。

| tee -a /tmp/$$.log,输出显示:

没有管道和三通,输出显示:

有人可以解释这种行为吗?有没有办法确保下标的结尾不会像管道和三通那样被跳过?

谢谢

0 投票
3 回答
60932 浏览

bash - 将多个命令通过管道传输到一个命令中

如何将多个命令的标准输出通过管道传输到单个命令?

示例 1:对所有三个 echo 命令的输出进行组合和排序:

所需的输出:

示例 2:重写以下内容,以便所有命令都在使用管道的单个命令行中,而不重定向到临时文件:

0 投票
2 回答
786 浏览

bash - 如何在不使用“kill 0”的情况下终止 Bash 中某个子 shell 级别的所有内容?

语境:

说我有:

我有一个外部子shell(不必是一个;它可以是一个命令组,也可以完全删除)。在那里面,我有两个同时被调用的管道连接的命令组。我希望两个组都开始执行,然后,当第一组完成时(第二组仍然在运行sleep),我希望外部子shell的执行停止,即#die, somehow行所在的位置。

问题:

我应该怎么做才能确保#die, somehow到达该行时,#outer subshell关卡中的所有内容都终止,但在它之后继续执行(即被out打印)?

我试过的:

一种解决方案是使用kill 0(杀死当前进程组中的所有内容)来退出两个内部命令组,但这种echo "out"情况永远不会发生;整个小组都将被杀死,而不仅仅是外部子壳。

我也尝试过暂时覆盖然后unsetingexit函数,但这似乎只是将问题推到了另一个位置。也许我做错了;我绝不是 Bash 大师。

为什么?

在不深入细节的情况下,奇怪的 subshel​​l 连接的命令组是必要的,因为使用&fork out 进程在我的系统上无法确定地工作(嵌入式 *nix)。因此,管道连接的组确保如果do_first_thing运行时间过长(在上面的示例中为 10 秒),do_second_thing将会发生。实际用例要复杂得多,但这是问题的根源。

干杯!

0 投票
1 回答
815 浏览

bash - 为什么在 sed 中使用双反斜杠来运行 ssh?

我在 Gentoo Linux 的 wiki 中遇到了以下关于动态 jumphost 列表的内容

它有效,但我想sed完全理解这个表达。

阅读其原始参考资料,我能够很好地理解使用该Host *+*模式的命令的递归调用。但我有两个问题:

  1. 表达式使用%%. 为了了解原因,我使用ssh -v了 ,并观察到当ssh客户端解析时$HOME/.ssh/config,似乎第一个%被剥离了。试图确认上述内容,我下载了openssh 源代码,但readconf.c没有给我任何线索。我是 OpenSSH 源代码的新手,但不怕用调试信息和它来编译gdb它。不过,如果有更快的方法来证实我的猜想,我将不胜感激。
  2. ssh -v还透露:

    \(现在\在子shell 中用a 转义。为什么这是必要的?

谢谢,

——扎克

0 投票
2 回答
418 浏览

alias - xargs 采购 tcsh 中的别名

我正在尝试运行使用别名的 xargs 命令。搜索想出了这个

但它返回

变化会回来

0 投票
1 回答
1085 浏览

bash - 从另一个函数调用时,函数中的子shell 找不到基本的 bash 命令

我有以下 bash 脚本(这是更复杂脚本的简化版本)。

当我运行它时,我得到以下输出:

因此chmod,当execute直接调用该函数时有效,但从另一个函数调用它时失败,即使调试输出似乎完全相同......

谁能解释这种行为?

0 投票
3 回答
2518 浏览

ruby - 从 ruby​​ 运行一个子进程而不等待它返回

可能重复:
在 Ruby 中生成一个后台进程

花了几天时间戳这个。直到最近,我一直在使用操作系统中的 ruby​​ 1.8.7。我会用反引号调用一个子shell。subshel​​l 是一个 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 向我展示了,如果我对红宝石术语有更好的处理,我可能会专注于此。对不起,如果这有点行人。我感谢大家的快速回答!

0 投票
2 回答
1067 浏览

bash - bash中的errexit问题

我正在编写一个 bash 脚本,我希望它在第一个错误时崩溃。但是,在我在下面简化的特定情况下,我无法做到这一点:

预期的行为将是bad_command()外壳的崩溃,传播到子外壳的崩溃,传播到外壳的崩溃。但是这些都没有崩溃,两个 NO 都被打印出来了(!?)

如果我取消注释该exit 1语句,则不再打印 NO,但 NOO 仍然是(!?)

我尝试set -e在 3 个 shell 中的每一个中显式使用(函数中的第一行,之后(的第一个语句,但没有变化。

注意:我需要在子shell 内执行管道(),因为这是对更复杂脚本的简化。没有()subshel​​l,一切都按预期工作,没有任何 NOfalseexit 1.

0 投票
3 回答
531 浏览

ruby - 在子shell中退出红宝石而不杀死父母

我有 Ruby programA 调用 Ruby programB :

在某些情况下,我希望 programB 终止其操作(以及相关的子 shell),但允许 programA 继续执行下一组参数。

但是,exit()abort()杀死子外壳和父外壳,我无法Process.kill("SIGTERM",0)在 programB 中工作(不幸的是,这是在 Windows 上)。我正在运行 ruby​​ 1.9.2。

如何在不杀死程序A的情况下终止程序B?

0 投票
2 回答
110 浏览

bash - bash 脚本在启动时有效,在终端中无效

我正在 Amazon ec2 中创建一个服务器,并将一个 bash 脚本作为用户数据传递给它,该脚本在服务器首次启动时运行。它包括一个使用此处给出的答案为用户添加一行到 crontab 的命令。

此脚本在启动期间似乎工作正常,因为它不显示错误消息并且 cronjob 已安装在 crotab 中。

但是,我还希望脚本在服务器升级期间运行。尝试从命令行运行脚本会出现错误:

我需要什么来修复这个错误?