通过变量调用命令时出现空格错误

时间:2016-08-23 11:17:30

标签: bash macos

要设置场景,我正在编辑我的/.bash_profile,并希望当前目录以及我PS1中所述目录中的文件。虽然它有效,但我的间距出现了一个奇怪的错误:

lines=$(ls | wc -l)
PS1='\n\e[2m(\w) ($lines)\e[22m\n> '

我不明白为什么会这样,据我所知 - 代码不应该添加那个空格。

section#page1 {
    background: url('../img/background.jpg') no-repeat center center fixed;
    -webkit-background-size: cover;
    -moz-background-size: cover;
    -o-background-size: cover;
    background-size: cover;
    height: 100vh;
    overflow-x: hidden;
    overflow-y: scroll;
}

我不知道为什么会这样,并且有一些Bash魔法的人会很方便。

1 个答案:

答案 0 :(得分:2)

PS1与大多数变量略有不同,至少在如何使用它时。它的值不会简单地打印到标准错误以显示提示,这很明显,如果您将提示与echo "$PS1"的输出进行比较。

评估规则与正常评估规则不同,您可以在此处看到$lines值的前导空格在提示时未从$lines的未加引号扩展中删除终于显示了。

解决此问题的一种方法是使用执行正常评估的shell命令替换普通参数扩展,然后捕获该命令的输出以在提示中使用:

PS1='\n\e[2m(\w) ($(echo $lines))\e[22m\n> '

更好的是,不要解析ls的输出:创建一个数组并输出它的长度:

PS1='\n\e[2m(\w) ($(f=(*); echo ${#f[@]}))\e[22m\n> '

(另外,除非您在每个提示之前重置lines的值,例如在PROMPT_COMMAND中,否则您将始终显示{{1}时所在目录的文件数设置了,可能是您的主目录。在中获取文件计数提示本身可以获取当前目录的文件数,无论可能是什么。)