我的家乡世界是写一个外壳。我必须使用$PS2
。
但是当我写这样的代码时:
char *ENV_ps2;
ENV_ps2 = getenv("PS2");
我刚发现ENV_ps2
指向(null)
。
我怎样才能在我的程序中获得$PS2
?
答案 0 :(得分:6)
PS1
和PS2
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源代码。它既庞大又复杂,但搜索PS1
和PS2
可能具有指导意义。 (你不必使用与bash完全相同的机制;你可能想要更简单的东西。)
(您可以输入export PS1
将$PS1
转换为环境变量,但这样做没有多大意义。)
答案 2 :(得分:1)
不会导出这些env变种。
如果你想要一个非可移植的方法,你可以定义和导出一个任意的环境变量,并在你的.bashrc / .bash_profile中将PS1 / PS2设置为该值。
例如:
# bashrc
MY_PS1="..........."
export $MY_PS1
...
...
...
PS1=$MY_PS1