8

我的家乡是写一个shell。我必须使用$PS2.

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

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

我刚刚发现ENV_ps2是指向(null).

我怎么能$PS2在我的程序中获得?

4

3 回答 3

8

和shell 变量不会被导出PS1,因此无法从子进程访问。您可以使用一个简单的脚本对此进行测试:PS2

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

echo PS1=$PS1
echo PS2=$PS2


$ /tmp/pstest.sh 
PS1=
PS2=
于 2012-05-08T15:40:15.167 回答
2

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

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

如果您正在编写自己的 shell,那么做类似的事情可能是有意义的。

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

(你可以键入export PS1变成$PS1环境变量,但这样做没有多大意义。)

于 2012-05-08T17:45:05.073 回答
1

这些环境变量不会被导出。

如果您想要一种非便携式方法,您可以定义并导出任意环境变量,然后在 .bashrc/.bash_profile 中将 PS1/PS2 设置为该值。

例如:

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

...
...
...
PS1=$MY_PS1
于 2012-05-08T16:21:57.530 回答