【问题标题】:Bash prompt spacing issueBash提示间距问题
【发布时间】:2018-04-18 17:06:28
【问题描述】:

所以我从这个 reddit 线程中找到了一个很酷的 bash 提示: https://www.reddit.com/r/archlinux/comments/5vusvx/here_is_my_bash_prompt_whats_your_favorite/

我正在测试的是@khordes 的最高评论。这是预期的: https://imgur.com/a/t3evh

但是,我得到了一些不同的东西。这就是问题所在:

───[~]───[ 33 files, 2334400]

如您所见,在文件数量之前有相当多的空间。实际代码在这里:

PS1="┌─[\`if [ \$? = 0 ]; then echo \[\e[32m\]✔\[\e[0m\]; else echo \[\e[31m\]✘\[\e[0m\]; fi\`]───[\[\e[01;49;39m\]\u\[\e[00m\]\[\e[01;49;39m\]@\H\[\e[00m\]]───[\[\e[1;49;34m\]\W\[\e[0m\]]───[\[\e[1;49;39m\]\$(ls | wc -l) files, \$(ls -lah | grep -m 1 total | sed 's/total //')\[\e[0m\]]\n└───▶ "

任何有关如何解决此问题的意见将不胜感激。

【问题讨论】:

  • 您是否真的希望每次打印提示时都会产生所有性能开销?这个命令并不便宜。
  • 无论如何,$(ls | wc -l) 确实有空格。我想继续糟糕的趋势,你可以做到$(ls | wc -l | tr -d '[[:space:]]')
  • (另外,请参阅pubs.opengroup.org/onlinepubs/9699919799/utilities/echo.html 中的应用程序用法和基本原理部分,了解为什么在 echo 中使用反斜杠转义序列是一个坏主意;printf 是首选替代品,它会表现在所有 POSIX 兼容的 shell 中保持一致)。
  • ...顺便说一句,如果您只想在更改目录时执行更昂贵的操作,而不是每次打印提示时,请考虑遵循stackoverflow.com/questions/49882286/… 的答案中给出的模式
  • PROMPT_COMMAND=set_prompt; set_prompt () { PS=; ...; PS1+="┌─[$status]───[$userhost]───[$dir]───[$file_info]\n" PS1+="└───▶"; }... 是设置对提示有贡献的四个变量的代码,可以更轻松地理解提示的构建方式以及以后对其进行修改。跨度>

标签: bash unix prompt


【解决方案1】:

此提示使用$(ls | wc -l) 列出当前目录中的文件。

在 GNU 平台上,wc -l 在未传递任何文件名时没有前面的空格。

在 BSD 平台(如 MacOS)上,数字以空格为前缀。

因此,此提示的作者可能在 Linux 变体或其他 GNU 平台上对其进行了测试,我假设您正在运行 MacOS 或其他 BSD。为了保持一致,您需要确保删除此类空间——或切换到一种机制来列出不依赖于wc 的文件,例如BashFAQ #4 中给出的机制。

一种替代方法如下:

$(shopt -s nullglob; set -- *; echo "$#")

【讨论】:

  • 这修复了空白问题,但不显示目录中有多少文件。我原帖中的 cmets 回答了我的问题。
  • 哪一部分没有显示目录中有多少文件? shopt -s nullglob; set -- *; echo "$#" 方法确实显示了当前目录中的条目数(在创建的子shell 中设置参数列表以对当前目录中的条目进行命令替换,然后显示所述列表中的项目数)。
  • 嗯。我插入了这个而不是上面的,发现它显示了 0 个文件。这应该附加到上面吗?
  • 我猜它并没有逃脱以防止在分配时进行评估。以上是它在 PS4 中的表现方式——如果你用双引号指定它​​(你不应该这样做),则需要一些反斜杠。
  • (为明确起见,将"..." 更改为'...' 以使$s 不再特殊)。
猜你喜欢
  • 2012-05-22
  • 1970-01-01
  • 1970-01-01
  • 2021-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-29
相关资源
最近更新 更多