【问题标题】:Bash quote nesting and curly bracesBash 引用嵌套和花括号
【发布时间】:2020-07-26 11:45:09
【问题描述】:

根据Change gnome-terminal title to reflect the current directory?我尝试过使用:

PROMPT_COMMAND='echo -ne "\033]0;$(basename ${PWD})\007"'

...在我的~/.bashrc 标题栏中标明当前目录的名称。

在大多数情况下它工作正常;但如果我尝试从以下目录打开gnome-terminal

/run/user/1000/gvfs/mtp:host=%5Busb%3A001%2C008%5D/Internal shared storage/DCIM/Camera

...然后它失败了:

basename: extra operand ‘storage/DCIM/Camera’
Try 'basename --help' for more information.

...每次提示即将显示在终端中。

显然问题在于目录名称中的空格(即使${PWD} 中的花括号原则上应该不需要引号)。所以,我尝试用引号转义,结果证明这不是微不足道的(显然只是单引号转义 \"${PWD}\" 不起作用) - 我能做到的最好的是:

PROMPT_COMMAND='echo -ne "\033]0;$(basename \\\\"${PWD}\\\\")\007"'

... 它可以正常工作 - 但它会在 gnome-terminal 标题中打印一个额外的反斜杠;例如,在本例中,标题为:Camera\

PROMPT_COMMAND 的正确构造是什么,因此它可以正确处理带有空格的目录,并且只打印没有附加反斜杠的目录(例如 Camera)?

【问题讨论】:

    标签: bash whitespace filenames


    【解决方案1】:

    你为什么要逃避你的双引号?

    PROMPT_COMMAND='echo -ne "\033]0;$(basename "${PWD}")\007"'
    

    应该是正确的。我们可以遍历嵌套的层次:

    • 顶层单引号。在单引号内,您不需要转义双引号。您需要通过'\''“转义”单引号(实际上,这是字符串连接,但这与此处无关)。

    • 第二层双引号。在双引号内,如果你想写文字",你需要\"。但是,您还有第三层:

    • $() / 命令替换。该层在执行时不会看到它周围的双引号(单引号将是另一回事 - 你需要'\'')。 Bash 将正确解析 echo "$(echo "my variable is $foo")" 之类的内容。


    另外,${PWD} 中的花括号与引号无关。从任何角度来看,${PWD}$PWD 之间没有区别。只有当你的变量与其他“单词”字符相撞时,花括号才会起作用:

    echo PWD_$PWD_USER_$USER // expands variables "USER" and "PWD_USER_"
    echo PWD_${PWD}_USER_$USER // expands variables "USER" and "PWD"
    

    【讨论】:

    • 谢谢,@jeremysprofile - 我试图逃避那些PWD 引号,因为我认为它们会干扰-ne 之后的双引号;感谢这个答案,现在我知道了! (我显然也混淆了我对花括号的了解)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-15
    • 2021-10-13
    • 2017-02-27
    • 2019-02-07
    • 2013-06-30
    • 2013-04-21
    • 2013-09-15
    相关资源
    最近更新 更多