使用重新定义的PS1 env变量运行bash

时间:2010-02-02 14:52:37

标签: c++ bash environment-variables prompt

我编写了名为MyShell的cpp aplication,它将params作为一些真正的shell名称(通常是bash)及其params。 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());

没有效果。

有什么建议吗?

3 个答案:

答案 0 :(得分:2)

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

修改

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

bash --rcfile /tmp/myCustomPS1

/tmp/myCustomPS1包含:

if [ -f ~/.bashrc ]
then
    . ~/.bashrc
fi
export PS1="[myshell]"$PS1

答案 1 :(得分:1)

一旦调用了bash的子进程(子进程),它就可以随心所欲地处理它的环境。这包括用其他东西替换PS1的值。毕竟,它只是一个环境变量。

父进程无法强制子进程保留某些环境变量。父进程可以传递某些环境变量,但就是这样。

您可以使用PROMPT_COMMAND等进行其他操作,但所有这些都可以被子进程覆盖。

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

然后你会有自己的自定义提示。可能甚至应该将你在MyShell中做的任何事情都推到这里并完成它。

答案 2 :(得分:0)

您可以使用命令--norc和--noprofile

命令停止bash读取.bahsrc文件

e.g。

bash --noprofile --norc