Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash提示间距问题_Bash_Unix_Prompt - Fatal编程技术网

Bash提示间距问题

Bash提示间距问题,bash,unix,prompt,Bash,Unix,Prompt,因此,我从这个reddit线程中发现了一个很酷的bash提示符: 我测试的是@khordes的最高评论。以下是预期结果: 然而,我得到了一些不同的东西。问题就在这里: ───[~]───[33个文件,2334400] 正如您所看到的,在文件数量之前有相当多的空间。实际代码如下: PS1="┌─[\`if [ \$? = 0 ]; then echo \[\e[32m\]✔\[\e[0m\]; else echo \[\e[31m\]✘\[\e[0m\]; fi\`]───[\[\e[01;4

因此,我从这个reddit线程中发现了一个很酷的bash提示符:

我测试的是@khordes的最高评论。以下是预期结果:

然而,我得到了一些不同的东西。问题就在这里:

───[~]───[33个文件,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)
列出当前目录中的文件

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

在BSD平台(如MacOS)上,数字的前缀是空格

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

一个备选方案是:

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

您真的希望每次打印提示时都有这样的性能开销吗?这个命令并不便宜。无论如何,
$(ls | wc-l)
确实有空格。我想继续这种可怕的趋势,你可以把它做成
$(ls | wc-l | tr-d'[:space:]')
(另外,请参阅中的应用程序用法和基本原理部分,了解为什么在
echo
中使用反斜杠转义序列是一个坏主意;
printf
是首选的替代品,它将在所有符合POSIX的外壳中保持一致的行为)……顺便说一下,如果您只想在更改目录上做更昂贵的操作,而不是每次打印提示符时,请考虑遵循<代码> > PROPTIOSCOMPUTE = SETION提示符所给出的模式;SETION提示(){PS=;…;PS1+=”。┌─[$status]───[$userhost]───[$dir]───[$file\u info]\n“PS1+=”└───▶"; },其中,
是设置提示的四个变量的代码,这使得理解如何生成提示和以后修改提示变得更加容易。这解决了空白问题,但没有显示目录中有多少文件。我的原始帖子上的注释回答了我的问题。哪一部分不显示目录中有多少文件?shopt-s nullglob;set--*;echo“$#”方法肯定会显示当前目录中的条目数(在为对当前目录中的条目执行命令替换而创建的子shell中设置参数列表,然后显示所述列表中的项数).Hmm.我插入了这个,而不是上面的,发现它显示了0个文件。这应该附加到上面吗?我猜它没有被转义以防止在分配时进行评估。上面是PS4中应该如何显示它的内容——如果你用双引号分配它(你不应该这样做),则需要一些反斜杠。(为了清楚起见,请将
“…”
更改为
“…”
,以使
$
不再特殊)。