Linux getenv()无法获得$ PS1或$ PS2

时间:2012-05-08 15:37:15

标签: c linux shell environment-variables

我的家乡世界是写一个外壳。我必须使用$PS2

但是当我写这样的代码时:

char *ENV_ps2;
ENV_ps2 = getenv("PS2");

我刚发现ENV_ps2指向(null)

我怎样才能在我的程序中获得$PS2

3 个答案:

答案 0 :(得分:6)

PS1PS2 shell变量不是导出的,因此无法从子进程访问。您可以使用简单的脚本对此进行测试:

$ cat /tmp/pstest.sh
#!/bin/sh

echo PS1=$PS1
echo PS2=$PS2


$ /tmp/pstest.sh 
PS1=
PS2=

答案 1 :(得分:2)

在bash中,$PS1$PS2是shell变量,而不是环境变量(至少通常是这样)。它们在bash中设置为默认值,或者由用户以交互方式或在.profile.bashrc等启动脚本中显式设置。

无法通过getenv()访问它们,并且它们不会被分叉子进程继承。它们由shell自己的shell变量机制在内部管理。

如果您正在编写自己的shell,那么执行类似的操作可能是有意义的。

您可以查看bash源代码。它既庞大又复杂,但搜索PS1PS2可能具有指导意义。 (你不必使用与bash完全相同的机制;你可能想要更简单的东西。)

(您可以输入export PS1$PS1转换为环境变量,但这样做没有多大意义。)

答案 2 :(得分:1)

不会导出这些env变种。

如果你想要一个非可移植的方法,你可以定义和导出一个任意的环境变量,并在你的.bashrc / .bash_profile中将PS1 / PS2设置为该值。

例如:

# bashrc
MY_PS1="..........."
export $MY_PS1

...
...
...
PS1=$MY_PS1