【问题标题】:PS1 command substitution fails when containing newlines on msys bash在 msys bash 上包含换行符时 PS1 命令替换失败
【发布时间】:2014-02-02 22:46:59
【问题描述】:

此命令成功

$ PS1='$(日期+%s)$' 1391380852 $

但是,如果我添加一个换行符,它会失败

$ PS1='$(日期+%s)\n$' bash:命令替换:第 1 行:意外标记 `)' 附近的语法错误 bash:命令替换:第 1 行:`date +%s)'

如果我使用反引号,它会起作用

$ PS1='`日期+%s`\n$' 1391381008 $

但是backticks are discouraged。那么是什么导致了这个错误呢?

GNU bash,版本 4.2.45(6)-发布

【问题讨论】:

  • 它对我来说很好用。您使用的是什么 bash 版本?我安装了GNU bash, version 4.2.45(2)-release
  • 即使使用 bash 3 和 KSH(除了带有 KSH 的 \n),它也对我有用。
  • 4.2.45(6) 的任何特定供应商包,还是上游的库存?
  • 很难想象哪个跟随右括号的字符导致该括号被视为被替换命令的文字部分,而不是命令替换的右标记.解析必须是复杂的,在流中向后跳转,或者奇怪的前瞻。
  • @Kaz,)) 是与) 不同的标记,因此一定量的前瞻是强制性的。但是,是的,这是一个有趣的问题——它依赖于平台,使它加倍如此。

标签: bash backticks ps1 command-substitution


【解决方案1】:

您可以轻松消除解析歧义,以防止遇到任何此类错误(尽管我自己无法重现):

PS1='$(date +%s)'$'\n$ '

$'\n' 语法解析为文字换行符,而 '\n' 解析为包含两个字符 \n 转义序列的字符串。

有关$''''(扩展反斜杠转义序列)有何不同的更多信息,请参阅Bash Hackers Wiki

【讨论】:

  • 像魅力一样工作。在我使用 MSYS2 编译的 bash (GNU bash, version 4.2.45(6)-release (x86_64-pc-msys) 的情况下出现了问题。谢谢。
  • 好的,我解决了双引号"bla \n bla"变成"bla "$'\n'" bla"。通过良好的旧试验和错误解决,并阅读有关 Bash 转义的信息......
  • @oligofren, ...要记住的一件事是,shell 不需要一个单词就可以以相同的方式具有相同的引用样式;例如,您可以使用literal"double-quoted"'single-quoted' 生成一个单词,在解析时使用三种不同的引用类型处理其不同部分。这正是我在答案中所做的,切换到 $'' 引用类型以注入文字换行符。
  • @oligofren,这是一种不同的引用形式,导致对事物的解析方式不同。 $'\n' 解析为单字符文字换行符,而 '\n' 解析为两个字符序列,文字反斜杠后跟文字 n
  • 谢谢您 -- 希望现在应用的编辑得到您的批准。
【解决方案2】:

当我尝试在 Windows 上的 bash (MSYS2) 上将其包含在我的 PS1 中时,我遇到了与 .git-prompt 类似的问题。问题是\n,如果我删除它,一切运行顺利,但我想换行。

顺便说一句,在 Linux 上一切正常。

bash 运行的是:4.3.42(5)-release (x86_64-pc-msys)

旧的、有问题的 PS1:

PS1='\e[32m\]\u@\h \e[36m\]\w \e[32m\]$(__git_ps1 "(%s)")\nλ \e[0m\]$(tput sgr0)'

固定:

PS1='\e[32m\]\u@\h \e[36m\]\w \e[32m\]$(__git_ps1 "(%s)")'$'\nλ \e[0m\]'

简化版(无颜色,复制粘贴编辑):

PS1='\u@\h \w $(__git_ps1 "(%s)")'$'\n$ '

干杯Charles Duffy找到问题!

【讨论】:

    【解决方案3】:

    $'\n' hack 仍然在我的 git-bash Windows VSCode 终端中导致语法错误。经过大量的试验和错误,我设法通过使用换行符的八进制等效项来修复它,即\012

    简而言之,将出现语法错误的\n 替换为\012

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多