Ответы пользователя по тегу zsh
  • Почему результат find в shell скрипте это текущая папка?

    saboteur_kiev
    @saboteur_kiev Куратор тега bash
    software engineer
    так у вас же скрипт запускается не внутри Melodyne 5, а на рабочем столе, а для него Melodyne 5 это как раз первая папка подходящая под условие "Melodyne*"
    Ответ написан
  • Как научить терминал zsh понимать звёздочку ( * ) при работе с pip (python менеджер) так же как bash?

    saboteur_kiev
    @saboteur_kiev
    software engineer
    В команде
    pip install django==3.*

    Никакой ни bash ни zsh не ищет вам последнюю версию джанго. Это делает сам pip
    Использование wildcard символов, на самом деле может привести к неочевидной ситуации, когда

    $ echo Hello* World
    Hello* World
    $ touch Hello1
    $ echo Hello* World
    Hello1 World


    То есть баш, если находит что-то по маске, подставляет, если не находит - не подставляет и молча отправляет в команду wildcard символы как есть.
    Это приводит к неочевидным ошибкам, про которые как бы нет сообщений об ошибке, а ошибка может случиться.

    В zsh этот момент учли и сделали так, чтобы если по wildcard ничего не найдено, то zsh не молчит, а выдает ошибку. И следовательно в команду не уйдет неэкранированный wildcard.
    Сделано специально, чтобы пользователь не тупил а экранировал wildcard символы, и не стеснялся пользоваться кавычками и бэкслешом.

    Следовательно, если это у тебя не файловые wildcard символы, а аргумент для команды pip - экранируй, бери в кавычки, и переделай свою привычку "мне это неудобно" в "это правильно".

    Простой способ это
    noglob pip install django==3.*
    Или даже
    alias pip="noglob pip"

    P.S. Можно отключить это глобально через "setopt NOMATCH" или вроде "setopt nonomatch"
    P.P.S. да, это элементарные вещи, которым ты просишь не учить, но это именно тот случай, когда ты неправ, потому что путаешь wildcard шелла и опции команды, которая внутри тоже поддерживает символы типа ? и *
    Ответ написан
    2 комментария
  • Как в скрипт передать аргументом нужную директорию?

    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 комментария
  • Как оптимизировать данный скрипт?

    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 задачу"
    Ответ написан
  • Как включить в zsh регулярные выражения?

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