Комментарии 95
На пайтоне тоже решаться должно достаточно легко, но может не в одну строчку — и самое главное, что там с зависимостями? Не придется ли ставить что-то из доп. модулей?
В линуксах я обычно делаю что-то такое:
gawk -F\" '
BEGINFILE {
of=FILENAME ".new";
changed=0
}
/yml_catalog date/ && $2>2015 {
"date +\"%F %R\" -d \"" $2 " 3 years\"" | getline $2;
changed=1
}
{
print>of
}
ENDFILE {
if(!changed)
system("unlink " of);
close(of)
}' *.xml
Плюсы: обработка файлов любого размера с минимум затрат памяти, можно уловить логику даже не знаю awk.
Минусы: xml не валидируется, xml должен быть отформатирован как в примере.
Скорость работы: 25мб/сек на моём некропк.
challenge accepted!
for i in *.xml; do DATE=$(xmlstarlet sel -t -m /yml_catalog -v @date $i); [ "$(date +%s -d"$DATE")" -gt "$(date +%s -d2015-01-01)" ] && xmlstarlet ed -u /yml_catalog/@date -v "$(date -d"$DATE 3 years" "+%F %H-%M")" $i > $i.new; done
Ну можно на
ls -1 | while read i; do
заменить, там по ходу задачи уже подстроить можно, главное не забывать про кавычки :)
кстати bash без проблем имена с пробелами переваривает:
$ touch 1.xml 2.xml '3 4.xml'
$ for i in *.xml; do echo "-$i-"; done
-1.xml-
-2.xml-
-3 4.xml-
Тоже самое для bash:
for i in $(egrep -l 'yml_catalog date="201[5-8]' *.xml); do let j=( $(grep date $i | awk -F\" '{print $2}' |awk -F"-" '{print $1}') + 3 ); sed -e "s/yml_catalog date=\"201[5-8]/yml_catalog date=\"${j}/g" $i > ${i}.new ; done
for f in *.xml; do sed -e 's/^<yml_catalog date="2018-/<yml_catalog date="2021-/' $f > $f.new; done
и забыл.
Основная особенность xonsh в том, что он «магически» угадывает что вы ввели — комманду питона или шелла, и это работает вполне хорошо.
То бишь это Punto Switcher… для боевого оборудования, в котором ТЕОРЕТИЧЕСКИ (!!!) (УТРИРОВАННО И НЕРЕАЛЬНО (!!!)) может сложиться ситуация, при которой моя пайтон-функция rm с аргументами -rf / может восприняться как вызов шелла? Punto Switcher, который может что-то убить? R u kiddin me? Нужно быть самоубийцей, чтобы использовать какую-то динамическую undefinedbehavior-неустойчивую систему без тестирования и дебага на реальных данных!
Годами пытаются закопать незакапываемый шелл… всё тщетно. Годами на хабрах постят знакомства с zsh и IPython в качестве замены якобы неудобного и неприятного стандарта, но IMHO удобнее баша ничего нет и не будет.
Думаю, тут неспроста слово «магически» взято в кавычке: ничегоОсновная особенность xonsh в том, что он «магически» угадывает что вы ввелиТо бишь это Punto Switcher…
xonsh
не угадывает, а различие между вызовом внешних команд и питоновским кодом однозначно детерминировано грамматикой скриптового языка.Может сложиться ситуация, при которой моя пайтон-функция rm с аргументами -rf / может восприняться как вызов шелла?Конкретно такая ситуация сложиться не может. Ваш пример с
rm -rf *; /foo
всё же несколько про другое.Бегло посмотрел документацию, сильно смутило в faq
«computing branch names and colors (i.e. if the branch is dirty or not), can be a pretty slow operation. This is bad news because xonsh can try to compute these each time it formats the $PROMPT»
То есть я правильно понимаю, что он не может в многопоточность?
Что подразумевается под «не может многопоточность»?
Думаю, что тут дело не в оболочке, а в том, что для проверки того, грязная ветка или нет, надо каждый раз запускать git, который будет оббегать дерево каталогов. Это в любом случае будет очень накладно.
А есть ещё одна проблема — он лучше всех оттестирован и неоф-документирован, и большинство проблем уже решено и решения замечательным образом лежат на стэковерфлоу и подобных ему. И нормальные люди считают это не проблемой, а отсутствием оной. KISS!
Что еще выморозило: некоторые команды между Linux/MacOS/Win имеют разное поведение. Например, xargs не имеет прекрасного ключа -r при запуске под Mac. А этот ключ, между прочим, позволяет не фильтровать лишний раз ввод. Я представляю себе сколько еще бойлерплейта придется написать, чтобы проверить наличие необходимых фич и сделать переносимый шелл-скрипт.
но там начинается свой головняк с виртуаленвами, пипом и прочими прелестями.
Попробуйте pipenv — он облегчает работу, но его правда тоже надо сначала установить
головняк с виртуаленвами, пипом и прочими
Честно говоря я много слышал про какие-то проблемы, но не очень их понимаю, есть pip для тех кто хочет чего-то стандартного и работающего, он умеет и в систему ставить, и в юзера и в виртуальные окружения (что в посте и продемонстрировано), какие проблемы тут у кого возникают?
Пожалуй самая главная проблема всех этих супер-пупер удобных, мощных, выразительных, и тэ дэ и тэ пэ в том, что эту безумную дыру ничем не заткнуть, буде понадобится. Нет песочницы, кто угодно может подключить себе что угодно и делать что угодно (это кстати и ко многим встраиваемым языкам относится, единственный, где об этом подумали — Lua). Удобство не должно мешать контролю. А то как-то читал статью, где пытались ограничить встраиваемые возможности питона — сколько там дыр, чтоб вылезти из песочницы и импортнуть то, чего импортировать не положено. Прям напоминает бородатую историю со входом в винду через справку
Неудобство sh убивается его изучением.
Неудобство от милейшей поделки испытаете в режиме восстановления не зная shell и не имея своей поделки под рукой.
Неудобство vi превращается в удобство vi после его изучения. А
Shell монолитен. Он либо работает, либо не работает. Если не работает шелл, то надо посмотреть в другом режиме или другим экземпляром.
Мне к сожалению часто попадают системы в которых нет необходимых библиотек для функционирования той или иной прикладной программы. К прикладным я отношу и python, как язык программирования с огромным набором модулей.
«The idea for xonsh first struck while I was reviewing the Bash chapter (written by my co-author Katy Huff) of Effective Computation in Physics. In the book, we spend a bunch of time describing important, but complex ideas, such as piping. However, we don’t even touch on more ‘basic’ aspects of the Bash language, such as if-statements or loops. Even though I have been using Bash for well over a decade, I am not even sure I know how to add two numbers together in it or consistently create an array. This is normal.»
Кажется, что это классическое «я не осилил, поэтому придумал свое». Сколько уже фреймворков, языков и библиотек было создано по этой причине.
Если мы коммитимся на использование python окружения — нам не нужны пайплайнинги, т.к. пайтон на батарейках и умеет почти все из коробки (листинг директорий, поиск текстов и т.п.).
Если же пытаться использовать сторонние утилиты через вызов subprocess.check_call, то можно задействовать пайплайнинг, но накладные расходы все равно выше, чем при попытке утрамбовать такую конструкцию в однострочник bash. Не говоря уже о зависимостях от внешних бинарей. Либо, если руками собирать pipe, то там столько бойлерплейта будет, что проще вздернуться.
import os; os.listdir('.')
даже если import бужет сделан заранее.Не говоря уже о более продвинутых тулзах типа tree если продолжать пример со списокм файлов.
И тут мне вспоминается этот пост: adamdrake.com/command-line-tools-can-be-235x-faster-than-your-hadoop-cluster.html
Как говорится, «лучше старый проверенный друг, чем два новых».
И «старый конь борозды не испортит» (в плане того, что все эти bash/unix tools отлажены десятилетиями).
А можно что-то нормальное?
Например, zsh/fish — еще куда ни шло.
/молодцы минусовать, если мнение не нравится. Видимо есть только два мнения -мое и неверное? толерантнее надо быть/
КМК основная задача шелла типа bash — удобно запускать разные другие программы, с этим у него все нормально. А для программирования есть много других языков.
Возможно, что нужно попытаться поменять мировоззрение и пытаться не засунуть вызовы этих внешних утилит в python (что действительно неудобно), а пользоваться уже существующими примитивами в python. Т.е. примеры:
— хотим получить список файлов и сделать операцию над ними — пользуемся модулем os (listdir и поехало)
— хотим скачать страницу из интернета -пользуем requests или/и urllib
Но фишка в том, что в простых случаях проще дернуть curl, чем писать простыни шаблонного кода на python.
Короче — такое себе.
А вообще, конечно, вспоминаю себя, когда я пытался в консоли DOS на Spectrum'е ввести 2+2 и мне оболочка говорила, что команда не найдена. Расстройство было жуткое — какие же компьютеры глупые )))) а всего лишь нужно было немного изучить командный язык.
А условный скрипт запуска сервиса, проверки наличии файла, переконвертации из формата в формат, скачивания сайта рекурсивно и пр. — проще наговнякать на баше.
Нужно подбивать подходящий тулинг.
А самое милое дело — хорошо написанные скрипты на python практически ничем не отличаются от консольных утилит и точно так же интегрируются с другими unix tools (pipelining, коды возврата и пр. пр.). Но как бы есть определенная разница с однострочниками на xonsh
Я использую уже около года fish. Правда сам не могу объяснить почему. Вроде и удобная оболочка, но по некоторым вещам из bash/zsh до сих пор скучаю.
По теме: всегда не понимал bash/zsh. Мне кажется, что и язык и реализация этих оболочек какие-то архаичные и эклектичные. Скрипты на bash/zsh кажутся слепленными из палок и изоленты — чуть тронь в любом месте, и все развалится (часто так и происходит). Я знаю, что на shell писались (возможно, пишутся до сих пор) проекты размером в сотни тысяч строк, но это сущий кошмар в поддержке.
Странно, что до сих пор никто не сделал нормальный shell с нормальным читаемым языком внутри… Fish, мне кажется, ближе всех подошел, но и в нем остаются недостатки, кроме того, он не очень популярен.
Синтаксис шелла ужасен с точки зрения малознакомого с синтаксисом шелла. Как и любой язык он обладает большими и малыми недостатками.
Аналогично синтаксис Питона ужасен с точки зрения человека, малознакомого с Питоном. Наверняка Питон тоже обладает большими и малыми недостатками. Чего стоит его зависимость алгоритма от количества пробелов.
Более важно, что шелл есть везде, Питон — нет.
Python — он уже есть как минимум двух несовестимых версий. И требует рабочего окружения. А оно запросто может быть или сломано (например, я сталкивался с таким — stackoverflow.com/questions/47197083/python-pip-error-just-after-fresh-install ), или вам нужны модули какой-то определенной версии, которые или не установлены, или НЕ МОГУТ быть установлены в рамках одного, системного окружения.
Аналогично синтаксис Питона ужасен с точки зрения человека, малознакомого с Питоном.
Как раз на мой взгляд синтаксис питона для незнакомых с ним наиболее понятен
Уж лучше питон чем перл
Заметил только что xonsh иногда призадумывается секунд на 2-3 после долгого простоя — никто не сталкивался с таким явлением, как оно лечится?
sudo apt-get install direnv
or
sudo snap install direnv
pip3 install --user xonsh-direnv
# to .xonshrc
xontrib load direnv
# for first load
direnv allow
пока не всё гладко, но в минимальном виде работает.
@events.vox_on_activate
def post_activate(name, *args, **kwargs):
print('Generate TAGS file here')
xonsh — python как замена shell