Ответы пользователя по тегу bash
  • Как показывать свое сообщениe, когда команда psql завершается с ошибкой?

    gedev
    @gedev
    сисадмин-энтузиаст
    Можно прямо так, покажет сообщение на любой не нулевой код выхода:
    if ! psql fignya; then
        echo 'Error! '
    fi
    Ответ написан
    Комментировать
  • Как сделать для bash скрипта свой итерпритатор?

    gedev
    @gedev
    сисадмин-энтузиаст
    К тому что уже сказали, вот самая примитивная реализация:
    #!/usr/bin/env bash
    
    my_cmd_1() {
        echo "1st command output. Args: $*"
    }
    
    my_cmd_2() {
        echo "2nd command output. Args: $*"
    }
    
    echo 'Available commands: my_cmd_1, my_cmd_2, exit'
    while true; do
        read -erp '>>> '
        $REPLY
        if [[ "$REPLY" == "exit" ]]; then
            break
        fi
    done

    ~ $ ./cmd.sh 
    Available commands: my_cmd_1, my_cmd_2, exit
    >>> my_cmd_1 --option argument
    1st command output. Args: --option argument
    >>> exit

    read --help
    man readline
    Ответ написан
  • Как реализовать досрочное завершение команды в bash?

    gedev
    @gedev
    сисадмин-энтузиаст
    Решение на коленке в лоб. Скрипт пришлёт одно уведомление когда сеть упадёт и одно когда поднимется. Проверка раз в 60 секунд.
    #!/usr/bin/env bash
    
    addr=google.com
    lock=/tmp/connect.failed
    
    while true; do
        if ping -c 1 -W 5 "$addr" &> /dev/null; then
            if [ -f "$lock" ]; then
                notify-send 'Проверка подключения' 'Есть коннект'
                rm "$lock"
            fi
        else
            if [ ! -f "$lock" ]; then
                notify-send 'Проверка подключения' 'Связи нет'
                touch "$lock"
            fi
        fi
        sleep 60
    done
    Ответ написан
    Комментировать
  • Как верно написать условие bash?

    gedev
    @gedev
    сисадмин-энтузиаст
    Переусложняете.
    #!/bin/sh
    dir=/mnt/d/Downloads
    find "$dir" -type f -regextype egrep -regex '.*\.(mkv|m4v|mp4|ts|avi)' -print0 | sort -zr | xargs -0 -I {} echo {}
    find "$dir" -type f -regextype egrep -regex '.*\.(flac|m4a|ape)' -print0 | sort -zr | xargs -0 -I {} echo {}
    find "$dir" -type f -regextype egrep -regex '.*\.cue' -print0 | sort -zr | xargs -0 -I {} echo {}
    Вместо echo вставьте свою команду. Вместо парных фигурных скобок подставляется имя файла. Если над файлами надо делать сложные действия, то можно сделать по аналогии:
    #!/bin/sh
    dir=/mnt/d/Downloads
    videos="$(find "$dir" -type f -regextype egrep -regex '.*\.(mkv|m4v|mp4|ts|avi)' | sort -r)"
    if [ -n "$videos" ]; then
        x=$IFS; IFS=$'\n';
        for video in "$videos"; do
            # делаем что-то
            echo "$video"
        done
        IFS="$x"
    fi
    Ответ написан
  • Как сделать проверку, что сообщение уже было отправленно?

    gedev
    @gedev
    сисадмин-энтузиаст
    Для уведомлений можно создавать лок-файл (просто как флаг). Вот так должно работать (в примере речь о падении сервиса,но суть одна):

    1. пошла первая итерация
    - сервис упал
    - проверка существавания лок-файла
    - уведомление о падении ушло, так как лок-файл не существует
    - лок-файл создан
    2. пошла вторая итерация
    - сервис ещё лежит
    - проверка существования лок-файла
    - лок-файл существует, поэтому уведомление повторно не шлём
    3. пошла третяя итерация
    - сервис поднялся
    - проверка существования лок-файла
    - шлём уведоление (или не шлём) о том, что сервис поднялся
    - удаляем лок-файл
    4. цикл продолжается
    ...

    Лок-файл может быть любым файлом, я обычно создавал пустой файл.
    Ответ написан
    2 комментария
  • Есть ли заготовка bash скрипта с прогресс баром?

    gedev
    @gedev
    сисадмин-энтузиаст
    Собственно, а чем не устраивает вывод пакетного менеджера? Он довольно подробно пишет ход установки пакетов. Лог будет ползать и показывать что что-то шевелится =). А ваша настройка конфигов вряд ли занимает дольше секунды суммарно (это если учесть, что там будет много регулярок, которые долго выполнятся).

    Сам писал такие скрипты, красиво прогресс бар не прикрутите — много разнородных процессов, нет чего-то одного, по чему можно было бы отслеживать прогресс.

    Просто выделите свои строки цветом, чтобы их было заметно в потоке лога. Например, так:

    G="\e[32m" # green
    N="\e[0m"  # no color
    echo -e "${G}Инициализация системы   ...   [OK]${N}"

    Я также пытался прикручивать спиннеры (просто крутится и показывает, что "оно живое"):

    show_spinner() {
        chars="/-\|*"
        while pgrep "$1" > /dev/null; do
            for (( i=0; i<${#chars}; i++ )); do
                sleep 0.2
                echo -en "${chars:$i:1} ${G}Обработка...${N}" "\r"
            done
        done
    }
    
    # show_spinner <тут имя процесса, за которым надо следить>
    # Например, за find:
    show_spinner find
    Ответ написан
    Комментировать
  • Как исправить данный скрипт?

    gedev
    @gedev
    сисадмин-энтузиаст
    С tar такая задача решается легко:
    tar -czvf archive.tar.gz -C /path/to/dir/ dir/
    Здесь /path/to/dir/ это dirname, а dir/ это basename.
    То есть путь до нужной папки /var/www/example.com вы разбиваете так:
    /var/www/ example.com/
    В конечном архиве пути будут начинаться с example.com/
    Для zip должен работать ответ выше.
    Ответ написан
    Комментировать
  • Какие книги лучше подойдут новичку по bash?

    gedev
    @gedev
    сисадмин-энтузиаст
    Комментировать
  • Почему не работает grep?

    gedev
    @gedev
    сисадмин-энтузиаст
    Как отметили в комментариях, лучше работу с опциями реализовывать иначе. Например с помощью case вот так. Рекомендую ознакомиться и с другими примерами по ссылке.
    Ответ написан
    Комментировать