如何确保AIX bash中的PS1变量在脚本和程序的交叉调用之间继承?
假设一个程序向用户提供一个 shell 实例,例如shell
的命令vi
。这可以通过两种方式使用,其中一种是由脚本启动(请参见下面的第二种情况):
ksh prompt
->program
->“用户请求 shell”->ksh
- 脚本 ->
program
-> “用户请求 shell” ->ksh
这与 ksh 配合得很好。但是当使用 bash 时(在 AIX 中),我们注意到在第二种情况下 PS1 变量不是继承的,因此它具有默认值。
您可以使用 vi 来测试它,创建一个脚本,例如runvi.sh
:
# blablabla
# vi $1
当我们运行脚本并向 vi 询问 shell 时,提示符为:sh-4.3$
当然,当你直接运行 vi 时,它会要求输入 shell,提示符就是你之前定义的 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,如果不是继承的,则应预先在软件中进行配置。并且可以在所有 shell 和操作系统中继续工作。