linux - 在 bash 进程替换完成输入后,如何继续发送到标准输入?

标签 linux bash gdb pipe stdin

我正在使用 gdb .

我运行如下命令,通过将输入发送到标准输入来设置程序:

r < <(python -c "print '1\n2\n3'")

我希望该命令允许我在完成后开始输入输入(这样我就可以正常地与调试对象交互)而不是关闭标准输入。

这可以在 bash 中工作,但您不能通过管道传输到 gdb r这样命令:

cat <(python -c "print '1\n2\n3'") - | r

以下不起作用,我假设它在将其发送到程序之前等待 EOF。

r < <(cat <(python -c "print '1\n2\n3'") -)

是否还有第三种选择?

最佳答案

这听起来像是 expect 的工作.

给定

#include <stdio.h>

int main()
{
  char *cp = NULL;
  size_t n = 0;


  while(getline(&cp, &n, stdin) >= 0) {
    fprintf(stderr, "got: %s", cp);
  }

  return 0;
}

gcc -g -Wall t.c

这个期望脚本:

#!/usr/bin/expect

spawn gdb -q ./a.out

send run\n
send 1\n2\n3\n

interact

这是 session :

$ ./t.exp
spawn gdb -q ./a.out
run
1
2
3
Reading symbols from ./a.out...done.
(gdb) run
Starting program: /tmp/a.out
got: 1
got: 2
got: 3

现在脚本正在等待我的输入。我提供一些:

foo bar baz
got: foo bar baz

我还可以与 GDB 交互:

^C
Program received signal SIGINT, Interrupt.
0x00007ffff7b006b0 in __read_nocancel () at ../sysdeps/unix/syscall-template.S:81
81  ../sysdeps/unix/syscall-template.S: No such file or directory.
(gdb) bt
#0  0x00007ffff7b006b0 in __read_nocancel () at ../sysdeps/unix/syscall-template.S:81
#1  0x00007ffff7a8f5a0 in _IO_new_file_underflow (fp=0x7ffff7dd4640 <_IO_2_1_stdin_>) at fileops.c:613
#2  0x00007ffff7a840d5 in _IO_getdelim (lineptr=0x7fffffffdda0, n=0x7fffffffdda8, delimiter=10, fp=0x7ffff7dd4640 <_IO_2_1_stdin_>) at iogetdelim.c:77
#3  0x000000000040064e in main () at t.c:9

关于linux - 在 bash 进程替换完成输入后,如何继续发送到标准输入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40923424/

相关文章:

linux - 从 IPsec 隧道转发流量

linux - "Permission denied"启动时运行命令

arrays - 数组在 bash 脚本中消失

使用 GDB 远程调试器时,linux 系统调用永远不会返回

Linux:在不破坏后续核心转储的寄存器的情况下监听信号?

linux - 检查子文件夹是否存在linux

linux - Grep 多个字符串

bash - 通过 udev 的 USB 详细信息

ruby - 如何指定用于 ruby​​ 系统调用的 shell?

c++ - 如何在 GDB 中编译 C++ 代码?