Ответы пользователя по тегу bash
  • Запуск python скрипта из bash. No such file or directory. Как это решить?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    "$str2$str1"
    '/usr/bin/python3 /opt/uccx-stats/uccx_parse.py /opt/uccx-stats/_uccx_csqstats.txt "FCCPS-CSQ - loggedinagents"'

    подскажите, как это победить

    убрать кавычки там где они не нужны, добавить кавычки там, где они нужны:
    #!/bin/bash
    set -x
    #Запуск скрипта в формате ./csqstats CSQ_name  param
    str1="$1 - $2"
    str2="/usr/bin/python3 /opt/uccx-stats/uccx_parse.py /opt/uccx-stats/_uccx_csqstats.txt"
    $str2 "$str1"
    Ответ написан
    Комментировать
  • Как разделить передаваемые программе аргументы в баш-скрипте?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    С минимальными изменениями можно сделать вот такой рабочий вариант:
    #!/bin/bash
    function generateArgs(){
     echo --arg1=$somevar1 \"--arg2=$somevar2 and spaces\" ... --arg1337=$somevar1337
    }
    eval "args=($(generateArgs))"
    exec java "${args[@]}"

    Т.е. каждый отдельный аргумент в котором могут быть пробелы вывести с кавычками и собрать их в массив. Элементы массива в подстановке "${args[@]}" передаются поотдельности и пробелы внутри них обрабатываются правильно.

    Но это, конечно, коряво и лучше переделать функцию, чтобы она собирала массив аргументов по-человечески.
    Ответ написан
    Комментировать
  • Почему timeout неправильно завершает скрипт?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Timeout шлёт сигнал sigint если приложение не завершилось за определенное время.

    Нет, по умолчанию он шлёт SIGTERM. Чтобы он слал SIGINT воспользуйтесь ключом --signal=INT (см).

    Почему после окончания таймаута, утилита завершается, но без надписи "session saved"?

    Потому что не тот сигнал?
    Ответ написан
    Комментировать
  • Зачем производится закрытие файлового дескриптора?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    зачем закрывается файловый дескриптор (exec 2<&-) перед тем как связать его с лог файлом?

    Я не вижу в этом никакого смысла, потому что системный вызов dup2 (которым вополняется связывание дескриптора логфайла с дескриптором #2) точно так же закрывает дескриптор в который происходит дупликация.
    Ответ написан
  • Почему не берутся пробелы в bash переменной?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    файл "Название какого-то файла.mkv" $WhatFile возвращает в виде "Название" , отрезая всё, что есть после первого пробела

    для этого вместо for WhatFile in $(...) лучше использовать конструкцию find ... -print0 | xargs -0 .... Т.е.
    find $Downloads -regex ".*\.\(mkv\|m4v\|mp4\|ts\|avi\)" -and -mmin +30 -print0 | sort -zr | xargs -0 -I\{} bash -c '
    WhatFile=\{}
    // извлекаем название найденного файла
    WhatFileName=$(basename "$WhatFile"  )
    echo "$WhatFileName"
    // извлекаем папку найденного файла
    WhatFolder=$(dirname "$WhatFile"  )
    echo "$WhatFolder"
    // извлекаем папку найденного файла
    #echo WhatFolder $WhatFolder
    #переименование
    #файла
      if [ -n "$WhatFileName" ]; then
      WhatRenameFile=$( echo "$WhatFileName" |
      sed -f "$Renamer" )
        if [ "$WhatFileName" != "$WhatRenameFile" ]; then
          echo "переименовываем файл из "$WhatFileName" в "$WhatRenameFile""
        mv -fv "$WhatFile" "$WhatFolder"/"$WhatRenameFile"
      echo "пауза 2 секунды"
        sleep 2s
      else 
        echo "Файл соответствует правилам "$WhatFileName""
        fi
      #echo $WhatRenameFile
      fi
    '
    Ответ написан
  • Bash не видит переменную после выхода из цикла. В чем может быть проблема?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    файл становится пустым после скрипта
    sed 's/${search%$'\n'}/${replase%$'\n'}/g' $file > $file


    неудивительно, >$file делает файл пустым ещё до вызова sed. Чтобы редактировать файл на месте у sed есть ключ -i:
    sed 's/${search%$'\n'}/${replase%$'\n'}/g' -i "$file"
    Ответ написан
    3 комментария
  • Как решить проблему с Find?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    При ситуации, когда был найден вариант файла подобного вида, скрипт впадал в кому
    Экспроприатор (16 сер.) - web-dl1080p.mkv*

    Взять аргументы в кавычки:
    Serials_file_destination=$(basename $Serials_destination)
    заменить на
    Serials_file_destination=$(basename "$Serials_destination")
    и по аналогии в других местах: dirname, mv.
    Ответ написан
  • Как "распаковать" параметры из переменной в bash-скрипте?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Так происходит, потому что подстановки в bash нерекурсивные. Т.е. если результат подстановки создаёт новую конструкцию, с которой произошла бы подстановка, будь она записана в исходном тексте скрипта, bash не будет её интерпретировать. Это ограничение можно обойти с помощью функции eval, которая интерпретирует свой параметр по всем правилам bash. Т.е. пример из вопроса можно записать так:
    du -sh ~ --exclude=$(eval echo $HOME/{$excludes})
    Оборотная сторона такого решения -- $excludes становится частью скрипта, и если он контролируется извне, туда легко можно всунуть rm -rf /* как побочный эффект.
    Ответ написан
    1 комментарий
  • Как создать массив с ведущими нулями в Bash?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    for i in ${hr[@]}; do
    echo ${hr[i]}
    done

    Bash думает, что если число начинается с 0, то оно в восьмеричной системе счисления и числа 8 в ней нет. Что делать?

    Выбрать, что же именно у тебя лежит в массиве -- строчки или индексы. И если выбрал строчки, то не интерпретировать их тут: echo ${hr[i]} как индексы. А если выбрал индексы, то следовать правилам написания чисел.

    Я бы сделал так:
    #!/bin/bash
    
    hr=(00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23)
    
    for i in ${hr[@]}; do
    echo $i
    done
    Ответ написан
    Комментировать
  • Как слайсить массив на баше?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    мой массив слайсится не так как нужно

    после второго двоеточия идёт длина а не индекс. Т.е. должно быть echo ${array[@]:$j:6}
    Ответ написан
    Комментировать
  • Как получить распарсить и вернуть строку из функции bash?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    запускаю эту команду из командной строки за флагом -- p-4
    и мне нужно получить 4-ку чтобы обработать её в дальнейшем.


    как-нибудть так?:
    #! /bin/bash
    
    foo()
    {
        RES="${1#p-}";
    }
    
    foo "$1"
    echo "$RES"


    из объяснений ничего непонятно.
    Ответ написан
  • Как отправить в uart символ по его коду?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Как с помощью баш отправлять символы в уарт по их кодам?

    export hexcode=41 #'A'
    printf "\x$hexcode" > /dev/ttyS0


    Есть ли различия между представлениями символа в uart/linux/bash/stm32 ?

    man ascii, man charsets

    от чего зависит какое количество бит/байт получит функция считывания одного символа по уарт?

    Количество бит в символе зависит от настроек UART, см. man stty, параметр cs. Обычно API чтения из UART оперируют байтами.
    Ответ написан
    4 комментария
  • Можно ли запустить bash-скрипт в текущем процессе?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Однако я не могу получить доступ к любой из инициированных скриптом переменных в текущем процессе. Как я понимаю, это происходит потому, что скрипт выполняется отдельным процессом, а возможности экспортировать переменную на уровень выше нет.

    Непонятно, каково отношение между "скриптом" и "текущим процессом". Кто кого запускает?

    Если скрипт запускает процесс, то переменные окружения надо экспортировать, как сказано здесь. Если процесс запускает скрипт как другой процесс, то никакие изменения в переменных окружения сделанные скриптом в процессе видны не будут.
    Ответ написан
    Комментировать
  • Почему в цикле While read не вся строка присваивается переменной?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    на выходе получаю архивы только с фамилией, а не со всей строкой(

    добавь кавычки:
    #!/bin/bash
    while read REPLY; do
    zip -r "/nichego/$REPLY" /archivs/* ;
    done < fio.txt
    Ответ написан
  • Bash Script работает некорректно, почему?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Bash Script работает некорректно, почему?
    #!/bin/sh
    В чем может быть проблема?

    Потому что это не bash скрипт. bash скрипт начинается словами #!/bin/bash. Твой скрипт хочет чтобы его выполнял /bin/sh, а он не обязан быть башем.
    Ответ написан
    1 комментарий
  • Как поменять комментарии коммита из файла?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Прошу помочь с оптимизацией данного скрипта.

    Избавиться от цикла, перенеся логику внутрь команды передаваемой в --msg-filter. Примерно так:

    #!/bin/bash
    
    fille="$1"
    
    cmd=
    
    while read -r line; do
      source=$(echo "$line" | awk 'BEGIN { FS = "," } { print $1} ');
      target=$(echo "$line" | awk 'BEGIN { FS = "," } { print $2} ');
      cmd="${cmd}s,$source,$target,g;"
    done < "$file"
    
    git filter-branch -f --msg-filter "sed -e '$cmd'"
    Ответ написан
    Комментировать
  • Почему в bash не отображается переменная внутри echo при запуске из-под Cron?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    При запуске через Cron всегда в $RESULT пусто.
    Почему?

    Скорее всего потому что не удаётся запустить /usr/local/bin/wp. Для разнообразия можно сделать так:
    RESULT=$(/usr/local/bin/wp core verify-checksums --allow-root --path=/var/www/web/ 2>&1 )

    чтобы посмотреть на полный вывод команды.
    А кроме того, команды обычно устанавливают статус выхода в зависимости от успеха/неуспеха. Его можно достать из $?. И если /usr/local/bin/wp всё делает правильно, то часть с IS_OK можно переписать так:
    IS_OK=$?
    if [ $IS_OK == 0 ]; then
    Ответ написан
    Комментировать
  • Как сделать loop по директориям с пробелами?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Наверняка есть какое-то просто решение?

    Классика же, разделять имена нулями:
    locate -0 '.txt' | xargs -0 -I\{} echo 'cp "{}" /mnt/e/BOOK'
    Ответ написан
    2 комментария
  • Записать значение команды bash в переменную?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    echo -en 'AT^NDISDUP=1,1,"internet.tele2.ru"\r\n' > /dev/ttyUSB2

    Эта команда чтобы установить соединение? А к моменту вызова команды ip=$(ip addr show wwp0s6u2i1 ... оно уже успевает установиться и интерфейс получает ip-адрес?
    Ответ написан
  • Не работает вложенный цикл на bash. Почему?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    set -f; IFS=";"; arr=${site[$key]}

    Ну так вот тут уже не работает. Зачем так делать, почему было бы не завести с самого начала два отдельных массива -- для адресов и для cnt?
    Ответ написан
    Комментировать