在 AIX 中使用 bash 的脚本和程序之间的 PS1 变量继承

在 AIX 中使用 bash 的脚本和程序之间的 PS1 变量继承

如何确保AIX bash中的PS1变量在脚本和程序的交叉调用之间继承?

假设一个程序向用户提供一个 shell 实例,例如shell的命令vi。这可以通过两种方式使用,其中一种是由脚本启动(请参见下面的第二种情况):

  1. ksh prompt-> program->“用户请求 shell”->ksh
  2. 脚本 -> 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 和操作系统中继续工作。

相关内容