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

bash - 为什么 ssh 在没有 -t 的情况下等待我的子 shell,然后用 -t 杀死它们?

我有一个 bash 脚本 start.sh,它看起来像这样:

这就是我想要的:我运行 start.sh,它以代码 0 退出,两个子 shell 在后台运行。每个子shell运行background_processor,当它退出时,它运行cleanup_on_exit。即使我退出最初运行 start.sh 的终端(即使那是 ssh 连接),这也有效。

然后我尝试了这个:

这有效,除了start.sh退出之后,ssh 显然还等待子shell 退出。我真的不明白为什么。退出start.sh后,子shell 成为pid 1 的子shell,甚至没有为它们分配tty ......所以我不明白它们是如何与我的ssh 连接相关联的。

我后来试过这个:

现在进程有一个分配的伪终端。现在,我发现 ssh 确实会在退出后立即start.sh退出,但它也会杀死子进程。

我猜想在后一种情况下正在向子进程发送 SIGHUP,所以我这样做了:

这确实有效!所以,我有一个解决我的实际问题的方法,但我想在这里掌握 SIGHUP/tty 东西的微妙之处。

总之,我的问题是:

  1. 为什么 ssh(没有 -t)即使在start.sh退出后仍等待子进程,即使它们的父 pid 为 1?
  2. 为什么 ssh (with -t) 会杀死子进程,显然是使用 SIGHUP,即使当我从终端运行它们并注销该终端时不会发生这种情况?
0 投票
2 回答
1509 浏览

bash - 使用 xargs 将命令传递给子shell 在别名中不起作用

我试图构建一个快速脚本来查找目录下的所有 git repos,并依次“git pull”每个。

这是我到目前为止发现的:

如果粘贴到终端中,这将完全按照预期工作。但是,如果我在我的.bashrc文件中将其设为别名:

该命令不起作用。我对其进行了修改,试图让它打印 xargs 启动的子shell正在接收的内容:

运行时,每个子shell 都打印一个换行符,但没有其他内容。

谁能回答为什么会这样?我的直觉说这是我在别名中的语法有问题,但我不知道到底发生了什么。

0 投票
3 回答
138 浏览

bash - 在 shell 命令中使用循环时的错误消息

我做错了什么?

它应该返回:

代替:

0 投票
10 回答
73793 浏览

bash - 从子 shell 设置父 shell 的变量

如何从子 shell 中在父 shell 中设置变量?

0 投票
1 回答
958 浏览

bash - 在子shell中,如何从调用shell中读取环境变量?

出于显而易见的原因,我不想export COLUMNS在我的普通 bash shell 中使用。

但是,出于一个特定子外壳的目的,我需要访问其父级的 COLUMNS 的值。换句话说,在常规的 bash shell 中,我想调用一个使用ls -Cw $COLUMNS, 的 shell 脚本,其值$COLUMNS来自其父级。

除了由父级导出之外,还有什么方法可以访问父级的环境变量?

0 投票
4 回答
4198 浏览

linux - 在linux上用“echo -e”替换命令echo

我有一个包含这样内容的 shell 程序

一旦我在 Linux 以外的平台上运行该程序,它就会识别特殊字符并将输出显示为

当同一个程序在 Linux 上运行时,echo 命令需要“-e”选项。现在我不想在我的文件中显式地用“echo -e”更改每次出现的回声,因为这样会开始在其他平台上产生问题。所以我想做一个条件编译,比如

但这不起作用,因为使用 set 或 export 命令,我需要用 $echo 替换所有出现的 echo,我不想这样做。再次设置别名并不能解决此问题,因为即使在 subshel​​l 中我也需要将 echo 替换为“echo -e”。

有没有其他方法可以用“echo -e”代替echo,仅适用于Linux平台?

0 投票
1 回答
397 浏览

mysql - bash中的子shell MySQL查询

我正在尝试在 Ubuntu bash 中的循环中设置变量,该变量正在从数据库中获取记录集,但该变量设置为之前的值。这是一个代码:

这段代码每次都会打印:

127 127 127

但是当我替换这个块时-:

mysql -h$DB_HOST -u $DB_USER -p$DB_PASS $DB_NAME --skip-column-names --default-character-set=UTF8 -e "here is a query" | while read "here is getting variables from recordset";

while true在循环结束时使用 just and break 它可以正常工作并打印:

127 777 777 777

脚本创建一些子shell 并在该子shell 中运行该MySQL 查询。那么我应该怎么做才能让脚本改变那个变量呢?

0 投票
2 回答
2073 浏览

bash - 将数学计算的结果分配给没有子壳的变量

我的问题是双重的。

第一的:

是否可以在不使用子外壳的情况下实现这一目标?

或这个?

如果我正确理解第二个,我将使用´|创建 2 个子外壳。

第二

为这种东西创建/使用子shell会影响脚本的整体性能吗?

- 谢谢

0 投票
1 回答
2100 浏览

bash - 使用 db2 变量“DB2DBDFT”通过用户 / using 连接到默认模式

我正在尝试编写一个执行一些 db2 工作的 bash 脚本。我面临的问题是子外壳需要重新连接 db2 连接。

不幸的是,每次重新连接都很慢,因为需要建立大约 1000 个新连接,每个需要大约一秒钟。因此,我希望避免这些子外壳重新连接。

通过谷歌搜索这种情况,我发现有一种方法可以使用变量 DB2DBDFT 设置默认连接模式。不幸的是,使用这个设置,Linux 登录用户名将成为您正在运行的 DB 模式名称,而我们的系统与登录 bash 的用户具有不同的 DB 用户名。

1)有没有办法设置 DB2DBDFT 变量,但使它可以使用“使用 123 的用户 abc”样式语法,或者如果有其他变量可以设置这些(我已经搜索但没有找到它们) .

2)如果有,这真的会节省我的时间吗?显然,如果我找到一个解决方案,我将进行基准测试,但我不确定即使我找到了这个,它会更快,而且肯定会减慢所有其他子shell 的生成速度。

3)我对其他建议非常开放,我尝试过管道到while语句而不是调用子shell,但后来记住这有同样的问题。

例如

相对

4)我确定还有其他我没有考虑过的途径,非常感谢任何建议和建议。

非常感谢,米奇。

0 投票
1 回答
572 浏览

bash - make -e 只退出子shell

我希望false线打破一个子壳,但继续处理外循环。即预期的输出是

但是,我得到

好像||:正好false在行之后,而不是在子shell之后。

谁能解释一下,为什么会这样?