2

私は、実際のシェル名 (通常は bash) とそのパラメーターをパラメーターとして取る MyShell という cpp アプリケーションを作成しました。MyShell はそのラッパーとして機能します。

内部シェル、特に PS1 環境変数のコマンド プロンプトを変更する必要があります。

PS1環境変数を使用してコマンドラインで行う方法を知っています:

$ 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 からコマンドを実行します (ユーザーのオプションによって異なります)。これらのスクリプトは PS1 var も再定義します。だから私の

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

効果はありません。

なにか提案を?

4

3 に答える 3

2

デフォルト設定からプロンプトのみを変更したい場合は、シェルを起動する前に cpp アプリケーションに追加または追加export PS1="[myshell]"$PS1し、完了後にそれを抑制することができます。~/.bashrc~/.profile

編集

元のファイルを変更したくない場合は、次のように~/.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

You can stop bash reading the .bahsrc files by using the command --norc and the profiles by --noprofile

e.g.

bash --noprofile --norc
于 2010-02-02T15:00:33.420 に答える