AIX에서 bash를 사용하는 스크립트와 프로그램 간의 PS1 변수 상속

AIX에서 bash를 사용하는 스크립트와 프로그램 간의 PS1 변수 상속

AIX bash의 PS1 변수가 스크립트와 프로그램의 교차 호출 간에 상속되는지 확인하는 방법은 무엇입니까?

프로그램이 사용자에게 shell명령 과 같은 셸 인스턴스를 제공한다고 가정합니다 vi. 이는 두 가지 방법으로 사용될 수 있으며 그 중 하나는 스크립트에 의해 시작됩니다(아래 두 번째 사례 참조).

  1. ksh prompt-> program->"사용자 요청 쉘" ->ksh
  2. 스크립트 -> program-> "사용자 요청 셸" ->ksh

이것은 ksh와 잘 작동합니다. 하지만 bash를 사용할 때(AIX에서), 두 번째 경우 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:우분투에서는 이런 일이 일어나지 않습니다.

답변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을 커스터마이징하려는 경우, 상속되지 않은 경우 소프트웨어에서 미리 구성해야 합니다. 그리고 모든 쉘과 운영 체제에서 계속 작동합니다.

관련 정보