LINUX.ORG.RU

Скрипт для проверки обновлений (arch)

 , , , ,


0

3

Суть в чём: если есть обновления, то вывести «There is update for 1 package» (если пакет один) или «There are updates for $pkgs packages» (если пакетов более 1), а если обновлений нет, то ничего не выводить. Сейчас сам попробовал накостылить, но такое никуда не годится:

#!/bin/zsh
ign=1
pkgs=$(($(yaourt -Qqu | wc -l) - $ign))
if [[ $pkgs = 1 ]]; then
echo "There is update for 1 package"
else if [[ $pkgs > 1 ]]; then
echo "There are updates for $pkgs packages"
fi
fi
Во-первых, будет фигня, если апдейтов для игнорируемых пакетов не будет (сейчас в игноре firefox и есть обнова для него). Нужно как-то исключать из вывода yaourt -Qqu пакеты, которые находятся в игноре, но я не знаю как. Для быстродействия (скрипт планирую запихнуть в zshrc (чтобы при открытии терминала сообщал об обновлениях и можно было сразу обновиться из этого же терминала), поэтому нежелательно, чтобы долго тупил) готов прописывать сразу переменной в скрипте, а не лезть в конфиг пакмана и оттуда доставать. Не было бы игнорируемых пакетов, всё было бы намного проще. Во-вторых, нутром чую, что у меня сейчас получился какой-то ужасный и некрасивый говнокод.
Заранее спасибо.

★★★★★

Последнее исправление: sudopacman (всего исправлений: 1)

yaourt -Qqu |
awk '
  {
    if($1 == 0)
      printf ""
    else
      if($1 == 1)
        print "There is update for " $1 " package."
      else
        print "There are update for " $1 " packages"
  }
'

С игнорами будет раза в полтора сложнее.

r3lgar ★★★★★
()

Нужно как-то исключать из вывода yaourt -Qqu пакеты, которые находятся в игноре, но я не знаю как.

Пройдись седом по выхлопу yaourt и выпили нужные строки. Как-то так:

#!/bin/zsh
ign="firefox\\|chromium"
pkgs=$(yaourt -Qqu | sed "/$ign/d" | wc -l)
if [[ $pkgs = 1 ]]; then
echo "There is update for 1 package"
else if [[ $pkgs > 1 ]]; then
echo "There are updates for $pkgs packages"
fi
fi
archie
()
Ответ на: комментарий от r3lgar

Выхлопа чего? У yaourt -Qqu вывод это просто названия пакетов, для которых есть обновления, разделённые '\n':

 ~ — y -Qqu
firefox
Нужно из этого вывода исключить пакеты, которые находятся в игноре, а потом wc -l и пошло-поехало.

sudopacman ★★★★★
() автор топика
Ответ на: комментарий от FIL

Нет, не гном. Да и тем более мне надо именно для терминала (zshrc).

sudopacman ★★★★★
() автор топика
Ответ на: комментарий от sudopacman

Ага. В переменной ign должно быть регулярное выражение. \\| - это вертикальная черта, экранированная обратным слешем, которая разделяет названия пакетов. Далее запускается yaourt -Qqu, вывод (то есть список пакетов по одному на каждую строчку) пропускается через sed, а sed удаляет те строки, которые соответствуют регулярке. Все просто.

archie
()
Ответ на: комментарий от archie

Ещё раз спасибо. А то с этими регулярными выражениями у меня не ладится.

sudopacman ★★★★★
() автор топика
Ответ на: комментарий от sudopacman

Перед тем, как [inlene]wc -l[/inlene], нужно парсить, есть ли в списке пакет из игнора, и исключать его оттуда. То есть проще всего делать цикл с условием на игнор с инкрементом, парся построчно, а после цикла уже писать условие на выхлоп. Я так понимаю, тебе для коньков надо?

Имей в виду, что под bash синтаксис немного иной, чем под zsh.

r3lgar ★★★★★
()

1. Я так понимаю, что для нормальной работы придется постоянно подтягивать локальные базы? Это плохо. Плохо делать

pacman -Sy
и не обновляться - можно попасть. https://bbs.archlinux.org/viewtopic.php?pid=802658#p802658

2. Хороший скрипт для коньков http://xyne.archlinux.ca/scripts/pacman/paconky - допили под себя. Конечно работать будет не быстро. Можешь как-нибудь в крон засунуть, писать результат в файл, а при открытии терминала выводить. Залоченые пакеты у меня печатает с пометками. Но я вроде что-то допиливал и в скрипте и в либах... Доберусь до работы - гляну.

MadMax
()
Последнее исправление: MadMax (всего исправлений: 1)
Ответ на: комментарий от archie

Подумал, что проблема решена, однако нет. sed «/$ign/d» убирает вообще весь вывод, а sed s/$ign//g оставляет пустую строку, так что wc -l всё равно её считает. Что-то тут не то.

sudopacman ★★★★★
() автор топика
Ответ на: комментарий от archie

Содержимое $ign то, что в скрипте.

 ~ — cat Документы/ucheck 
#!/bin/zsh
ign="firefox\\|"
yaourt -Qqu | sed "/$ign/d" | wc -l |
awk '
  {
    if($1 == 0)
      printf ""
    else
      if($1 == 1)
        print "There is update for " $1 " package."
      else
        print "There are update for " $1 " packages"
  }
'
 ~ — source Документы/ucheck 
 ~ — echo $ign              
firefox\|

Если что скрипт пробовал и такой, который в твоём комментарии. Проблема именно с sed

sudopacman ★★★★★
() автор топика
Ответ на: комментарий от sudopacman

Так это у тебя регулярка неправильная. \\| разделяет имена пакетов, если их несколько. Если пакет только один, то \\| в конце писать не надо - это невалидный синтаксис. Вот так попробуй:

ign="firefox"
Можно вообще без переменной ign обойтись:
yaourt -Qqu | sed '/firefox/d' | wc -l
Или даже использовать grep с ключиком -v, что выглядит попроще:
yaourt -Qqu | grep -v 'firefox' | wc -l
Проверь эти команды прямо в терминале. УМВР. Правда bash, но здесь разницы быть не должно.

archie
()
Ответ на: комментарий от archie

Ещё раз спасибо. grep -v, похоже, то, что надо. Сейчас обновлений нет, но с другими командами вроде нормально пашет (проверял ls | grep -v «Загрузки\\|Видео», вывел всё ок).

Сейчас скрипт имеет такой вид, надеюсь, на этот раз всё будет работать как надо:

#!/bin/bash
ign="firefox"
yaourt -Qqu | grep -v $ign | wc -l |
awk '
  {
    if($1 == 0)
      printf ""
    else
      if($1 == 1)
        print "There is update for " $1 " package."
      else
        print "There are update for " $1 " packages"
  }
'

sudopacman ★★★★★
() автор топика
Последнее исправление: sudopacman (всего исправлений: 1)
Ответ на: комментарий от anonymous

Я проверял и с разделителем, работает.

sudopacman ★★★★★
() автор топика
Ответ на: комментарий от Deleted

Можно, конечно, поставить какю-нибудь гуишную хрень, которая будет следить за обновами, но мне это не надо.

sudopacman ★★★★★
() автор топика

Сначала думал, что скрипт (уже обновлённый не работает). Потом оказалось, что yaourt -Q(q)u для актуального вывода требует перед собой ещё выполнения yaourt -Syy. Во как.

sudopacman ★★★★★
() автор топика
8 марта 2017 г.

#!/bin/zsh

ign=`cat /etc/pacman.conf | grep -e '^Ignore'| awk ' { print $3} '`

function pack_count { yaourt -Qqua | grep -v $ign | wc -l }

function pack_name { yaourt -Qqua | grep -v $ign }

«$1» exit

warlock9000
()
Ответ на: комментарий от MadMax

https://bbs.archlinux.org/viewtopic.php?pid=802658#p802658

Это ведь про частичные обновления проблема, а не про обновление базы без обновления самих пакетов. Частичные обновления не поддерживаются да, но обновлять только репы можно хоть каждый час, какая разница то?

man_of_motley ★★
()
Ответ на: комментарий от warlock9000

Оперативненько. Хотя, может, кому-то пригодится.

sudopacman ★★★★★
() автор топика
Ответ на: комментарий от man_of_motley

Возможно, Вы правы, а я нет. По-моему, на BBS читал еще какие-то посты по теме - но уже и не вспомню. По моей ссылке речь про установку нового пакета на необновленную систему.

MadMax
()
Ответ на: комментарий от MadMax

По моей ссылке речь про установку нового пакета на необновленную систему.

Да, частичное обновление

man_of_motley ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.