如何从bash$PS1设置变量

如何从bash$PS1设置变量,bash,variable-assignment,ps1,Bash,Variable Assignment,Ps1,bash PS1变量似乎可以访问shell的所有变量 $ foo=bar $ PS1='$foo ' bar # Works as expected. 但是,在那里设置变量不起作用 $ PS1='$(bar=baz)\$ ' $ echo $bar $ # Does not work. 为什么,以及如何做到这一点?为什么: PS1变量作为字符串计算。在bash字符串中,可以执行以下操作: $ myString="$foo" 这是: $ myString="Date: $(date)"

bash PS1变量似乎可以访问shell的所有变量

$ foo=bar
$ PS1='$foo '
bar # Works as expected.
但是,在那里设置变量不起作用

$ PS1='$(bar=baz)\$ '
$ echo $bar

$ # Does not work.
为什么,以及如何做到这一点?

为什么: PS1变量作为字符串计算。在bash字符串中,可以执行以下操作:

$ myString="$foo"
这是:

$ myString="Date: $(date)"
但不是这个:

$ myString="$(foo=bar)"
PS1变量不能完全免除此规则

注意:正如注释中所解释的,这是因为foo=bar部分将在子shell中执行,因此您可以执行$foo=bar;不过,echo$foo——只是变量将只存在于该范围内

如何做到这一点: 还有另一个变量,叫做PROMPT_COMMAND。在计算PS1变量之前,将在每个提示字符串处计算这里的代码

因此,即使只是按原样在这里写作业也会奏效:

$ PROMPT_COMMAND='bar=baz'
$ echo $bar
baz # Works!

请记住检查您是否没有覆盖您可能希望保留的PROMPT_命令中以前设置的内容。

shell是在显示提示之前解释PS1内容的进程,因此$$将只引用shell进程。@D.Shawley如果我在PS1中放入$show-me-the-PID.sh之类的脚本,PID每次都会改变。我这么说是因为作为一个新手,这种行为对我来说是意外的。在这种情况下,PS1的评估是创建一个子流程,并在新的子流程中运行show-me-the-PID.sh。@D.Shawley是的,这对我来说是意外的,因为脚本语言通常不会这样做,但我发现注意到这一事实可能很愚蠢,术语说明:你说的是shell变量,不是环境变量。所有环境变量也表示为shell变量,但反过来则不正确。您的代码中的bar仅仅是一个shell变量。一般来说很有用,但“将其预先添加到PS1变量”令人困惑:也许您的意思是$PROMPT_命令的输出(如果有)在显示主提示符之前打印。至于为什么$foo=bar不能按您希望的方式工作:$。。。被称为命令替换,它在子shell中运行封闭的命令,子shell是接收当前shell环境副本的子进程,但不能更改当前shell的环境。但是请注意,变量赋值在子shell中是有效的。谢谢@mklement0,用您的输入编辑了答案。谢谢更新+1.