命令提示符 (PS1) 包括目录中的文件数量(隐藏条目和常规条目)

命令提示符 (PS1) 包括目录中的文件数量(隐藏条目和常规条目)

我终于想出了一种最喜欢的 PS1 格式,但我发现加载时间太长。

减慢速度的部分是当我在提示符中调用外部命令时。我只想显示目录的条目数和隐藏文件数。

我按照这两页作为指导来做出提示:“提示中的外部命令”“自定义 bash 命令提示符博客”。我无法让 Daniel 的“自定义 bash 命令提示符博客”方法比我想出的方法更快地工作。无论如何,他为什么要使用“pwd”而不是\w?另外,我不明白他为什么创建一个 var 并回显它($OUT)。哦,好吧,这就是我所做的......

我将这两种方法结合起来,想出了下面的方法,它有效,但没有我想要的那么快......

export PS1="\[\e[2;37m\]\d \[\e[2;37m\] @ \[\e[2;37m\] \t \[\e[2;33m\]> Currently in: \[\e[0;33m\]\w [\$(ls -A | wc -l) entries and \$[\$(ls -A | wc -l) - \$(ls | wc -l)$wc -l)] are hidden] \[\e[0m\]
\[\e[2;36m\]\u\[\e[0;37m\]@\[\e[1;32m\]\h\[\e[0;33m\] \$ \[\e[0m\]"

根据 @mikeserv 的建议,在 bashrc 中新编辑的命令:

export PS1="\[\e[2;37m\]\d \[\e[2;37m\] @ \[\e[2;37m\] \t \[\e[2;33m\]>Currently in: \[\e[0;33m\] $(($(count_glob c * count_glob h .*)0)) entries and $h are hidden \[\e[0m\]
\[\e[3;36m\]\u\[\e[0;37m\]@\[\e[1;93m\]\h\[\e[0;33m\] \$\[\e[0m\]"

其结果如下:

Tue Jan 20  @  18:37:58 >Currently in:  24 entries and  are hidden

答案1

count_glob() { 
     [ -e "$1" ]
     echo "($v=$((!$?*$#)))+"
}

您可以声明一个像上面这样的函数。那么ls剩下的你就可以做......

...Currently in: $(($(
    v=c count_glob *
    v=h count_glob .*
)-2)) entries and $((h-2)) are hidden...

我只删除了转义序列,因为它们与此处无关 - 它也可以与它们一起使用。

所以现在大家在一起...

export PS1='\[\e[2;37m\]\d \[\e[2;37m\] @ \[\e[2;37m\] \t \[\e[2;33m\]>'\
'Currently in: \[\e[0;33m\] $(($(
    v=c count_glob * 
    v=h count_glob .*
)-2)) entries and $((h-2)) are hidden '\
'\[\e[3;36m\]\u\[\e[0;37m\]@\[\e[1;93m\]\h\[\e[0;33m\] \$\[\e[0m\]'

好的,这里发生的事情是为count_glob函数提供了所有参数的参数列表(隐藏或不隐藏)当前目录中的文件。特殊参数$#表示 shell 的位置参数(其参数)的总数,并且每个 shell 函数都有自己的一组参数。

[ -e "$1" ]

...是验证第一个参数是否确实存在的检查 - 在这种.*情况下实际上没有必要,因为总是有两个...文件需要解析 - 但*有可能 - 如果目录为空 - glob 将不会解决并*仍将作为参数传递。因此,在函数中,检查已完成,测试返回的布尔值 not 乘以参数计数。这是有效的,因为如果测试为真,则返回 0,如果为假,则返回非零 - 因此乘以这些数字的倒数即可得到正确的计数。

这里要考虑的最后一个因素是 shell 处理算术的方式。在大多数情况下,您不能如此轻松地将变量定义从子 shell 中传递出来 - 但使用算术 eval 就可以 - 因为它确实是eval真正意义上的。这两个调用count_glob最终打印了一个如下所示的语句:

$(((c=[num])+(h=[num])+-2))

...并且 shell 尊重并分配这些数字 - 即使对于后续调用也是如此。您可以在提示时对此进行测试 - 执行此操作echo "$h" "$c",您每次都会得到与提示报告相同的值。我想这可能对其他事情有用。

相关内容