我编写了名为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());
没有效果。
有什么建议吗?
答案 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