Acrescentando código / texto na saída anterior do console para exibir o status

3

Não consegui descobrir como esse "código" abaixo é criado.

# sudo /etc/init.d/samba restart
[ ok ] Restarting nmbd (via systemctl): nmbd.service.
[ ok ] Restarting smbd (via systemctl): smbd.service.

Especificamente depois de chamar o comando, isso é mostrado primeiro:

[ .. ] Restarting nmbd (via systemctl): nmbd.service.

Seguido de uma confirmação de reinicialização pelo serviço, ele é alterado para

[ ok ] Restarting nmbd (via systemctl): nmbd.service.

com o .. mudando para ok

Eu gostaria de incorporar estes em meus próprios scripts, mas não consegui encontrar o código para estes ou qualquer similar.

A ajuda seria apreciada!

Por favor, note que estou usando apenas o Samba como exemplo, já que isso apresenta a saída que estou me referindo também.

A única possibilidade, a meu conhecimento, é que ele execute algum script python, mas passar pelo arquivo de serviço para qualquer serviço arbitrário que tenha uma saída similar não tem menção a um script python nem algo do tipo echo ok

cat /etc/init.d/samba

#!/bin/sh

### BEGIN INIT INFO
# Provides:          samba
# Required-Start:
# Required-Stop:
# Default-Start:
# Default-Stop:
# Short-Description: ensure Samba daemons are started (nmbd, smbd and samba)
# Description: Starts Samba, a Windows AD and SMB/CIFS fileserver for UNIX
### END INIT INFO

set -e

# start nmbd, smbd and samba-ad-dc unconditionally
# the init scripts themselves check if they are needed or not
case  in
    start)
        /etc/init.d/nmbd start
        /etc/init.d/smbd start
        /etc/init.d/samba-ad-dc start
        ;;
    stop)
        /etc/init.d/samba-ad-dc stop
        /etc/init.d/smbd stop
        /etc/init.d/nmbd stop
        ;;
    reload)
        /etc/init.d/smbd reload
        ;;
    restart|force-reload)
        /etc/init.d/nmbd ""
        /etc/init.d/smbd ""
        /etc/init.d/samba-ad-dc ""
        ;;
    status)
        status=0
        NMBD_DISABLED='testparm -s --parameter-name='disable netbios' 2>/dev/null || true'
        SERVER_ROLE='samba-tool testparm --parameter-name="server role"  2>/dev/null | tail -1 || true'
        if [ "$SERVER_ROLE" != "active directory domain controller" ]; then
            if [ "$NMBD_DISABLED" != "Yes" ]; then
                /etc/init.d/nmbd status || status=$?
            fi
            /etc/init.d/smbd status || status=$?
        else
            /etc/init.d/samba-ad-dc status || status=$?
        fi
        exit $status
        ;;
    *)
        echo "Usage: /etc/init.d/samba {start|stop|reload|restart|force-reload|status}"
        exit 1
        ;;
esac
    
por Cybex 16.09.2016 / 08:30

1 resposta

2

printf e substituição com retorno de carro

Esse tipo de "mágica" pode ser feito via printf e retorno de carro "\ r" para substituir a saída existente. No entanto, você terá que estar consciente para linhas consecutivas. Observe este exemplo:

#!/bin/bash

string="[  ] pinging google.com "

printf "%s" "$string"

if ping -c 4 -q google.com > /dev/null 
then
    printf "\r[OK"
    printf "\n\n"
fi

Observe como temos a primeira sequência de caracteres "status", então usamos o retorno de carro para voltar ao início e sobrescrevemos os 3 primeiros caracteres com "[OK". As duas novas linhas a seguir são apenas exemplos do que você deseja fazer para mover o script e imprimir mais linhas. Quanto ao if command ; then . . . fi , esta é uma estrutura simples que executa o corpo da instrução if condicionalmente, dependendo da saída command .

A desvantagem dessa abordagem é que, se você não corresponder aos comprimentos de caractere do que está imprimindo, ela poderá ser exibida.

$ printf "Hello\rcat\n" 
catlo

Aproximação ligeiramente melhor: limpar a linha com o código de escape

Podemos aproveitar código de escape ANSI para a linha de compensação (neste caso, em octal 3[2K ) para livrar-se do que já tínhamos na linha. Isso tem a vantagem de não se esgotar na questão do comprimento correspondente / não correspondente do que você imprime ao redefinir o cursor de volta ao início.

Veja um exemplo, com caracteres UTF-8 adicionados para verificação e marca cruzada

#!/bin/bash

string="[ ] pinging google.com "
printf "%s" "$string"

if ping -c 4 -q google.com > /dev/null 
then
    # clear previous line, add UTF checkmar to string
    printf "\r%b" "3[2K"
    string="[\U2713] pinging google.com "
else
    # clear previous line, add UTF checkmar to string
    printf "\r%b" "3[2K"
    string="[\U274C] pinging google.com "
fi
printf "%b" "$string"
    
por Sergiy Kolodyazhnyy 16.09.2016 / 09:12