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: поточный вариант на шелл можно посмотреть здесь

★★★★★

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

fileName это какая-то специфичная переменная?

что за «х» перед переменными?

upd: работает и без «х»

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

fileName это какая-то специфиченач переменная?

Нет, просто я так назвал.

что за «х» перед переменными?

Для демонстрации в выводе начала значения переменных. Видно, что их две, и во второй имя файла.

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

рано я возрадовался

vv@vv-Latitude-E5520 ~/.local/bin $ realpath --relative-to=~ ./vcsh_logout 
The program 'realpath' is currently not installed. You can install it by typing:
sudo apt-get install realpath
vv@vv-Latitude-E5520 ~/.local/bin $ 
ZuBB ★★★★★
() автор топика
Ответ на: комментарий от ZuBB

и даже так

vv@vv-Latitude-E5520 ~/.local/bin $ realpath --relative-to=~ ./vcsh_logout 
realpath: unrecognized option '--relative-to=~'
Usage:
 realpath [-s|--strip] [-z|--zero] filename ...
 realpath -h|--help
 realpath -v|--version
vv@vv-Latitude-E5520 ~/.local/bin $ man realpath
ZuBB ★★★★★
() автор топика
Ответ на: комментарий от ziemin

а как насчет этого?

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

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

так и есть

генту + sys-apps/coreutils-8.21:

vv@crusader ~/.local/bin $ realpath --relative-to=~ vcsh_logout 
../vcsh_logout
vv@crusader ~/.local/bin $ 
ZuBB ★★★★★
() автор топика
Ответ на: комментарий от ZuBB
vv@vv-Latitude-E5520 ~/.local/bin $ dpkg -L coreutils | grep bin | grep path
/usr/bin/pathchk
vv@vv-Latitude-E5520 ~/.local/bin $ dpkg -L coreutils | grep bin | grep real
vv@vv-Latitude-E5520 ~/.local/bin $ 
ZuBB ★★★★★
() автор топика
Ответ на: комментарий от ziemin

все равно есть ".."

vv@crusader ~ $ realpath --relative-to=~ .local/bin/vcsh_logout
../.local/bin/vcsh_logout
vv@crusader ~ $ 

Надо выполнять в домашнем каталоге.

звучит както не очень..

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

read garbage, fileName
В garbage будет 'M', в fileName - имя файла и sed не нужен

что будет если в пути файла будет пробел(ы)? например

./config/some app/config

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

В данном конкретном случае ничего, потому что read читает остаток строки в последнюю переменную. А в общем случае может сдвинуться.

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

атата

vv@e5520 ~/.local/bin $ ./vcsh_logout 
error: pathspec '"../../.config/test app/config"' did not match any file(s) known to git.
vv@e5520 ~/.local/bin $ 
ZuBB ★★★★★
() автор топика
Ответ на: комментарий от ziemin
vv@e5520 ~/.local/bin $ ls -l ../../.config/test\ app/config 
-rw-rw-r-- 1 vv vv 0 кві 19 16:12 ../../.config/test app/config
vv@e5520 ~/.local/bin $ 
ZuBB ★★★★★
() автор топика
Ответ на: комментарий от ziemin

думаю что нет

vv@e5520 ~/.local/bin $ gt st
On branch master
Your branch is up-to-date with 'origin/master'.

Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

	new file:   ../../.config/test app/config

vv@e5520 ~/.local/bin $ 
ZuBB ★★★★★
() автор топика
Ответ на: комментарий от intelfx

Башизма там нет, ${имя#образец}, а также ##, %, %% - стандарт с незапамятных времён, а вот // - нет.

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

ТС хотел не «передать какой-то стейт», а получить код, работающий в том числе в дебиановском dash.

Ну и сабшелл там, где это не нужно.

Ну и трогательная забота об эффективности там, где это не просто не нужно, а никто без электронного микроскопа не рассмотрит.
Кстати, в bash для решения этих вопросов существует ещё и shopt -s lastpipe, правда, относительно недавно.

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

Это нетривиально. bash - обязательный компонент в Gentoo для работы portage. bash в Gentoo зависит от ncurses.

Но если собирать в другой ROOT, в котором не требуется работоспособность portage и не нужен bash - это возможно.

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

черт, ncurses прописана в DEPEND bash`а.

вот что я хочел сказать: процедура очистка экрана вызывается из файла ".bash_logout" который «принадлежит» пакету bash. сама очистка делается командой «clear» из пакета ncurses. Уже здесь можно помахать пальчиком. Но к [сщастью] для баша ncurses прописана как жесткая зависимость. Если у пользователя другой шел и нет баша с его зависимостью, то получается бяка..

Да, я знаю что в сем опусе слишком много «если». Но тем не менее

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

офтоп++

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

ABW может ты тоже чего подскажеш?

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

Разве что, если у тебя в ~/.config/bash нет файлов, которые включать не надо,

for F in ~/.config/bash/* ; do . "${F}" ; done
Правда тогда порядок включения алфавитный, и если он важен, то придётся переименовывать в стиле '00_...'.
Собственно, если расчитывать только на bash в не-posix режиме, можно проверки существования вообще опустить, правда тогда придётся либо терпеть мусорный вывод, либо глушить stderr, что черевато.
Ну или
for F in ~/.config/bash{config,path,...,async} ; do
  [ -f "${F}" ] && . "${F}"
done
Хотя слабо верится, что поможет (правда, что на таком количестве файлов появляются ощутимые тормоза, мне тоже представить трудно).

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

а чем твой вариант будет быстрее моей череды вызовов?

в моем случае «ощутимые тормоза» == ~30мсек. мерял так

time urxvt -e logout

с пустым и полным ".bashrc"

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

А я и не сказал «будет быстрее», я сказал «можно попробовать».
Тем более что 30 мсек - задержка меньшая, чем может быть, например, разница между первым и последующими запусками в системе с hdd. Так что твоё ручное измерение некорректно, а писать корректный тест для такой ерунды неинтересно. Визуально заметить разницу можно только если общее время старта не больше ~90 мсек, тщательно присматриваясь, и то «может не только каждый».

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

Там интереснее другое - как выглядят имена, содержащие:
1) [:space:] в начале.
2) \n в любом месте.
3) прочие непечатаемые символы.
4) собственно '\'.
5) могут ли вдруг встретиться строки другого формата (не '^M .*')
Извини, но vcsh у меня нет, и разбираться, чей это формат, его или git, мне не с руки.

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

нашел что тормозит следующий код

# This loads nvm
NVM_DIR="/home/vv/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"

# Add RVM to PATH for scripting
PATH="$PATH:$HOME/.rvm/bin"
# Load RVM into a shell session *as a function*
[[ -s "$HOME/.rvm/scripts/rvm" ]] && . "$HOME/.rvm/scripts/rvm"

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

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

лаг заключается в следующем: окно терминала появляется, но приглашение (PS1) рисуется с небольшой задержкой

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

Ты опять показываешь код, в котором тормозить просто нечему.
Тормоза могут быть внутри nvm.sh или rvm, а кто это такие? Ruby Version Manager? Java Research Virtual Machine? OpenVera Reference Verification Methodology? Coda Recoverable Virtual Memory?
Для грубого профилирования и поиска узких мест дихотомией можно пользоваться тем, что встроенная time работает и со встроенными командами, а так же напихать в код отметчиков вида

date --rfc-3339=ns | logger -t Tutochki_0

пока не нашел способа как «убрать его в фон», но при этом оставить рабочим функционал

Судя по «# Load RVM into a shell session *as a function*» в принципе никак, потому что «предоставление функциональности» здесь как раз заключается в модификации текущей среды, а фоновый процесс по определению работает в новой и среду родителя модифицировать не может.

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

пока этот дебаг оставил на потом

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

я правильно понял что trap 'функция' EXIT нужно добавить не в .bash_logout а (например) в .bashrc?

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