我终于想出了一种最喜欢的 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"
,您每次都会得到与提示报告相同的值。我想这可能对其他事情有用。