2

我已经编写了名为 MyShell 的 cpp 应用程序,它将一些真实的 shell 名称(通常是 bash)及其参数作为参数。MyShell 用作它的包装器。

我需要更改内壳的命令提示,特别是 PS1 环境变量。

我知道如何使用 PS1 env var 以命令行方式进行操作:

$ PS1="[myshell]"$PS1

[myshell]$ 

但是从 cpp 应用程序中做到这一点并不容易:

string newPS1 = "[myshell]" + string(getenv("PS1"));
setenv("PS1", newPS1.c_str());
if (execvp(shell, argv) < 0) {
    cerr << "can not exec " << shell << ": " << strerror(errno) << endl;
    exit(1);
}

afaik,当 bash 被调用时,它从 /etc/.bashrc 或 /etc/profile 执行命令(取决于用户选项)。这些 scipts 也重新定义了 PS1 var。所以我的

setenv("PS1", newPS1.c_str());

没有效果。

有什么建议吗?

4

3 回答 3

2

如果您只想更改默认设置的提示,您可以在启动 shell 之前附加export PS1="[myshell]"$PS1到cpp 应用程序~/.bashrc~/.profile从 cpp 应用程序附加,并在完成后取消它。

编辑

如果您不想更改原始~/.bashrc文件,您可以调用:

bash --rcfile /tmp/myCustomPS1

包含/tmp/myCustomPS1

if [ -f ~/.bashrc ]
then
    . ~/.bashrc
fi
export PS1="[myshell]"$PS1
于 2010-02-02T14:57:23.360 回答
1

一旦调用了 bash 的子进程(子进程),它就可以随意使用它的环境。这包括将 PS1 的值替换为其他值。毕竟,它只是一个环境变量。

父进程不能强制子进程保留某些环境变量。父进程可以传递某些环境变量,仅此而已。

您可以使用 PROMPT_COMMAND 等做其他事情,但所有这些都可以被子进程覆盖。

如果您希望子进程对环境变量强制执行某些行为,则必须修改该程序以添加您想要的行为。

然后,您将拥有自己的自定义提示。甚至可能应该将您在 MyShell 中所做的任何其他事情卷入其中并完成它。

于 2010-02-02T15:23:40.440 回答
0

您可以使用命令 --norc 停止 bash 读取 .bahsrc 文件,使用 --noprofile 停止读取配置文件

例如

bash --noprofile --norc
于 2010-02-02T15:00:33.420 回答