LINUX.ORG.RU

bash и функции: хочу странного

 ,


0

1

если функция уже определена, то можно ли её дополнить?
можно, конечно, запилить workaround с переопределением, типа

if [[ "$(declare -f function)" ]];then
    workaroud(){ function;}
    function(){ workaround; function;}
fi
но это кажется мракобесием
как быть?
да, имя функции менять нельзя, иначе всё развалится, точнее просто не будет работать, т.к. запускается именно function

★★★★

Будь как потеринг, напиши новый экземпляр функции.

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

не работает же в неинтерактивном режиме, не?

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

питон это вообще исчадие ада.

copy_function() {
  declare -F "$1" > /dev/null || return 1
  local func="$(declare -f "$1")"
  eval "${2}(${func#*\(}"
}

уж лучше питон

Stil ★★★★★
()

сделал так

if [[ "$(declare -F defined)" ]];then
	eval "$(declare -f defined | sed "s|\(.*\)}|\1new;}|")"
else
	defined(){ new;}
fi

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

потому что ты уже сломал себе мозг.
питон это наркомания похуже героиновой и синтетическо-психотропной

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

а ты, видимо, дегенерат.
ой, это же ты - вопрос отпал сам собой

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

теоретизирую всего лишь :)

т.к. подозреваю по аналогии, что OOP-вычисления ebuilds сделаны через слияние кусков (типа «шитый код») на bash и команды source. Если повторно сделать source для модифицированного кода, то возможно отработает как надо.

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

эм...давай так.
в портаже функция src_install может переопределяться в зависимости от используемого eclass.
но! в любом случае выполняется следующий код(по памяти):
src_install
vecho что-то
vecho
post_src_install
вот последнюю функцию и надо переопределить из bashrc портажа.
да, по-умолчанию сия функция вообще не задана и не используется ни в классах ни в ебилдах.
но пользователь может захотеть странного и придать ей вполне реальный вид.
моя же задача была - в случае наличия уже определённой функции просто её дополнить (я решил дополнить с конца). т.е. чтобы и предварительно определённая функция выполнялась и моё дополнение тоже. при этом они не должны перекрывать друг друга.
каким образом здесь прикрутить сорс я хз, честно

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

заманчиво, но откровенно говоря меня ставит это в тупик еще больше...

Пока правила игры просты: делайте ebuild-ы как говорится: бензин ваш а идеи наши... (c)

Не обладаю большим познаниями в портаже, но заглядываю туда для вдохновения периодически и освежить познания в баше и just for fun. Полагаю, нужно копать в направлении расширения eclass или своего и поискать что-то типа плагиной системы. Другой вариант, еще более заумный: поискать ООП-движки на баше и реализовать некое подобие примитивной VM для баша. Ну и самый тупой путь: задействовать ООП-язык работающий в шелл, например не только пайтон, а js или классический perl, хотя не являюсь большим почитателем этого...

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

любой из вариантов, кроме дополнения сей функции, будет оверхедом.
сабж был нужен для live-localepurge.
тут описание (разве что не упомянуто про qt-локали)
вот тут код.
запиливать екласс для сего просто глупо, не находишь!?

megabaks ★★★★
() автор топика
Ответ на: комментарий от megabaks
if [[ "$(declare -F post_src_install)" ]];then
    eval "$(declare -f post_src_install | sed "s|\(.*\)}|\1live-localepurge;}|")"
else
    post_src_install(){ live-localepurge;}
fi

тут вроде все разумно сделано и по минимуму, лучше и не придумаешь - мини-ООП в кармане...

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

ну да - я тоже не нашёл более компактного варианта

недурно, в рамках идеологии лапши баша это true-way.

Уделить внимание тестам дабы не случилось типа задумал вызвать rm -rf ~/foo.bar ,а выполнилось rm -rf ~/* ... (были случаи в истории)

Вроде для подобного в системе должен быть некий sandbox.

Мне нравится так-же для этих целей режим, когда не лень: dry run.

Вообще, деструктивные операции требуют нервных клеток и это при 200% гарантии, что все правильно :)

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

ну...на фазе src_install песочница действует, потому шансов сломать систему просто нет.
в худшем случае получишь фейл установки пакета, не более

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

вот поэтому и используется именно эта конструкция - она заменяет ПОСЛЕДНЮЮ } на то, что я хочу

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

да, давай ещё подождём пока «нужный ЯП» пропихнут в портаж, оха, вместо того чтобы решить задачу здесь и сейчас.
ты мне слепногу напоминаешь - такой же бред несёшь.
но слепнога таки подрос и понял что облажался тогда.
а вот ты до сих пор в облаках витаешь.
и вообще ты меня сильно разочаровал - пшёл вон из моего треда!

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

да?

#!/bin/bash

function defined() { mkdir "}"; }
function new() { echo "new"; }

function test() {
  if [[ "$(declare -F defined)" ]];then
    eval "$(declare -f defined | sed "s|\(.*\)}|\1new;}|")"
  else
    defined(){ new;}
  fi
  defined
}

test
echo "и код полученной функции:"
declare -f defined
$ ./run.sh
new
и код полученной функции:
defined () 
{ 
    mkdir "new;}";
    new
}

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

это что за бред!?
расскажи мне задачу, котораят требует создания директории с именем }
короче, ты идиот и вообще не нужен

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

ну...на фазе src_install песочница действует, потому шансов сломать систему просто нет.

ну, ЕМНИП, кроме тех случаев когда она выключена
з.ы.
песочница, в смысле
не система :) хотя это тоже спасает :)

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

да не к этому я веду, в коде функции может быть скажем

echo "{вот тут некоторый комментарий, вполне законный, чего плохого?}"

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

вот ещё один синтетический пример, удаляет хомяка

#!/bin/bash

correct="tmp"
correctnew="хомяк_скажем"
mkdir "$correct"
mkdir "$correctnew"

function defined() {.
  eval rm -i -r $(echo '${correct}' | sed 's/;//')
}
function new() { echo "new!!"; }

function test() {
  if [[ "$(declare -F defined)" ]];then
    eval "$(declare -f defined | sed "s|\(.*\)}|\1new;}|")"
  else
    defined(){ new;}
  fi
  defined
}

test
echo "и код полученной функции:"
declare -f defined

короче, ты идиот и вообще не нужен

как пожелаешь

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

тебе пытаются объяснить, что внутри функции может быть }.

PS: по сабжу, раз ты упорото хочешь bash, то попробуй не функцию, а включаемый скрипт с функцией. Т.е. сначала пишешь функцию, а потом подключаешь её же командой source.

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

Т.е. сначала пишешь функцию, а потом подключаешь её же командой source.

ты вообще читаешь что я пишу?
и упороты как раз питонщики - речь идёт про bashrc портажа

megabaks ★★★★
() автор топика
Ответ на: комментарий от emulek
if [[ "$(declare -F post_src_install)" ]];then
	eval "$(declare -f post_src_install | sed "s|^}|live-localepurge;}|")"
else
	post_src_install(){ live-localepurge;}
fi

ещё проще

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

а, нет, есть одна совсем незначительная вещь. добавляемый код будет вызван, если первый символ функции, в которую добавляют код, является символом «}». пример:

#!/bin/bash -x

function }123() { echo "qwe"; }
function new() { echo "new!!"; }

function test() {
  echo '1'
  }123
  echo '1-end'
  if [[ "$(declare -F }123)" ]];then
    eval "$(declare -f }123 | sed "s|^}|new;}|")"
  else
    }123(){ new;}
  fi
  echo '2'
  }123
  echo '2-end'
}

test
declare -f }123
знаю, уже надоел

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

Да он имеет в виду, что для надёжности следовало бы сделать

sed '$ s|^}$|live-localepurge ; } |'
т.е. менять только в последней строке.

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

а declare -f и так выдаёт только одну } начинающейся с новой строки.
оно само отступы расставляет и выдаёт в гну-стиле.
сам проверь
ну и обрезать с $ не вижу смысла

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