【问题标题】:Can I open bash from a popen() stream?我可以从 popen() 流中打开 bash 吗?
【发布时间】:2012-08-28 00:53:13
【问题描述】:

根据 popen() 的手册页,我正在打开 /bin/sh...有没有办法可以重载此行为以打开 /bin/bash shell 并与 BASH shell 脚本交互?还是我需要打开一个 pty 样式的连接才能做到这一点?

【问题讨论】:

  • 请记住,在大多数 Linux 系统上,/bin/sh 符号链接到 /bin/bash
  • 最多?也许但不是在 Ubuntu 上。
  • @JoachimPileborg 是的,但是当以sh 调用时它具有不同的行为。

标签: c linux bash shell popen


【解决方案1】:

可能最简单的方法是有一个小的 sh 脚本,它反过来调用你的 bash 脚本,如下所示:

#!/bin/sh

exec bash yourscript.sh "$@"

或者你可以放弃popen,使用fork() 和execl() 实现你自己的popen。

【讨论】:

  • 单独的 sh 脚本没用。你不妨直接在 bash 脚本上调用popen
  • 没用,我觉得有点多。令人费解的是,但它会起作用。不过,为您的答案+1。感谢您的编辑。
【解决方案2】:

如果您想在传递给popen 的 sn-p 中使用 bash 结构,您可以从 sh 显式调用 bash。

f = popen("exec bash -c 'shopt -s dotglob; cat -- *'", "r");

如果您在 bash sn-p 中需要单引号,请将它们传递为 '\''。所有其他字符都按字面传递。

如果您想要运行现有的 bash 脚本,只需指定其路径,与任何脚本或其他程序相同。确保脚本是可执行的并且以#!/usr/bin/env bash#!/bin/bash 开头。如果您有一个可能无法执行的脚本(例如由于 Windows 可移植性限制),您可以显式调用 bash:

f = popen("exec bash myscript.bash", "r");

或者,编写您自己的自定义 popen 类函数来调用您想要的程序(但只有在更简单的解决方案不能令人满意时才这样做,因为它更难正确处理)。参见例如popen() alternative.

【讨论】:

  • 这正是我需要知道的。谢谢!!!此外,您的示例链接中的链接将我引向用于生成 GLIB 中的进程的夹克。我认为这正是我所需要的......
猜你喜欢
  • 2013-12-01
  • 2011-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-10
  • 2011-08-13
  • 2021-01-25
相关资源
最近更新 更多