1

The bash PS1 variable seemingly has access to all the shell's variables.

$ foo=bar
$ PS1='$foo '
bar # Works as expected.

But, setting a variable there does not work.

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

$ # Does not work.

Why, and how to make this work?

4

1 回答 1

3

为什么:

PS1变量被评估为一个字符串。在 bash 字符串中,您可以这样做:

$ myString="$foo"

和这个:

$ myString="Date: $(date)"

但不是这个:

$ myString="$(foo=bar)"

PS1变量根本不能免除此规则。

注意:正如mkelement0在评论中解释的那样,这是因为该foo=bar部分将在子外壳中执行,所以您可以这样做$(foo=bar;echo $foo)- 只是该变量将只存在于该范围内。

如何使这项工作:

还有一个变量,叫做PROMPT_COMMAND。在评估变量之前,此处的代码将eval()在每个提示字符串处出现。PS1

因此,即使只是按原样在这里写你的作业也可以:

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

不过,请记住检查您是否没有覆盖PROMPT_COMMAND您可能想要保留的先前设置的内容。

于 2014-06-18T22:59:45.070 回答