count_glob() {
[ -e "$1" ]
echo "($v=$((!$?*$#)))+"
}
Você pode declarar uma função como a acima. Então, em vez de ls
e o resto que você poderia fazer ...
...Currently in: $(($(
v=c count_glob *
v=h count_glob .*
)-2)) entries and $((h-2)) are hidden...
Eu só removi as seqüências de escape porque elas não são relevantes aqui - elas funcionam bem com elas.
Então, todos juntos agora ...
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\]'
Ok, então o que está acontecendo aqui é que a função count_glob
fornece uma lista de argumentos de todos os arquivos (ocultos ou não) no diretório atual. O parâmetro especial $#
representa a contagem total de parâmetros posicionais de um shell - seus argumentos - e cada função do shell obtém seu próprio conjunto deles.
[ -e "$1" ]
... é uma verificação para verificar se o primeiro argumento realmente existe - o que na verdade não é necessário no caso .*
, porque há sempre dois arquivos .
e ..
para resolver - mas para *
é uma chance que - se o diretório estiver vazio - o glob não será resolvido e *
ainda será passado como argumento. Assim, na função, a verificação é feita e o valor booleano não do retorno do teste é multiplicado pela contagem de argumentos. Isso funciona porque, se o teste for verdadeiro, ele retornará 0 e, se for falso, diferente de zero - então, multiplicar pelo inverso desses números funciona para obter sua contagem correta.
O último fator a considerar aqui é a maneira como o shell lida com a aritmética. Na maioria dos casos, você não pode simplesmente passar uma definição de variável de um subshell dessa forma tão facilmente - mas com um cálculo aritmético que puder - porque ela é realmente um eval
no verdadeiro sentido. As duas chamadas para count_glob
acabam imprimindo uma declaração parecida com:
$(((c=[num])+(h=[num])+-2))
... e a concha homenageia e atribui esses números - mesmo para chamadas subseqüentes. Você pode testar isso no seu prompt - do echo "$h" "$c"
e obterá sempre os mesmos valores que os relatórios do prompt. Eu suponho que isso possa ser útil para outras coisas.