Ответы пользователя по тегу bash
  • В чем ошибка bash скрипта?

    saboteur_kiev
    @saboteur_kiev Куратор тега bash
    software engineer
    Вы написали скрипт под bash, а запускаете его в sh - это разные оболочки, могут быть несовместимости.
    Запускайте
    bash ./ebgen.sh

    или просто проставьте ему аттрибут executable
    chmod a+x ebgen.sh
    и запускайте просто
    ./ebgen.sh
    Ответ написан
    1 комментарий
  • Как выкачать все картинки через wget не зная названия файлов?

    saboteur_kiev
    @saboteur_kiev Куратор тега Linux
    software engineer
    Никак. http/https сам по себе не работает с файловой системой, следовательно получить список файлов (их имена) простым способом невозможно - если это не предусмотрено со стороны vk, что есть какая-то функция вывести список доступных картинок.
    Но насколько я знаю, в vk такой функции нет.
    Ответ написан
    3 комментария
  • Как в bash создать каталог и перейти в него?

    saboteur_kiev
    @saboteur_kiev Куратор тега bash
    software engineer
    mkdir - создать каталог
    cd - перейти в каталог.

    Есть команды для перехода в каталог с запоминанием куда ты перешел, и возможность затем вернуться назад.
    pushd directory
    popd

    например
    /home/user1$ pushd /home
    /home$ pushd /
    /$ popd
    /home$ popd
    /home/user1$
    Ответ написан
  • Как включить в zsh регулярные выражения?

    saboteur_kiev
    @saboteur_kiev Куратор тега bash
    software engineer
    Это не регулярные выражения, это маски файлов - баш поддерживает *, ?, ~ и простой перечень с диапазонами квадратных скобках []
    Но это НЕ регулярки, оно ни под один стандарт регэкспов не подпадает. Тех же квантификаторов нет.
    Ответ написан
  • Как определить ip через bash скрипт?

    saboteur_kiev
    @saboteur_kiev Куратор тега Linux
    software engineer
    У сервера может быть несколько IP адресов, несколько интерфейсов, и работать они могут с разными маршрутами.
    Вы что именно хотите?
    ifconfig пропарсить? или ip addr show?

    Если внешний интерфейс один, то подойдет обычный
    hostname -I
    Ответ написан
    Комментировать
  • AWS: Как передавать большие файлы (например, конфиги) в USERDATA при создании LaunchConfiguration?

    saboteur_kiev
    @saboteur_kiev Куратор тега bash
    software engineer
    1. Копировать можно просто по scp
    2. Выкладывать можно не только под basic auth, а еще и в запароленных архивах
    Ответ написан
    Комментировать
  • Как взять параметры для запуска скрипта из текстового файла?

    saboteur_kiev
    @saboteur_kiev Куратор тега Linux
    software engineer
    Потому что
    ./test.sh 123 это запуск с аргументом,
    а "cat test.txt | ./test.sh" означает передачу в STDIN, словно вы сделали так:

    $ ./test.sh
    123

    из файла можете брать параметры через read или через source
    Ответ написан
    Комментировать
  • Есть ли возможность запустить bash с параметрами/из опр. местоположения?

    saboteur_kiev
    @saboteur_kiev Куратор тега bash
    software engineer
    Или запустить sh-скрипт с возможностью(есть такая?) продолжить работу вручную после выполнения скрипта?


    А в чем проблема собственно сперва зайти в каталог, затем запустить баш из вашего скрипта, вот так:
    #!/bin/bash
    
    echo this is my script
    cd /mydir
    bash
    Ответ написан
    1 комментарий
  • Анимация в bash?

    saboteur_kiev
    @saboteur_kiev Куратор тега bash
    software engineer
    вместо clear попробуйте использовать "tput cup $y 0", а clear сделать только при смене направления.
    Также можно сократить вычисления, высчитывая двиг слева только при движении влево и вправо.
    И использовать индексы, вместо преобразования имени переменной.
    И как-то у вас все не-аккуратненько. Мышка кривая, вы бы ее подрисовали ровнее, как-то так:

    spoiler
    #!/bin/bash
    
    let y=0
    let x=0
    let max_x=120 #$(tput cols)
    let max_y=24
    let wall=0
    let space=""
    
    draw_top() {
        local line[0]='   ###               ###'
        local line[1]='  #####   ## | ##   #####'
        local line[2]='########################### '
        local line[3]='  #######################  '
        local line[4]='     #################   '
        local line[5]='          #######     '
        local line[6]='           ##### '
        local line[7]='             #  '
        local line[8]='              '
    
        for index in {0..8}; do
            echo "$space${line[$index]}"
        done
    }
    
    draw_bottom() { 
        local line[0]='              '
        local line[1]='             #  '
        local line[2]='           ##### '
        local line[3]='          #######     '
        local line[4]='     #################   '
        local line[5]='  #######################  '
        local line[6]='###########################'
        local line[7]='  #####   ## | ##   #####'
        local line[8]='   ###               ###'
    
        for index in {0..8}; do
            echo "$space${line[$index]}"
        done
    }
    
    draw_right() {
        local  line[0]='          #   '
        local  line[1]='          ##  '
        local  line[2]='         #### '
        local  line[3]='       #######'
        local  line[4]='     ######## '
        local  line[5]='     #######  '
        local  line[6]='     ######   '
        local  line[7]='  ##########  '
        local  line[8]='###########-  '
        local  line[9]='  ##########  '
        local line[10]='     ######   '
        local line[11]='     #######  '
        local line[12]='       #######'
        local line[13]='         #### '
        local line[14]='          ##  '
        local line[15]='          #   '
    
        # Вычисляем сдвиг слева
        space=""
        for ((j = 0; j < $2; j++)) ; do
          space="$space "
        done
        for index in {0..15}; do
            echo "$space${line[$index]}"
        done
    }
    
    draw_left() {
        local  line[0]='   # '
        local  line[1]='  ## '
        local  line[2]=' #### '
        local  line[3]='####### '
        local  line[4]=' ######## '
        local  line[5]='  ####### '
        local  line[6]='   ###### '
        local  line[7]='  ########## '
        local  line[8]=' -########### '
        local  line[9]='  ########## '
        local line[10]='   ###### '
        local line[11]='  ####### '
        local line[12]='####### '
        local line[13]=' #### '
        local line[14]='  ## '
        local line[15]='   # '
    
        # Вычисляем сдвиг слева
        space=""
        for ((j = 0; j < $2; j++)) ; do
          space="$space "
        done
        for index in {0..15}; do
            echo "$space${line[$index]}"
        done
    }
    
    move_right() {
        if ((x < max_x - 15))
        then
            ((x++))
        else
            wall=1
        fi
    
        tput cup $y 0
        draw_right $y $x
    }
    
    move_bottom() {
        if ((y < max_y - 8))
        then
            ((y++))
        else
            wall=1
        fi
        
        tput cup $y 0
        draw_bottom $y $x
    }
    
    move_left() {
        if (( x > 0 ))
        then
            ((x--))
        else
            wall=1
        fi
    
        tput cup $y 0
        draw_left $y $x
    }
    
    move_top() {
        if (( y > 0 ))
        then
            ((y--))
        else
            wall=1
        fi
    
        tput cup $y 0
        draw_top $y $x
    }
    
    random_choice() {
        RANGE=$1
        number=$RANDOM
        let "number %= $RANGE"
        echo "$number"
    }
    
    move() {
        if [ "$1" == 0 ]
        then
            move_right
        fi
    
        if [ "$1" == 1 ]
        then
            move_left
        fi
    
        if [ "$1" == 2 ]
        then
            move_top
        fi
    
        if [ "$1" == 3 ]
        then
            move_bottom
        fi
    }
    
    calculate_coords() {
        let vertical=$1
    
        # Вертикально -> Горизонтально
        if (( vertical > 0))
        then
            x=$((x-8))
            y=$((y+5))
    
            if (( x < 0 ))
            then
                x=0
            fi
    
            if (( x + 31 > max_x))
            then
                x=$((max_x-31))
            fi
    
            if (( y + 8 > max_y))
            then
                y=$((max_y-8))
            fi
    
        # Горизонтально -> Вертикально
        else
            x=$((x+8))
            y=$((y-5))
    
            if (( y < 0 ))
            then
                y=0
            fi
    
            if ((x + 13 > max_x))
            then
                x=$((max_x - 13))
            fi
    
            if ((y + 17 > max_y))
            then
                y=$((max_y - 17))
            fi
        fi
    }
    
    start() {
        current=0
        direction=0
        prevent_direction=0
        clear
    
        while true; do
            # Calculate dicrection
            if ((current == 20 || wall == 1))
            then
                wall=0
                current=0
                prevent_direction=$direction
                direction=$(random_choice 4)
    
                if (( direction < 2 && prevent_direction > 1 ))
                then
                    calculate_coords 0
                fi
    
                if (( direction > 1 && prevent_direction < 2 ))
                then
                    calculate_coords 1
                fi
                clear
            fi
    
            # Move
            move $direction
            current=$((current+1))
            /bin/sleep .05
        done
    }
    
    start
    Ответ написан
    Комментировать
  • Как работает история комманд в bash?

    saboteur_kiev
    @saboteur_kiev Куратор тега bash
    software engineer
    1) при выходе, баш просто пишет все выполняемые команды в $HISTFILE файл (по умолчанию это ~/.bash_history.
    До выхода история хранится в памяти, и параметры HISTSIZE и HISTFILESIZE могут быть разными.

    Можно сбросить текущую историю из памяти в файл командой history -a

    2), 3). вы можете попробовать добавить нужные команды в prompt, тогда при выполнении любой команды будет выполняться блок ваших команд. Но это несколько костыльное решение. Например добавить history -a в PROMPT_COMMAND, чтобы хистфайл обновлялся после каждой команды. можно добавить туда и вывод history 1 с перенаправлением в скрипт, который отправляет почту, но это вызовет задержку на выполнение каждой команды. лучше из отдельной сессии следить за этим файлом.
    Ответ написан
    2 комментария
  • Какое регулярное выражение подойдет для grep?

    saboteur_kiev
    @saboteur_kiev Куратор тега Linux
    software engineer
    Через альтернативу указываете Archive и Clients в группе, а уже после них конец строки.
    grep -E "(Archive|Clients)$"

    "|" без скобок будет пытаться брать только один символ, то есть ваш
    "Archive$|Clients$"
    означает "Archive"+"$ или C" + lients$"
    Ответ написан
    Комментировать
  • Как составить скрипт freenas (freebsd) с командой tar?

    saboteur_kiev
    @saboteur_kiev Куратор тега bash
    software engineer
    Создайте скрипт, который требует двух аргументов - что паковать и куда tarring.sh:
    #!/usr/bin/env bash
    
    echo Argument provided:$1 $2
    echo CMD to execute: tar $2/${1##*/}.tar.gz ${1}


    Выполните:
    find /dir1 -type d -regextype posix-extended -regex '.*[0-9]{8}' -exec ./tarring.sh {} dir2 \;
    Ответ написан
  • Список файлов без расширений но при этом выводить и скрытые файлы(чтобы точка осталась)?

    saboteur_kiev
    @saboteur_kiev Куратор тега Linux
    software engineer
    Что ж так сложно все у вас.
    Вывод всего без расширения, но с точками
    ls -A --ignore='*.???'
    Убираем директории
    ls -FA --ignore='*.???'| grep -v "/"

    Еще один вариант, игнорируем файлы, где есть точка не в начале файла.
    ls -FA --ignore='?*.*' | grep -v "/"
    Ответ написан
    Комментировать
  • Как использовать ifeq для проверки вывода команды?

    saboteur_kiev
    @saboteur_kiev Куратор тега bash
    software engineer
    А если так

    ($(docker-compose exec php-bundle /bin/bash -c "if getent passwd docker; then echo 1; fi"), )
    Ответ написан
  • Как получить число символов в Unicode строке в bash?

    saboteur_kiev
    @saboteur_kiev Куратор тега Linux
    software engineer
    $ TEST="йцукенasdf"
    $ echo ${#TEST}
    10
    Ответ написан
    3 комментария
  • Как запустить скрипт bash в котором запускается еще одна программа?

    saboteur_kiev
    @saboteur_kiev Куратор тега Linux
    software engineer
    Создайте отдельно список команд для zmmailbox, не забудьте в конце добавить exit или quit, чтобы можно было продолжить выполнение баш и выполните его следующим образом, используя конструкцию document here:

    zmmailbox <<EOF
    aa -u https://zimbra.jo admin adminadmin
    selectmailbox $1
    addFilterRule rule1 address "test1" all not_is "@domain" fileinto /inbox/office 
    exit
    EOF
    Ответ написан
    3 комментария
  • Почему не находи функции в подключённом файле?

    saboteur_kiev
    @saboteur_kiev Куратор тега Linux
    software engineer
    build_dev как запускаете? Находясь в папке ~/build_script/ ?
    Если нет, то в строке
    . ./libs/dev.sh
    поправьте путь на абсолютный
    Ответ написан
  • Как настроить мониторинг postfix на zabbix?

    saboteur_kiev
    @saboteur_kiev Куратор тега Linux
    software engineer
    if реагирует на 0 (true) и не ноль (false), поэтому суть в том, что если
    if echo "${TEMP_DATA}" | grep -iq "Mail queue is empty"; then

    возвращает 0 (то есть grep нашел фразу "Mail queue is empty" хотя бы раз), то выполняется условие.
    Иначе он пробует другое условие:

    elif echo "${TEMP_DATA}" | grep -iPq "in\s+\d+\s+request"; then
    В этом условии ищем фразу "in цифры request", если находим то выполняем.

    echo "${TEMP_DATA}" | sed -e 's/.*in\s\+\([0-9]\+\)\s\+request.*/\1/gI' 2> /dev/null | head -n1

    Таким образом три условия
    Если очередь пустая - выводим 0, если не пустая - выводим количество request-s, в противном случае выводим ошибку.

    Дальше уже вопрос как это обрабатывает заббикс - просто берет эти цифры и строит график, и реагирует на ошибку, или еще что-то.

    А вообще, лучше конечно подучить основы баша и регулярных выражений. Подобные скрипты - это подсказки для тех, кто уже пишет. Они не являются end-user решениями, которые можно просто брать и ставить на свой сервер без понимания, что они делают. То есть риск всегда есть, что они делают не все, что вы хотите.
    Ответ написан
    Комментировать
  • Как сделать в bash?

    saboteur_kiev
    @saboteur_kiev Куратор тега bash
    software engineer
    \r это возврат каретки, а не перенос строки.

    1. Вы точно хотите удалить именно \r, а не \n ?

    2. Попробуйте перед "for LINE in `cat ci.txt`;" выполнить:
    dos2unix cat ci.txt

    3. Можно "if [ -d `$LINE | sed 's/\\r//g'` ];" заменить на

    $LINE=`echo "$LINE" | tr -d "\r"`
    if [ -d $LINE ];
    Ответ написан
    Комментировать
  • Как заставить Wait ждать завершения?

    saboteur_kiev
    @saboteur_kiev Куратор тега Linux
    software engineer
    есть простой вариант

    shell1.sh
    echo $$ >> /tmp/wait.pls
    echo Process started
    sleep 3
    echo Process stopped
    rm /temp/wait.pls


    shell2.sh
    password=`zenity --password`
    
    echo ${password} | sudo -S gnome-terminal -e "./shell1.sh"
    
    while true
    do
      if [ ! -f /tmp/wait.pls ] ; then
        echo "Done"
        exit 0
      fi
    done
    Ответ написан
    Комментировать