Prompt de comando (PS1) incluindo o número de arquivos no diretório (entradas ocultas e regulares)

1

Eu finalmente criei um formato PS1 favorito, mas acho que demora muito para carregar.

A parte que está diminuindo é quando eu chamo os comandos externos no prompt. Eu simplesmente quero mostrar o número de entradas e # de arquivos ocultos do diretório.

Eu segui estas duas páginas como um guia para fazer o prompt: "Comando externo no prompt" e "personalizando o prompt de comando do bash ". Eu não consegui usar o método de "personalizar o prompt de comando do bash" para trabalhar mais rápido do que o que eu criei. Por que ele usaria "pwd" em vez de \ w? Além disso, eu não entendo porque ele fez um var e ecoou ($ OUT). Oh bem, aqui está o que eu fiz ...

Eu meio que combinei ambos os métodos e criei o que segue, o que funciona, mas não tão rápido quanto eu gostaria ...

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\]"

Comando recém editado no bashrc, conforme sugestões do @ mikeserv:

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\]"

cujos resultados estão abaixo:

Tue Jan 20  @  18:37:58 >Currently in:  24 entries and  are hidden
    
por geokrowding 17.01.2015 / 12:53

1 resposta

1
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.

    
por 17.01.2015 / 14:53