AIX bash의 PS1 변수가 스크립트와 프로그램의 교차 호출 간에 상속되는지 확인하는 방법은 무엇입니까?
프로그램이 사용자에게 shell
명령 과 같은 셸 인스턴스를 제공한다고 가정합니다 vi
. 이는 두 가지 방법으로 사용될 수 있으며 그 중 하나는 스크립트에 의해 시작됩니다(아래 두 번째 사례 참조).
ksh prompt
->program
->"사용자 요청 쉘" ->ksh
- 스크립트 ->
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을 커스터마이징하려는 경우, 상속되지 않은 경우 소프트웨어에서 미리 구성해야 합니다. 그리고 모든 쉘과 운영 체제에서 계속 작동합니다.