Добавление кода/текста в предыдущем консольном выводе к состоянию дисплея

Я не мог узнать, как этот "код" ниже создается.

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

Конкретно после вызова команды, это показывают сначала:

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

Сопровождаемый подтверждением перезапуска сервисом, это изменяется на

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

с .. изменение на ok

Я хотел бы включить их в свои собственные сценарии, но не смог найти код для них или любого подобным.

Справка ценилась бы!

Отметьте, я только использую Samba в качестве примера, так как это представляет вывод, который я отсылаю также.

Единственная возможность, к моему знанию, состоит в том, что оно выполняет некоторых для сценария Python, но прохождение через сервисного файла для любого arbitary сервиса, который имеет подобный вывод, не имеет никакого упоминания о сценарии Python, ни чем-то что эхо ok

кошка/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
задан 16 September 2016 в 10:04

1 ответ

printf и перезаписывающий с возвратом каретки

Этот тип "волшебства" может быть сделан через printf и возврат каретки "\r" для перезаписи существующего вывода. Однако необходимо будет быть сознательными для последовательных строк. Наблюдайте этот пример:

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

Уведомление, как у нас есть строка "состояния", печатает сначала, затем мы используем возврат каретки, чтобы перейти назад к началу и перезаписать сначала 3 символа с" [хорошо" строка. Следующие две новых строки являются просто примером того, что Вы хотели бы сделать, чтобы переместить сценарий вперед и распечатать больше строк. Что касается эти if command ; then . . . fi, это - простая структура, которая выполняет тело того, если оператор условно, в зависимости от command произвел.

Недостаток этого подхода - то, что, если Вы не соответствуете длинам знака того, что Вы печатаете, затем он мог бы показать через.

$ printf "Hello\rcat\n" 
catlo

Немного лучший подход: очистка строки с управляющим кодом

, который Мы можем использовать в своих интересах управляющий код ANSI для очистки строки (в этом случае в восьмеричном \033[2K) для того, чтобы избавиться от того, что мы ранее имели на строке. Это имеет преимущество не окончания в проблеме matching/not-matching длины того, что Вы печатаете при сбросе курсора назад к началу.

Вот пример с добавленными символами UTF-8 для проверки и перекрестной метки

#!/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
ответ дан 1 December 2019 в 16:57

Другие вопросы по тегам:

Похожие вопросы: