Запустите bash с переопределенной переменной env для PS1 - PullRequest
2 голосов
/ 02 февраля 2010

Я написал приложение cpp под названием MyShell, которое принимает в качестве параметров некое реальное имя оболочки (обычно 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 вар тоже. Так что мой

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

не имеет никакого эффекта.

Есть предложения?

Ответы [ 3 ]

2 голосов
/ 02 февраля 2010

Если вы хотите изменить только приглашение из настроек по умолчанию, вы можете добавить export PS1="[myshell]"$PS1 к ~/.bashrc или ~/.profile из вашего приложения cpp перед запуском вашей оболочки и отключить его после завершения.

EDIT

Если вы не хотите изменять исходный файл ~/.bashrc, вы можете задействовать:

bash --rcfile /tmp/myCustomPS1

с /tmp/myCustomPS1, содержащим:

if [ -f ~/.bashrc ]
then
    . ~/.bashrc
fi
export PS1="[myshell]"$PS1
1 голос
/ 02 февраля 2010

Как только подпроцесс (дочерний элемент) bash вызывается, он может делать со своей средой все, что захочет.Это включает в себя замену ваших значений для PS1 на что-то другое.В конце концов, это просто переменная среды.

Родительский процесс не может заставить дочерний процесс сохранять определенные переменные среды.Родительский процесс может передавать определенные переменные среды, но это все.

Вы можете делать другие вещи с помощью PROMPT_COMMAND и т. Д., Но все они могут быть переопределены дочерним процессом.

Если выЧтобы дочерний процесс принудительно применял определенное поведение по отношению к переменным среды, вам нужно изменить эту программу, добавив в нее нужное поведение.

Тогда у вас будет собственное приглашение.Вероятно, даже следует свернуть все, что вы делаете в MyShell, и покончить с этим.

0 голосов
/ 02 февраля 2010

Вы можете остановить bash, читая файлы .bahsrc, используя команду --norc, а профили --noprofile

, например

bash --noprofile --norc
...