LINUX.ORG.RU

Помогите переписать руби скрипт на шелл(или баш)

 , posix shell,


1

1

Я тут перебрался на ссд и решил наконец-то сделать автобекап для конфигов. следующий код вешается на ".bash_logout" (а кстати есть шелло-независимый «что-то_logout»?)

`vcsh list`.strip().split(/\n/).each do |repo| 
    repo = repo.strip() 
    lines = `vcsh status #{repo}`.split(/\n/) 
    next if lines.empty?() 
 
    lines.each do |line| 
        filePath = line.sub(' M ', '') 
        message = "autoupdate of '#{filePath.gsub('../', '')}'"  
        `vcsh run #{repo} git commit #{filePath} -m "#{message}"` 
    end 
 
    `vcsh push > /dev/null` 
end 

ах, да. желательно не использовать башизмы

upd: поточный вариант на шелл можно посмотреть здесь

★★★★★

Без башизмов я не умею, потому что POSIX sh — убожество, поэтому вот:

while read repo; do
     while read line; do
        filePath="${line# M }"
        message="autoupdate of ${filePath//..\//}"
        vcsh run "${repo}" git commit "${filePath}" -m "${message}"
    done < <(vcsh status "${repo}")

    vcsh push "${repo}" > /dev/null
done < <(vcsh list)
intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 3)
Ответ на: комментарий от ZuBB

intelfx, не пашет в бубунту/dash

vv@vv-Latitude-E5520 ~/.local/bin $ ./vcsh_logout
error: pathspec 'M ../../.config/git/aliases' did not match any file(s) known to git.
error: pathspec 'M vcsh_logout' did not match any file(s) known to git.
Everything up-to-date
vv@vv-Latitude-E5520 ~/.local/bin $ 
ZuBB ★★★★★
() автор топика
Ответ на: комментарий от entefeed

неа. просто шел/баш есть по дефолту.

впрочем своим коментом ты про себя уже создал мнение

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

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

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

Перед M действительно идёт пробел? Добавь echo "'$line'" и покажи выхлоп.

В принципе уже понятно, что нет. Убери пробел между # и M

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

работает. до следуещего edge case.

спасибо

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

В исходном скрипте сказано, что строчки начинаются с M , а тут, по ходу, — M ...

while read repo; do
     while read line; do
        filePath="${line#M }"
        message="autoupdate of ${filePath//..\//}"
        vcsh run "${repo}" git commit "${filePath}" -m "${message}"
    done < <(vcsh status "${repo}")

    vcsh push "${repo}" > /dev/null
done < <(vcsh list)
intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 1)
Ответ на: комментарий от ziemin

А, ну да, там по одному слову на строчку — пофиг, по чему сплитить. Извини.

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

Вполне актуальна, сейчас всё происходит точно так же.

Кстати, в статье это явно не упоминается, но, по-моему, оно заслуживает отдельного упоминания: login shell-ы не выполняют bashrc (а только profile).

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

P. S.: шеллонезависимого аналога .bash_logout вроде как нет. Ну, может, если только остальные шеллы запилили режим совместимости с bash. Да и то, оно работает только при консольном логине, а если, к примеру, ты пользуешься дисплейным менеджером, то .bash_logout не выполняется.

Впрочем — у тебя systemd? Через него это делается.

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

а кстати есть шелло-независимый «что-то_logout»?

нет, но trap 'функция' EXIT работает и для интерактивного shell.

Без башизмов я не умею, потому что POSIX sh — убожество

В приведённом примере башизм <(vchs...) (подстановка процесса) абсолютно не нужен, через обычный pipe ( vchs ... | while read ... ) проще, а башизм ${filePath//..\//} легко заменяется.
Так что кто убожество мы деликатно промолчим.

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

а кстати есть шелло-независимый «что-то_logout»?

нет, но trap 'функция' EXIT работает и для интерактивного shell.

это я уже сам нашел

а что лучше «vchs ... | while read» или «for repo in `vcsh list`; do» в контексте posix shell? мне кажется что 2е должно быть быстрее. но я ни разу не спец в bash/shell

башизм ${filePath//..\//} легко заменяется

а не подскажете на что?

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

шеллонезависимого аналога .bash_logout вроде как нет.

а если бы был, как его правильно назвать: ".sh_logout" или ".shell_logout"?

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

Не тому отвечаешь.

башизм <(vchs...) (подстановка процесса) абсолютно не нужен

До тех пор, пока тебе не захочется передать какой-то стейт из цикла наружу. Ну и сабшелл там, где это не нужно.

башизм ${filePath//..\//} легко заменяется.

Заменяется на очередной конвейер и вызов седа.

Так что кто убожество мы деликатно промолчим

Пропуская 5.2, замечу — я не говорил, что на POSIX sh невозможно писать. Возможно, но неудобно. Потому и «убожество».

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

еще углубляясь в офтоп

root@vv-Latitude-E5520:~# cat /etc/skel/.bash_logout
# ~/.bash_logout: executed by bash(1) when login shell exits.

# when leaving the console clear the screen to increase privacy

if [ "$SHLVL" = 1 ]; then
    [ -x /usr/bin/clear_console ] && /usr/bin/clear_console -q
fi
root@vv-Latitude-E5520:~# 
vv@crusader ~ $ cat /etc/skel/.bash_logout
# /etc/skel/.bash_logout

# This file is sourced when a login shell terminates.

# Clear the screen for security's sake.
clear
vv@crusader ~ $ 

есть идеи почему используются разные инстументы (бубунту - баш, генту - ncurses)?

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

выпей успокоительного, и не говори глупостей, клован

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

хм, в убунту 4.3-7ubuntu1.5 и dpkg говорит что clear_console принадлежит ему..

мож кто-то другой что подскажет что это за зверь такой clear_console

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

вот поточный код. мож еще чего подскажете?

#!/usr/bin/env bash

for repo in `vcsh list`; do
     vcsh status "${repo}" | while read line; do
        filePath=`echo $line | sed 's/^M //'`
	message="autoupdate of '`echo $filePath | sed 's/\.\.\///g'`'"
        vcsh run "${repo}" git commit "${filePath}" -m "${message}"
    done

    # https://github.com/RichiH/vcsh/issues/157
    vcsh run "${repo}" git push -q;
done

ABW, ziemin, тож гляньте

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

Нафига тебе коммент к каждому файлу, если можно к коммиту всех сделать коммент? Или в гите нельзя откатить один файл?

А добавляются ли новые файлы, или ты их вручную собираешься добавлять?

Если уж собрался формировать комментарий к каждому файлу пиши его в комментариях конфига, выделяя какой-нибудь строкой. А потом запихивай в сообщение. Например

...
msg=`grep "xxxMSGxxx" ${file} | sed 's/.*xxxMSGxxx\(.*\)$/\1/'`
...

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

наверно нужно привести оба цикла к одному виду. в 1м цикле на вход приходит строка с словами разделенными «\n». во 2м строки также разделенными «\n». но строка содержит пробелы

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

в гите нельзя откатить один файл?

можна

Нафига тебе коммент к каждому файлу, если можно к коммиту всех сделать коммент?

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

А добавляются ли новые файлы, или ты их вручную собираешься добавлять?

вручную. а что есть лучший вариант

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

нет

/usr/bin/clear_console: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=4719982da60f9f1bc13f812a2864acf6f6e0e19a, stripped

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