Linux 为什么env不打印PS1变量?

Linux 为什么env不打印PS1变量?,linux,bash,environment-variables,Linux,Bash,Environment Variables,当我们打印PS1的值时,设置为: $ echo $PS1 [\u@\h \W]\$ 我们可以使用env命令打印环境变量。为什么它不列出PS1变量 $ env | grep PS1 # No output here 因为PS1(通常,在您的特定情况下)不是环境变量 bash实例中设置了许多变量,您可以使用这些变量列出: $ set BASH=/bin/bash BASHOPTS=checkwinsize:cmdhist:… BASH_ALIASES=() BASH_ARGC=() . . SH

当我们打印
PS1
的值时,设置为:

$ echo $PS1
[\u@\h \W]\$
我们可以使用
env
命令打印环境变量。为什么它不列出
PS1
变量

$ env | grep PS1
# No output here
因为PS1(通常,在您的特定情况下)不是环境变量

bash实例中设置了许多变量,您可以使用这些变量列出:

$ set
BASH=/bin/bash
BASHOPTS=checkwinsize:cmdhist:…
BASH_ALIASES=()
BASH_ARGC=()
.
.
SHLVL=1
SSH_AGENT_PID=853
SSH_AUTH_SOCK=/tmp/ssh-Ofupc03xWIs7/agent.795
TERM=xterm-256color
但其中许多都不是环境变量。例如:

$ echo "$PPID"
1062

$ env | grep PPID
您可以使用
export
将变量添加到环境中。因此,PS1可以设置为环境变量:

$ export PS1
$ env | grep PS1
PS1=\u@\h:\w\$
$ unset PS1
$ env | grep PS1
并且可以通过使用declare删除变量的导出标志来取消导出变量(declare将保留变量的值,只是不导出):

或者,更彻底地,通过
unset
ing变量:

$ export PS1
$ env | grep PS1
PS1=\u@\h:\w\$
$ unset PS1
$ env | grep PS1
在bash中,
declare
可用于打印变量的标志:

$ declare -p PS1
declare -- PS1="\${debian_chroot:+(\$debian_chroot)}\\u@\\h:\\w\\\$ "

$ export PS1

$ declare -p PS1
declare -x PS1="\${debian_chroot:+(\$debian_chroot)}\\u@\\h:\\w\\\$ "

请注意导出变量后为变量设置的
-x

根据变量PS1的设置位置,可以将其视为本地变量或环境变量(请参见此设置环境变量)


如果它是本地的,则不能使用env打印它。但是您可以使用命令set打印它

在我的系统上,我有PS1.set | grep PS1 PS1='\h:\W\u\$'。此外,您还可以将变量永久添加到环境中。@terencehill您的意思是什么?你把PS1作为一个变量?是的,这个系统也有。作为环境变量?有时可能是这样。我的意思是,环境变量只是系统启动时加载的变量。@sorontar不导出
PS1
绝对没有意义。这意味着,如果您从shell启动shell,您将失去提示。如果未导出
PS1
,这可能被视为一个bug。@sorontar@terrence hill@hek2mgl感谢您的讨论,这是非常有用的。现在我回想起来,PS1实际上是一个属于shell的变量,而不是运行其他程序的环境,当然,除非我们导出PS1。您应该尝试使用命令“set | grep PS1”。您可以使用
declare+x var
从环境中删除一个变量。