所有子流程均为Bash(!),


1

我尝试使用GDB,发现无论何时尝试生成我正在调试的程序,都会生成Bash(GDB会说starting myProg...,然后Bash出现。当我杀死Bash时,我会回到GDB中,会告诉我Bash的退出状态)。最初,我认为这是GDB的一个奇怪问题,但是后来我发现,尝试从Vim生成进程也只是生成了Bash。

经过一阵奇怪的启发,我将此问题与我的默认外壳程序是Tcsh联系了起来,并且由于不允许更改它,我只需将我的contains设置.tcshrcexec bash。当我将其更改为bash或仅使用Tcsh时,问题消失了。

我对Tcsh的问题如何导致我的问题完全不了解。有人可以提供吗?


顺便说一句,我能够通过运行GDB PATH="" /usr/bin/gdb而不是just 获得临时修复gdb。它吐出bash: command not found,然后继续生成我要调试的程序。


干杯们,我已经使用Linux 3到4年了,我从未想到通过这样的shell产生进程。
布伦丹

Answers:


1

我认为原因很明显是gdb使用shell生成进程。

Vim确实做到了(help !

:!{cmd}         Execute {cmd} with the shell.

所以当我们说:!ls -lVim实际上会执行时

$ SHELL -c 'ls -l'

我认为(只要我正确理解了您的骇客设置),可以执行exec bash -l而不是来轻松修复它exec bash

原因是,exec bash(不是登录外壳程序)不会更改SHELL环境变量,该环境变量稍后将由gdb和使用,vim并指向您的登录外壳程序(tcsh)。他们应该bash直接使用您选择的外壳()。

注意:您可能想考虑当运行一些用编写的程序时会发生什么tcsh。它可能不会表现出预期的效果。


2

其他答案的解释很好。

作为解决方案,我将设置export SHELL=bash许多命令(例如gdb或screen),使用此变量来确定用于生成命令的外壳类型。

因此,bash直接用于生成命令,而不是将tcsh配置为仅启动bash。


您也许可以通过使用ssh-key登录到服务器并将强制命令添加到authorized_keys文件中的密钥来改善设置。

这样,您可以直接从bash开始,但不会破坏任何tcsh脚本。


2

在您的.tcshrc文件中,您可以这样包装exec bash

if ($?prompt) then
    exec /path/to/bash
endif

$?prompt 对于非交互式shell,将为false,因此bash仅在进行交互式会话时使用。


0

我怀疑发生的事情是当您从GDB内部执行程序时,它正在启动一个子外壳来运行该程序并因此获得该rc文件。

exec手册页说:“ exec()系列函数用新的过程映像替换了当前过程映像”

我认为发生的事情是,当您在rc文件中调用exec时,它将替换您将要使用bash运行的内容,然后在退出时,使用bash退出代码返回GDB。如果您想将exec与bash一起使用并使程序运行,则可能需要弄清楚tcsh等效于Bash的argv的地方是将程序调用存储到要运行的任何内容,并将其传递给bash。

您还可以在该rc文件中查看并检查argv并确定您是否要运行程序,或者仅获取登录shell并根据该行为执行其他操作。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.