Pull to refresh

Comments 72

UFO just landed and posted this here

Ну про чужой опыт крайне интересно почитать.

Тем не менее, хотелось бы объективности. Например, вместо «Грамотное владение shell — один из самых важных навыков, которыми вы как программист должны обладать» начать статью с «shell — мощный инструмент, владение которым, может быть, вам поможет повысить свою продуктивность». Я, например, первую свою коммерческую программу написал в 1999-м году, с тех пор писал под всё, что только можно придумать, от IBM AS/400 до микроконтроллеров. Но блин, у меня ни разу в жизни не было задач, которые можно было быстрее решить, написав одноразовый скрипт на шелле, нежели воспользоваться готовыми тулзами IDE плюс, где надо, руками что-то подправить через файловый менеджер.
Кажется, что это Вас задело и Вы пытаетесь перевести с больной головы на здоровую.
По крайней мере, для меня это выглядит очень странно, потому что, если Вы не понимаете зачем Вам, как программисту, гибкий инструмент автоматизации, то я уж и не знаю зачем вообще заниматься программированием.

У меня, как у программиста, уже есть гибкий инструмент автоматизации — тот язык на котором я пишу.

Не знаю на чём Вы пишите, но я применяю разные инструменты для разных задач

И все эти задачи требуют использования shell'a? И если нет, то вам так трудно представить себе что у других людей все задачи не требуют использования shell'a или как минимум спокойно решаются без его использования?

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

Нет не сложно. Поэтому я и не утверждаю что "для людей всех профессий компьютер так же необходим, как умение читать" или ещё что-то в этом роде.


Если вам для работы необходим shell, то это ваше дело и ничего плохого в этом нет. Но это не значит что он необходим абсолютно всем айтишникам без исключения.

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

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


Я сомневаюсь например что использование shell сделает особо эффективнее человека, который пишет десктоп-приложения на том же WPF'e.

Хм. Человек, который зарегистрировался, только чтобы ответить на мой комментарий, говорит, что меня это задело :)
если Вы не понимаете зачем Вам, как программисту, гибкий инструмент автоматизации,

Объясняю: программируя, я решаю какие-то конкретные задачи. Для каждой задачи есть какие-то свои инструменты. Некоторые оптимальные, некоторые не очень. Некоторые универсальные, некоторые специализированные. И у меня есть удобные мне, и я бы сказал, оптимальные инструменты для всех моих задач.
И, соответственно, мне не нужен гибкий инструмент автоматизации, если 99% этих задач и так давно автоматизированы в IDE, а оставшийся 1% встречается в практике раз в несколько лет, и автоматизация их скриптами шелла никогда в жизни не окупит время, потраченное на чтение манов и потом на собственно написание скриптов. Тем более, что я всё это могу сделать, просто набросав утилитку непосредственно на языке программирования.
И я не ошибусь, если скажу, что у подавляющего большинства программистов ситуация такая же, как и у меня: нет там никаких задач, которые нужно дополнительно автоматизировать за пределами IDE. А просто так изучать инструмент, потому что он прикольный? Ну, у всех разные хобби бывают. Я предпочитаю это время потратить в своей мастерской, например. Там я сделаю что-то куда более интересное для меня, чем изучить командный язык очередной софтины, которой мне не придётся пользоваться.

Интересно Вы интерпретируете данные, если дата регистрации указана - 16 июня

если 99% этих задач и так давно автоматизированы в IDE

Основная задача таких вещей как shell или powershell или bat — это автоматизация задач на енвайрнментах, а не в IDE. И в небольших проектах, где не нужен свой сисдамин и команда, которая поддерживает инфраструктуру, это падает на разработчика. Или вы прямо из IDE деплоите в продакшен?
Или вы прямо из IDE деплоите в продакшен?

Вы так говорите, будто бы в этом что-то плохое :) Если проект настолько небольшой, что там нет ни девопса, ни даже админа, а деплоем занимается непосредственно разработчик, то почему бы не из IDE? Прогнал тесты, переключил в IDE профиль деплоя с теста на прод — и отправил.
И опять же таки, для того, чтобы запустить сборку и потом отправить файлы, знать shell не нужно. Это можно успешно сделать, даже увидев его первый раз в жизни, и не читая манов.

Ну как бы для того чтобы деплоить тоже есть свои IDE и UI. И это совсем не обязательно делать через shell. Тот же Visual Stuido вполне себе имеет достаточно функциональности чтобы "простой разработчик" мог более менее комфортно работать с майкрософтофским TFS и не заморачиваться shell'ом. И вроде бы обещают добавить такую же функциональность и для гита.


То есть для админа/девопса этого однозначно мало. Если ты просто коммитишь, делаешь ревью и деплоишь, то хватает за глаза и за уши.

А как вы парсите json в конвейере?

Как решаете такую проблему: нужно найти текст в выведенном тексте консоли, или в редактор командной строки нужно вставить слово из выведенного в консоли текста?

На каких языках пишете в Vim?

UFO just landed and posted this here
IdeaVIM… он ужасен, особенно при работе с русским языком) впрочем про вим можно было особо не читать узнав что нет модификаций .vimrc
В саблайме вим мод хорошо сделан, повторение команд воспроизведет действия саблайма, чего не будет в идее, да и при работе с несколькими курсорами все отработает как ожидаешь. Ну и да, если добавить маппинг русских букв, то они будут работать так как от них ожидаешь. А Идее мапинг можно добавить но ChangeAllWord на русской раскладке не сработает.

Jq тоже такая себе утилита, ее нужно учить. Где-то была утилитка позволяющая парсить json так как будто вы в js. Вспомнить бы ее название… Иначе если не изучать появляются кадавры
curl someapi | jq '.tickets | map(select(.assigned_displayname=="MyNameOnApi"))' | jq '.[] | "\(.id) \(.title) \t \(.description)\n"' | sed #some after jq prettifying 
json так как будто вы в js

Так это надо js учить?
полезность jq в том, что она есть в любом дистрибутиве, и не так часто в bash возникает необходимость парсить json, ведь для более сложных вещей всегда рядом есть python

Для парсинга json есть jq. На Vim можно писать на многих языках программирования, поддерживается подсветка синтаксиса и автокомлит путем до настройки его

найти текст в выведенном тексте консоли

Если текст уже выведен - средствами терминала. А так, вывести в лог,и как обычно, grep.

Которые есть. Терминалов много, уверен, в некоторых из них реализован поиск.

Ну я например пользуюсь konsole, там поиск есть. Пригождается

А как вы парсите json в конвейере?

смотря что парсить.
очень простые вещи можно вообще тупо грепнуть регуляркой.
Если надо распарсить правильно — стандартная утилита jq

нужно найти текст в выведенном тексте консоли

Если вывод консоли больше экрана, то выполняешь еще раз конвеер, добавляя grep на то, что нужно искать. Это же самое простое.

или в редактор командной строки нужно вставить слово из выведенного в консоли текста?

Обычно я работаю под виндой, и коннекчусь к удаленным линукс серверам через ssh клиент, где отлично работает выделение мышкой, следовательно все очень просто.
Ну и если командная строка слишком сложная, ESC v
(предварительно set -o vi и VISUAL=vi в .profile)

Текст в консольном выводе удобно искать в том же vim, который с версии 8.1 любезно предоставляет :terminal для запуска консоли.

На скриншоте кстати i3wm, очень гибкий и приятный тайловый оконный менеджер, рекомендую

Поскольку автор оригинальной статьи Drew DeVault, то на скриншоте, скорее всего, sway, автором которго он тоже является.

Это всё очень хорошо и здорово работает в маленьких проектах. А когда любой поиск grep начинает выдавать over 9000 строк результата, то становится ясно, что без инструментов, понимающих синтаксис языка - никуда. И ни grep, ни vim этим похвастаться не могут

А я вот использую питон вместо sh. Примерно тоже самое, но еще есть типизация и много прикольных библиотек, которые отсутстсвуют в консольном интерфейсе.

А чтобы запустить процесс в фоне, вы тоже используете питон?

А в чем проблема? Половина операционки на питоне с перлом крутится.

Например в шелле запускаешь что-то в фоне и шелл завершается. А в питоне родительский процесс остается висеть?

Если исполнение программы на Питоне доберётся до конца — с чего бы процессу остаться висеть?

А что будет с stdout/stdin дочернего процесса?

А что должно произойти с stdout/stdin дочернего процесса?

если заранее не перенаправлен, то при sighup родительского процесса возникает проблема.

У bash своя уличная магия, у питона своя ;) На С тоже нужно использовать магию, чтобы зомби не образовались. Вряд ли кто-то использует питон как интерактивную оболочку. А внутри программы можно просто импортировать модуль, где эта магия уже реализована.

Ну так можно перенаправить же. Всё ещё не понимаю где тут проблема может быть.

В bash можно запустить процесс в фоне через & и ни о чем не беспокоиться. В других языках нужно сделать несколько приседаний.

Не уверен что банальное subprocess.popen([параметры], stdin=subprocess.DEVNULL, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) является особо сложными приседаниями.

Но это же не является проблемой? Это просто особенность, притом ожидаемая.

а как в питон сделать проверку, что субпроцесс уже был запущен ранее?

Объект процесса можно сохранить в переменную и проверять её. Это если из логики программы почему-то не следует был ли субпроцесс запущен ранее безо всяких проверок.

Так скрипт запустился, запустил дочерний процесс и умер. Это переменную-объект нужно куда-то сохранять и потом загружать?

А как вы эту проблему на баше решаете? Что мешает поступить так же и на питоне?

тем, что на баше это решается или хранением PID подпроцесса в файле, или вызовом ряда команд типа ps/grep. Но для питона, вызов внешних команд - некрасивое решение, ибо смысл использовать питон, чтобы вызывать другие консольные команды?
Я не говорю, что на питоне это нельзя сделать, просто задача обеспечить запуск только одного экземпляра в одно время - это одна из самых частых, и хотелось бы увидеть как вы решаете эту проблему.

Я никак эту задачу не решаю, потому что не пишу на Питоне. Но если бы писал — использовал бы блокировку через открытый файл.

а как в питон сделать проверку, что субпроцесс уже был запущен ранее?

Как и в любом другом языке. Глобальным флажком внутри программы, например.

Если в ~/.vimrc добавить такую строку, то второго терминала для запуска не потребуется.
В файле директории которой происходит правка лежит скрипт f2.sh компиляции и запуска.
Запускается как может быть понятно из названия по клавише f2

map <F2> <Esc>:w<CR>:!bash f2.sh<CR>
vnoremap <F2> :w<CR>:!bash f2.sh<CR>


Для правки скрипта автозапуска есть команда сразу в vim :sp f2.sh сохраняем результаты :wq
Уж больно товарищ автор категоричен (ну или такой перевод). Все ему должны — должны знать, любить и использовать Unix, должны юзать vim, должны… А что если я скажу, что у меня вполне получается выполнять свою работу не притрагиваясь ни к виму, ни к шеллу, ни к грепу, ни к awk и так далее? Должен видите ли… Да не пошел бы он.

Сидел на линуксе с 2005 года, генту, потом арч, вот это всё. Neovim с килограммом плагинов (даже сейчас стоит neovide), emacs <s> с педалями </s>. Сейчас сижу под виндой в идее, делаю всё, что и раньше делал. Да, пользуюсь иногда всем линуксовым тулсетом, на велосипеде ездить не разучишься. Но и без него можно найти, как выполнить задачу, главное ее правильно поставить.

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

Программист вообще то далеко не всегда может выбирать себе стек технологий. Наша контора, например, делает игры под виндовз. Есть корпоративные стандарты, есть требования от безопасников, есть набор проприентарного софта. Я бы очень удивил своих коллег из ИТ отдела, если бы заявил, что мне для работы нужна машина с линуксом на борту. Зачем мне или моим коллегам юниксовый шелл? Не представляю себе задачи в рамках своих служебных обязанностей, которая может стоять перед программистом, которую можно было бы решить баш-скриптом. Или взять мой предыдущий опыт. Не думаю, что кому-то придет в голову использьвать vim вместо студии для проекта Asp.net MVC + Win Forms.
Я вовсе не утверждаю, что знать шелл бесполезно или вредно, бесполезных знаний не бывает. Но дико бесят такие вот эксперты, как автор оригинального текста. Как правило, это еще присыпают сверху сказками про какую-то мифическую «производительность», как будто программист, это машинист клавиатуры, и его эффективность определяется тем, сколько текста он в день набирает. А в качестве примеров дикого перформанса дают то, что нам в статье было явлено:
Воспроизведение 50 самых новых видео в папке при помощи mpv… Я постоянно использую эту команду.

офигеть какой полезный скрипт, как я жил то без него!
В общем, у меня такие статьи вызывают негодование. Это не спорю с высказыванием выше, просто кипит

Имхо, сама идея того, что приложения обмениваются данными в виде голого неструктурированного текста, устарела. Чтобы заставить одно приложение принять на вход то, что другое дает на выходе, периодически приходится устраивать приседания с регулярками и опциями, уникальным образом настраивающими вывод для данного приложения.


Гораздо удобнее было бы обмениваться объектами, как это делает PowerShell или NuShell.

Наверняка где-то в мире существует человек, который быстро-быстро замыкает и размыкает соответствующие контакты на разъёме PS/2 и доказывает, что так удобнее набирать текст, чем печатать на клавиатуре
Многие наверняка слышали о «linux subsystem for windows», так вот она меня не раз очень выручала:
— при выполнении массовых операций с файлами, например, переместить файлы из пачки папок в одну папку (на уровень выше) или переименовать по определенному шаблону;
— при поиске в куче файлов, разбросанным по папкам, определенного текста (значительно быстрее, чем это сделал бы проводник);
— при копировании файлов с удаленной машины и синхронизации + автоматизации ручных бекапов и т.д.
Так что, продвинутым пользователям Виндовс знание UNIX тоже может пригодиться.

Не проще ли powershell запустить чем WSL для таких задач ставить?

Для меня — нет, в powershell те же операции заняли бы намного больше времени, т.к. powershell я не очень хорошо знаю и видел примеры «однострочников», там писанины было бы в разы больше. Ну и плюс, ЕМНИП, нет удобного дополнения команд и путей табуляцией. А еще нет того же grep, find, stat… или есть?
Вот, например, как это изобразить на powershell?

~ ~> find `pwd` -type f -name \*.txt -exec grep "^ABI" {} \; -print
ABIRVALG
/root/qq.txt


В выдаче должна быть строка с совпадением и полный путь к файлу.
Ну и плюс, ЕМНИП, нет удобного дополнения команд и путей табуляцией.

Вообще-то есть.


А еще нет того же grep, find, stat… или есть?

Всё есть: grep называется Select-String, find называется Get-ChildItem, stat доступен как свойства файла.


Вот, например, как это изобразить на powershell?

Проще всего вот так:


Select-String -Path *.txt -Pattern ^ABI | Select-Object Path, Line

Но если вам хочется увидеть именно как аналог find работает — то вот:


Get-ChildItem *.txt | %{
    $file = $_
    Get-Content $file -Encoding UTF8 | Select-String ^ABI | %{
        New-Object psobject -Property @{
            Path = $file.FullName
            Line = $_
        }
    }
}
Теперь вы понимаете, почему я не использовал костыль powershell?

P.S.
Второй пример, кстати, работает абсолютно так же, как эта строчка:
Select-String -Path *.txt -Pattern ^ABI | Select-Object Line, Path

Так какой в нем смысл? К чему он был?

P.P.S.
find называется Get-ChildItem

Меня всегда удивляли люди, умеющие такое придумывать.

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


Второй пример, кстати, работает абсолютно так же, как эта строчка:

Разумеется, он и должен работать так же. Точно так же как и ваш однострочник, если я не ошибаюсь, можно заменить на grep -r "^ABI" .


Но вы зачем-то декомпозировали задачу, отделив перебор файлов от поиска по файлу — и я подумал что от примера на powershell вы ожидаете того же.


Меня всегда удивляли люди, умеющие такое придумывать.

Ничего удивительного в этом названии нет, оно одно из самых понятных в powershell. Файлы в powershell являются частным случаем абстракции под названием "item", команда get-childitem получает, собственно, дочерние айтемы.

Судя по этому примеру, в powershell все ключевые слова длинные. Однострочник на bash получается короче.

Однострочник на баше получается не только короче, но еще и ключевые слова могут заменяться любыми подходящими утилитами и другими скриптами, написанными на коленке.
В повершелл все работает через объекты, и надо работать не с текстом, а с объектами, что не позволяет по-быстрому написать алгоритм.

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

При наличии автодополнения меряться длиной команд как-то глупо.

Возможно, но вот это не выглядит как однострочник. Мне вот кажется, что это многострочник, вдобавок с кучей вложений.
Заголовок спойлера
Get-ChildItem *.txt | %{
$file = $_
Get-Content $file -Encoding UTF8 | Select-String ^ABI | %{
New-Object psobject -Property @{
Path = $file.FullName
Line = $_
}
}
}

А вы на другой пример посмотрите, чем он не однострочник?


Да и многострочный пример разбит по строкам исключительно для удобства чтения, при желании всё это в одну строку без проблем умещается.

да в общем-то с проблемами — сильно снижается скорость чтения.

Ну, однострочники пишут не для того чтобы их читать.

Sign up to leave a comment.