问题标签 [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 - 为什么 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 东西的微妙之处。
总之,我的问题是:
- 为什么 ssh(没有 -t)即使在
start.sh
退出后仍等待子进程,即使它们的父 pid 为 1? - 为什么 ssh (with -t) 会杀死子进程,显然是使用 SIGHUP,即使当我从终端运行它们并注销该终端时不会发生这种情况?
bash - 使用 xargs 将命令传递给子shell 在别名中不起作用
我试图构建一个快速脚本来查找目录下的所有 git repos,并依次“git pull”每个。
这是我到目前为止发现的:
如果粘贴到终端中,这将完全按照预期工作。但是,如果我在我的.bashrc
文件中将其设为别名:
该命令不起作用。我对其进行了修改,试图让它打印 xargs 启动的子shell正在接收的内容:
运行时,每个子shell 都打印一个换行符,但没有其他内容。
谁能回答为什么会这样?我的直觉说这是我在别名中的语法有问题,但我不知道到底发生了什么。
bash - 在 shell 命令中使用循环时的错误消息
我做错了什么?
它应该返回:
代替:
bash - 从子 shell 设置父 shell 的变量
如何从子 shell 中在父 shell 中设置变量?
bash - 在子shell中,如何从调用shell中读取环境变量?
出于显而易见的原因,我不想export COLUMNS
在我的普通 bash shell 中使用。
但是,出于一个特定子外壳的目的,我需要访问其父级的 COLUMNS 的值。换句话说,在常规的 bash shell 中,我想调用一个使用ls -Cw $COLUMNS
, 的 shell 脚本,其值$COLUMNS
来自其父级。
除了由父级导出之外,还有什么方法可以访问父级的环境变量?
linux - 在linux上用“echo -e”替换命令echo
我有一个包含这样内容的 shell 程序
一旦我在 Linux 以外的平台上运行该程序,它就会识别特殊字符并将输出显示为
当同一个程序在 Linux 上运行时,echo 命令需要“-e”选项。现在我不想在我的文件中显式地用“echo -e”更改每次出现的回声,因为这样会开始在其他平台上产生问题。所以我想做一个条件编译,比如
但这不起作用,因为使用 set 或 export 命令,我需要用 $echo 替换所有出现的 echo,我不想这样做。再次设置别名并不能解决此问题,因为即使在 subshell 中我也需要将 echo 替换为“echo -e”。
有没有其他方法可以用“echo -e”代替echo,仅适用于Linux平台?
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 查询。那么我应该怎么做才能让脚本改变那个变量呢?
bash - 将数学计算的结果分配给没有子壳的变量
我的问题是双重的。
第一的:
是否可以在不使用子外壳的情况下实现这一目标?
或这个?
如果我正确理解第二个,我将使用´和|创建 2 个子外壳。
第二
为这种东西创建/使用子shell会影响脚本的整体性能吗?
- 谢谢
bash - 使用 db2 变量“DB2DBDFT”通过用户 / using 连接到默认模式
我正在尝试编写一个执行一些 db2 工作的 bash 脚本。我面临的问题是子外壳需要重新连接 db2 连接。
不幸的是,每次重新连接都很慢,因为需要建立大约 1000 个新连接,每个需要大约一秒钟。因此,我希望避免这些子外壳重新连接。
通过谷歌搜索这种情况,我发现有一种方法可以使用变量 DB2DBDFT 设置默认连接模式。不幸的是,使用这个设置,Linux 登录用户名将成为您正在运行的 DB 模式名称,而我们的系统与登录 bash 的用户具有不同的 DB 用户名。
1)有没有办法设置 DB2DBDFT 变量,但使它可以使用“使用 123 的用户 abc”样式语法,或者如果有其他变量可以设置这些(我已经搜索但没有找到它们) .
2)如果有,这真的会节省我的时间吗?显然,如果我找到一个解决方案,我将进行基准测试,但我不确定即使我找到了这个,它会更快,而且肯定会减慢所有其他子shell 的生成速度。
3)我对其他建议非常开放,我尝试过管道到while语句而不是调用子shell,但后来记住这有同样的问题。
例如
相对
4)我确定还有其他我没有考虑过的途径,非常感谢任何建议和建议。
非常感谢,米奇。
bash - make -e 只退出子shell
我希望false
线打破一个子壳,但继续处理外循环。即预期的输出是
但是,我得到
好像||:
正好false
在行之后,而不是在子shell之后。
谁能解释一下,为什么会这样?