Ответы пользователя по тегу bash
  • Как в команде time задать на проверку длинную команду с другими параметрами?

    saboteur_kiev
    @saboteur_kiev Куратор тега Linux
    software engineer
    /usr/bin/time [-timeoptions] command [-commandoptions]

    Аргументы, которые следуют после команды будут относиться к команде, а не к time
    Ответ написан
    Комментировать
  • Почему сценарий выдаёт ошибку?

    saboteur_kiev
    @saboteur_kiev Куратор тега Linux
    software engineer
    #!/bin/bash
    
    echo -n "Enter a folder name: "
    read way 
    
    eval "ls $way"
    Ответ написан
    Комментировать
  • Как из bash запустить exe файл в windows?

    saboteur_kiev
    @saboteur_kiev Куратор тега bash
    software engineer
    А почему нельзя просто:
    ./file.exe
    ?
    Ответ написан
    Комментировать
  • Как выполнить INSERT в таблицу со спец символами через bash скрипт?

    saboteur_kiev
    @saboteur_kiev Куратор тега Linux
    software engineer
    В одинарных кавычках можно передавать символы как есть
    В двойных - некоторые сохраняют специальное значение ($, \)
    бэкслеш экранирует один следующий символ, если это спецсимвол.

    Вы не привели примера строки, которая у вас не работает, но на самом деле там несложно.
    Можно выносить в отдельный файл, можно делать перенаправление через <
    Ответ написан
  • Разница командных строк?

    saboteur_kiev
    @saboteur_kiev Куратор тега Linux
    software engineer
    Вам нужно почитать что такое переменная PATH и как ее настроить в Линукс и в Windows - в ней перечислены каталоги, в которых происходит поиск команд-программ.

    Если вы пишете команду в строке, то
    в Windows:
    * Проверяется является ли эта команда внутренней командой (echo, set)
    * Есть ли такая программа в текущем каталоге (если указана без расширения, то ищется CMD.bat, CMD.cmd, CMD.exe, CMD.com
    * Есть ли такая программа в каталогах, перечисленных в PATH

    в Linux:
    * Проверяется является ли эта команда внутренней командой шелла (echo, set)
    * Есть ли такая программа в каталогах, перечисленных в PATH (у файла должен быть аттрибут executable)
    Ответ написан
    Комментировать
  • Почему переменная раскрывается с кавычками либо пытается сразу передать файлы?

    saboteur_kiev
    @saboteur_kiev Куратор тега bash
    software engineer
    Вообще-то ваша конструкция должна работать и у меня работает вполне корректно.

    Можете привести пример вывода и убедиться что хотя бы один pdf файл в нужном каталоге есть?
    У вас точно есть *.pdf файлы по указанному пути? Может там file.PDF ?
    Ответ написан
  • Как решить проблему с if..else в bash?

    saboteur_kiev
    @saboteur_kiev Куратор тега Linux
    software engineer
    По умолчанию баш создает все переменные текстовыми, следовательно
    res=$a+$b у вас получается контакенация строк, а не сложение чисел.

    Используйте явное арифметическое сложение через res=$(( $a + $b ))
    либо заранее все переменные задекларируйте как integer через
    declare -i a
    declare -i b
    declare -i res
    declare -i path

    А в идеале и сравнение вместо [[ "$path" = "$res" ]] делайте числовым [[ $path -eq $res ]]
    Ответ написан
    1 комментарий
  • Как распарсить файл?

    saboteur_kiev
    @saboteur_kiev Куратор тега bash
    software engineer
    awk -F "[:# ]" '{print $1" "$2":"$3" "$5" "$7}' file.log
    Ответ написан
    1 комментарий
  • Как запустить sh скрипты в Linux?

    saboteur_kiev
    @saboteur_kiev Куратор тега Linux
    software engineer
    Нужно просто осознать, что в Linux не существует ассоциаций файлов по расширениям.
    Расширение для Линукса - просто часть файла после последней точки, система никаких действий к этому не привязывает.

    Поэтому единственный способ делать .sh файлы исполняемыми - ставить на них флаг executable через
    chmod +x file.sh

    Другой вариант - запускать сам баш с передачей ему файла как аргумент (потому что бинарник bash-а уже с executable).
    bash file.sh
    Ответ написан
    Комментировать
  • Как решить проблему в Bash?

    saboteur_kiev
    @saboteur_kiev Куратор тега Linux
    software engineer
    -s проверяет что файл существует и он НЕ пустой.
    если хотите пользоваться test, то логика такая:

    if [ -f file.txt ]; then
      if [ -s file.txt ]; then
        echo "file.txt is not empty
      else
        echo "file.txt is empty"
      fi
    else
      echo "file.txt doesn't exists"
    fi


    Можно еще так
    if [[ $(stat -c "%s" file.txt) -eq 0 ]]; then
      echo "file.txt is empty"
    else
      echo "file.txt doesn't exist or not empty"
    fi
    Ответ написан
    Комментировать
  • Почему не могу убить процесс?

    saboteur_kiev
    @saboteur_kiev Куратор тега Linux
    software engineer
    kill -9 10434

    Бывает процессы зависают и не реагируют на дефолтный сигнал -15. Сигнал -9 нельзя игнорировать. Если процесс не сможет завершиться после -9, значит пора ребутить.
    Ответ написан
    2 комментария
  • Что лучше для скриптов?

    saboteur_kiev
    @saboteur_kiev Куратор тега Linux
    software engineer
    Зависит от назначения скрипта. Сложность задачи тут не так важна, как знание языка и смысл применения.

    bash - командный язык, для системных задач. Удобен если нужно запускать внешние приложения
    Питон - универсальный скриптовый язык.

    Например инсталлятор или управляющий скрипт в общем случае лучше писать на баше.
    Ответ написан
    1 комментарий
  • Как извлечь подстроку из строки при помощи grep?

    saboteur_kiev
    @saboteur_kiev Куратор тега Linux
    software engineer
    Как из нее получить значение ключа groupid - т. е. число 63?

    Примеры для MYSTRING:
    MYSTRING='{"jsonrpc":"2.0","result":[{"groupid":"63","name":"1voda","internal":"0","flags":"0"}],"id":1}'

    awk
    echo "$MYSTRING"|awk -F\" '{print $10}'

    grep
    echo "$MYSTRING"|grep -oP "groupid\":\"\K\d*"

    jq
    echo "$MYSTRING"|jq -r ".result[].groupid"

    variable expansion
    TMP="${MYSTRING#*groupid\":\"}";echo "${TMP%%\"*}"

    cut
    echo $MYSTRING|cut -d\" -f 10
    Ответ написан
    Комментировать
  • Как работает шебанг и итерпретатор Python?

    saboteur_kiev
    @saboteur_kiev Куратор тега Python
    software engineer
    /usr/bin/env это команда, которая найдет правильный бинарник. Потому что не во всех случаях, у вас питон лежит в /usr/bin, не во всех случаях у вас bash лежит в /usr/bin

    Это просто больше стабильности для скриптов которые могут запустить на ембеддед линуксе, в виндовс cygwin и других окружениях
    Ответ написан
    Комментировать
  • Как в скрипт передать аргументом нужную директорию?

    saboteur_kiev
    @saboteur_kiev Куратор тега bash
    software engineer
    Создать кастомные автокомплит для собственной команды, чтобы автоматически дополнялись аргументы можно.

    Для этого вам нужно поковырять bash completion.
    Весь автокомплит создан на баш скриптах, и подключается в глобальном профайле

    Сами скрипты лежат обычно где-то тут:
    /etc/bash_completion

    Что почитать - гуглить на тему bash completion:
    https://www.tldp.org/LDP/abs/html/tabexpansion.html
    https://debian-administration.org/article/316/An_i...

    P.S. Хотя я увидел у вас zsh, может быть в нем есть вариант попроще.

    P.P.S. Есть вариант еще проще - наделать алиасов или скриптов с полным именем и все =)
    Ответ написан
    4 комментария
  • Как используя команду cat, не больше двух раз, записать строки из stdin в начало и конец файла?

    saboteur_kiev
    @saboteur_kiev Куратор тега bash
    software engineer
    cat "файл_с_рандомными_строками_в_начало" "оригинальный_файл" "файл_с_рандомными_строками_в_конец"> temp
    cat temp > "оригинальный_файл"


    например
    $ echo "string3" > file.txt
    $ cat - file.txt - > temp.txt
    string1
    string2
    *** НАЖАТЬ CTRL+d для завершения ввода строк которые пойдут в начало файла
    string4
    string5
    *** НАЖАТЬ CTRL+d для завершения ввода строк которые пойдут в конец файла
    $ cat temp.txt > file.txt
    $ cat file.txt
    string1
    string2
    string3
    string4
    $
    Ответ написан
    5 комментариев
  • Как отследить разрыв соединения с помощью bash?

    saboteur_kiev
    @saboteur_kiev Куратор тега Linux
    software engineer
    А банально добавить в proxy.sh вывод на экран
    #!/bin/bash
    
    ssh \
      -L 9080:loc0.domain.com:80 \
      -L 9081:loc1.domain.com:80 \
      -L 9082:loc2.domain.com:80 \
      -N vpn
    echo "************ Proxy has been terminated ********"


    И запускать его в той же вкладке, где вы работаете?
    ./proxy.sh &
    Можно еще и 07 символ добавить, чтобы он гудел.
    Можно положить запуск прокси в вечный while, пока вы его сами не прервете.
    Смотря что удобнее.
    Ответ написан
    1 комментарий
  • Как в линуксе запускать программы отдельно от терминала?

    saboteur_kiev
    @saboteur_kiev Куратор тега Linux
    software engineer
    screen
    Ответ написан
    Комментировать
  • Как оптимизировать данный скрипт?

    saboteur_kiev
    @saboteur_kiev Куратор тега bash
    software engineer
    А зачем?
    Тут все достаточно оптимально.
    Ну разве что заменить `` на $()
    И year и month не вычислять каждый раз, а сделать это один раз.

    #!/bin/sh
    # Пример пути до сайта /var/www/site.ru/web/
    SITEDIR="/var/www"                                  # Папка до названия доменаов
    WEB="web"                                           # Папка после названия доменов (если есть)
    LIST=${1:-$(ls -L $SITEDIR | grep -E ".*\.\w{1,5}")} # Название сайта, тут выбор или аргумент или, регулярка  можно убрать только -L ;) 
    DBCONN="bitrix/php_interface/dbconn.php"            # Откуда читать настройки mysql
    FTPUSER="*******"                                   # Логин FTP сервера
    FTPPASS="****************"                          # Пароль FTP
    FTPHOST="**************************"                # сервер FTP
    FTPDIR="/server8/site/"                             # папка на FTP
    TMPDIR="/var/backup/site"                           # Где будут храниться временные файлы
    DATE=$(date +"%Y-%m-%d")
    YEAR=$(date +%Y)
    MONTH=$(date +%m)
    
    test ! -d $TMPDIR/$YEAR/$MONTH && mkdir -p $TMPDIR/$YEAR/$MONTH # создаем  структ уру каталогов если их нет
    
    for ELEMENT in $LIST
        do
        if [ ! -f /$SITEDIR/$ELEMENT/$WEB/$DBCONN ]; 
          then
              echo " Файл $SITEDIR/$ELEMENT/$WEB/$DBCONN не найден, сайт будет без БД!"
          else        
            DBLOGIN=$(grep "^\$DBLogin =" $SITEDIR/$ELEMENT/$WEB/$DBCONN | cut -f2 -d'"')
            DBPASS=$(grep "^\$DBPassword =" $SITEDIR/$ELEMENT/$WEB/$DBCONN | cut -f2 -d'"')
            DBNAME=$(grep "^\$DBName =" $SITEDIR/$ELEMENT/$WEB/$DBCONN | cut -f2 -d'"')
            mysqldump -u$DBLOGIN -p$DBPASS $DBNAME > $SITEDIR/$ELEMENT/$WEB/$DBNAME-$DATE.sql && echo "Дамп БД $DBNAME будет сохранен в корне сайта"  ||  echo "Ошибка дампа базы данных " $DBNAME
        fi 
    
        echo "Архивируем сайт $ELEMENT" 
      tar -cvpzf $TMPDIR/$YEAR/$MONTH/$ELEMENT-$DATE.tar.gz --directory $SITEDIR/$ELEMENT/$WEB --ignore-failed-read --exclude='./bitrix/tmp' --exclude='./bitrix/updates' --exclude='./bitrix/backup/*\.gz*' --exclude='./bitrix/backup/*\.tar*' --exclude='./bitrix/cache' --exclude='./bitrix/managed_cache' --exclude='./bitrix/stack_cache' --exclude='./upload/resize_cache' --exclude='./stats' . >> /dev/nool 2> /var/log/backup_error.log
      rm -f $SITEDIR/$ELEMENT/$WEB/$DBNAME-$DATE.sql # поскльку ложим на реальный сайт, ибо нормально добавить в архив не получитяс.
      
      echo "Сохраняем $ELEMENT на FTP"
      wput  --basename=$TMPDIR --limit-rate=60000K --timestamping  --remove-source-files --tries=2 $TMPDIR/$YEAR/$MONTH/$ELEMENT-$DATE.tar.gz ftp://$FTPUSER:$FTPPASS@$FTPHOST$FTPDIR
      rm -f $TMPDIR/$YEAR/$MONTH/$ELEMENT-$DATE.tar.gz
      done
    rm -r $TMPDIR


    Если хотите оптимизировать, надо менять правила игры. Например выяснить, что на удаленный хост можно не ftp, а ssh тогда можно разные вещи делать, начиная от tar прямо на удаленный хост, или вообще подключить удаленный хост по NFS и сразу на него ложить как в папку.
    Не очень понятно, что вы имеете ввиду про "сохранить 1 задачу"
    Ответ написан
  • Как заменить разные строки на разные данные в файле?

    saboteur_kiev
    @saboteur_kiev Куратор тега bash
    software engineer
    Ну можно так.
    Но задача у вас странная.. Ее бы в корне переделать.
    num=( 16 19 )
    text=( test1 test2 )
    declare -i index=0
    
    while [ -n "${num[$index]}" ]
    do
      echo "DEBUG: $index, ${num[$index]}, ${text[$index]}"
      sed -i -r "s/^${num[$index]}\./#${num[$index]}/" file
      sed -i -r "s/^[^\d#].*${num[$index]}/TEXT:${text[$index]}/" file
      index+=1
    done
    Ответ написан