web-dev-qa-db-fra.com

Ajout de code / texte dans la sortie précédente de la console pour afficher l'état

Je n'ai pas pu découvrir comment ce "code" ci-dessous est créé.

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

Plus précisément, après avoir appelé la commande, cela apparaît dans un premier temps:

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

Suivi d'une confirmation de redémarrage par le service, il se transforme en

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

avec le .. modification en ok

Je voudrais les incorporer dans mes propres scripts mais je n'ai pas pu trouver le code de ceux-ci ou d'autres similaires.

De l'aide serait appréciée!

Veuillez noter que je n'utilise que Samba comme exemple car cela présente également la sortie à laquelle je fais référence.

La seule possibilité, à ma connaissance, est qu'il en exécute pour python, mais en parcourant le fichier de service pour tout service arbitraire qui a une sortie similaire n'a aucune mention de un script python ni quelque chose qui fait écho 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 $1 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 "$1"
        /etc/init.d/smbd "$1"
        /etc/init.d/samba-ad-dc "$1"
        ;;
    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
3
Cybex

printf et écrasement avec retour chariot

Ce type de "magie" peut être effectué via printf et le retour chariot "\ r" pour écraser la sortie existante. Cependant, vous devrez être conscient des lignes consécutives. Observez cet exemple:

#!/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

Remarquez comment nous avons d'abord imprimé la chaîne "status", puis nous utilisons le retour chariot pour revenir au début et écraser les 3 premiers caractères avec la chaîne "[OK". Les deux sauts de ligne suivants ne sont que des exemples de ce que vous souhaitez faire pour déplacer le script vers l'avant et imprimer plus de lignes. En ce qui concerne la if command ; then . . . fi, il s'agit d'une structure simple qui exécute le corps de l'instruction if de manière conditionnelle, en fonction de la sortie de command.

L'inconvénient de cette approche est que si vous ne correspondez pas à la longueur des caractères de ce que vous imprimez, cela peut apparaître.

$ printf "Hello\rcat\n" 
catlo

Approche légèrement meilleure: effacer la ligne avec le code d'échappement

Nous pouvons profiter de code d'échappement ANSI pour effacer la ligne (dans ce cas, en octal \033[2K) pour se débarrasser de ce que nous avions auparavant sur la ligne. Cela a l'avantage de ne pas manquer de longueur de correspondance/non-correspondance de ce que vous imprimez lorsque vous réinitialisez le curseur au début.

Voici un exemple, avec des caractères UTF-8 ajoutés pour la vérification et la croix

#!/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" "\033[2K"
    string="[\U2713] pinging google.com "
else
    # clear previous line, add UTF checkmar to string
    printf "\r%b" "\033[2K"
    string="[\U274C] pinging google.com "
fi
printf "%b" "$string"
2
Sergiy Kolodyazhnyy