AIX bashのPS1変数がスクリプトとプログラムのクロスコールの間で継承されているかどうかを確認する方法は?
プログラムがユーザーにshell
コマンドなどのシェルインスタンスを提供すると仮定しますvi
。これは2つの方法で使用でき、そのうちの1つはスクリプトによって開始されます(以下の2番目のケースを参照)。
ksh prompt
->program
->「ユーザーリクエストシェル」 ->ksh
- スクリプト - >
program
- >「ユーザーリクエストシェル」 - >ksh
これはkshとうまく機能します。しかし、bashを使うとき(AIX で)、2番目の場合、PS1変数は継承されないため、デフォルト値があることがわかります。
viを使用してテストし、次のスクリプトを作成できますrunvi.sh
。
# blablabla
# vi $1
スクリプトを実行してviにシェルを要求すると、プロンプトは次のようになります。sh-4.3$
もちろん、viを直接実行するとシェルが必要になり、プロンプトは前述のPS1になります。
上記のテストと実際のプログラムの固有の違いは、プログラムでbashがPS1値を表示するため、bash-4.3$
PS1継承の問題が同じように見えることです。このCプログラムはこれを表示できます。
#include <stdlib.h>
main() { system("$SHELL"); }
ヒットバージョン:
bash-4.3$ bash -version
GNU bash, version 4.3.30(1)-release (powerpc-ibm-aix5.1.0.0)
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
AIXバージョン
動作はAIX 5.3と7の間で同じです。
OBS:Ubuntuではこれは起こりません。
答え1
解決策:
// C code snippet
#define CMDPATTERN_PS1_PRESET "export PS1='%s';$SHELL"
#define CMDPATTERN_PS1_NOSET "$SHELL"
char* cmdpattern = (userPS1!=NULL && *userPS1 != NULL) ?CMDPATTERN_PS1_PRESET :CMDPATTERN_PS1_NOSET;
sprintf(shellcmd, cmdpattern, userPS1);
system(shellcmd);
したがって、ユーザーがPS1をカスタマイズしたい場合は、継承されていない場合はソフトウェアで事前設定する必要があります。そして、すべてのシェルとオペレーティングシステムで動作し続けます。