Тема "Windows vs Linux" является частой причиной холиваров. Спорить бессмысленно, так как для каждой задачи требуется свой инструмент. Позвольте заинтересовать вас чудесным миром Linux и теми бонусами, которые вы можете получить от использования терминала в повседневной деятельности. Всё разберём на примерах реального использования.
Легко поставить софт
При получении в мессенджере оригиналов фотографий из iPhone мы получаем непонятный .HEIC-файл, а хочется привычных JPG/PNG. Для Linux с помощью менеджера пакетов можно поставить программу-конвертер и применить её
sudo apt update && sudo apt install libheif-examples
heif-convert 1.HEIC 1.jpg
Причём в терминале можно активно пользоваться кнопкой tab, чтобы не набирать команду целиком. Это выглядит примерно так: пишем "heif-c", нажимаем tab и получаем полную команду. Работает с командами, именами файлов и даже с настроенными подкомандами: sudo apt i<tab> дополнят команду до install.
Легко автоматизировать процессы
Мы справились с одной фотографией. А как поступить с десятком фотографий? Как быть, когда фотографий сотни? Когда у вас готово решение для конкретного случая, то в терминале его легко можно автоматизировать. Сила автоматизации в том, что можно легко масштабировать решение, например, для всех файлов с заданным расширением
for file in *.HEIC; do heif-convert "$file" "${file%.*}.jpg"; done
Да, тут немало нюансов. Ладно, синтаксис do-done и нюансы расстановки точек с запятой можно принять как данность. Применение перебора по маске уже достаточно непростая тема. Обязательные двойные кавычки вокруг переменных вызывают вопросы. Самое неприятное, что всё будет работать и без кавычек, если в названиях нет пробелов. А с пробелами нужны кавычки, но в примере из интернета об этом не скажут. Нюансы удаления расширения у файлов с использованием %.* вообще могут свести с ума, документация на этот счёт огромная и довольно сложная.
Прелесть этого подхода в том, что вам не нужен отдельный софт или отдельная кнопка для запуска на большом наборе входных данных. У вас есть программа для изменения формата, размера или чего угодно? Вы сможете применить эту программу для всех нужных файлов в терминале. Масштабирование от одного файла до сотни происходит абсолютно одинаково для любой программы.
Неудобством является высокий порог входа относительно программы с кнопкой "сделать хорошо", но и подход оказывается более универсальным – изученный однажды способ автоматизации навсегда остаётся с вами.
Легко вспомнить
Нужное решение можно не только нагуглить, но и найти в ранее выполненных командах, если вы такую задачу уже решали. В терминале доступны стрелочки вверх и вниз, позволяющие выполнить предыдущие команды. Это существенно ускоряет работу в терминале, позволяя переиспользовать команды. Актуальность этого увеличивается с ростом длины команды.
И совсем крутой является возможность искать по истории команд. Нажатием сочетания ctrl+R мы переводим терминал в режим обратного поиска по заданной подстроке. Я ввожу ctrl-R, набираю HEIC и получаю нужную команду из истории.
(reverse-i-search)`HEIC':
for file in *.HEIC; do heif-convert "$file" "${file%.*}.jpg"; done
Если нужной команды нет, я могу дописать подстроку или нажать ctrl+R повторно для демонстрации предыдущего подходящего значения.
Легко настроить под себя
По умолчанию сохраняется только тысяча последних команд, и эта тысяча достаточно быстро заканчивается. Посмотрел у себя – дефолтную тысячу команд я использовал за 3 недели. Чтобы сделать историю команд почти бесконечной, надо залезть в конфиг. В файле ~/.bashrc для переменных HISTSIZE и HISTFILESIZE поставьте значение в миллион или вроде того.
# в вашем ~/.bashrc
HISTSIZE=1000000
HISTFILESIZE=1000000
Почти у каждой программы есть текстовый конфигурационный файл, с помощью которого можно поменять её поведение. И у текстовой конфигурации много плюсов – её можно посмотреть глазами, её можно сохранить в git и отслеживать изменения, её можно легко нагуглить в интернете. Графический интерфейс программы может меняться, объяснения "нажми сюда, потом туда" неудобны и быстро устаревают.
При этом можно пойти дальше, добавив алиасы для ещё большей скорости работы в терминале. В дополнение к стрелочкам, ctrl+R и tab у нас есть автозамены, они же alias. Писать git status слишком долго, проще написать gs. Вот фрагмент моих алиасов для работы с git
alias gs='git status'
alias gd='git diff'
alias gitc='git commit -m'
alias gl="git log --graph --pretty=format:'%C(yellow)%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit --date=short "
У git log флаги обеспечивают такое визуальное представление:
Из секции "прочее" я использую такие интересности
alias ll='ls -alF'
alias la='ls -A'
alias ..="cd .."
alias ...="cd ../.."
alias ....="cd ../../.."
alias h="history | tail -30"
# хрен запомнишь
alias TAR='tar -zcvf' # dest source
alias UNTAR='tar -zxvf' # source
С одной стороны, такая индивидуальная настройка сильно привязывает вас к рабочему месту, за ноутом коллеги вы начинаете сильно спотыкаться. С другой стороны конфиг с alias можно хранить всегда под рукой на гитлабе. А какие alias любите вы?
Статистика среди разработчиков
Посмотрим, что происходит в индустрии. Stackoverflow проводит ежегодные опросы разработчиков для отслеживания текущих трендов в программировании. В 2022 году в опросе участвовало 70 тысяч разработчиков. Посмотрим отдельные вопросы и ответы на них.
В какой операционной системе вы в основном работаете? (What is the primary operating system in which you work?)
Как видно из результатов, Linux среди разработчиков занимает очень весомые позиции.
Как вы пользуетесь Git? В вопросе системы контроля версий в общем виде, но 97% используют git. (How do you interact with your version control system? Select all that apply.)
Интересно, что 84% разработчиков используют интерфейс командной строки. Не удивительно, так как при поиске ответа на сложный вопрос вы попадёте на Stackoverflow, где вам предложат именно консольную команду. Консоль является универсальным языком взаимодействия разработчиков.
Терминал важен для разработчиков
Попробуем запустить веб-сервер на питоне. Штатный результат выглядит так:
python3 -m http.server
Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...
Однако вы можете получить вот такой неприятный вывод
python3 -m http.server
Traceback (most recent call last)
...
OSError: [Errno 98] Address already in use
Эта ошибка означает, что порт по умолчанию 8000 занят другим приложением. Для починки ситуации можно найти и завершить процесс, который занимает этот порт. Но что это за приложение и где его найти?
В терминале с помощью netstat выведем процессы и занимаемые ими порты, а в выводе с помощью grep найдём строку 8000, отвечающую за нужным нам порт
sudo netstat -nltp | grep 8000
tcp 0 0 0.0.0.0:8000 0.0.0.0:* LISTEN 16240/python3.10
Вертикальная черта обозначает конвейер, связывающий вывод левой команды с вводом правой. Теперь можно завершить процесс с идентификатором 16240 с помощью kill
kill 16240
В примере выше, кстати, очень хорошо видна философия Unix – программа должна делать что-то одно, и делать это хорошо. Задача операционной системы – предоставить гибкий клей для объединения различных программ. Мощь кроется в интеграции между программами и умении декомпозировать задачу на кусочки. Сложная задача рассматривается как комплекс более простых, а терминал становится единым языком общения для разработчиков.
Причём можно докрутить конвейер до получения результата в одну строку. Выведем все процессы, найдём порт 8000, выделим 7 столбец, где указан номер процесса, и в нём возьмём первую часть от слеша. Результат подадим в kill в виде аргумента, для этого воспользуемся xargs
netstat -nltp | grep 8000 | awk '{print $7}' | awk -F/ '{print $1}' | xargs kill
Такие однострочники неустойчивы к ошибкам в процессе, если требуется надёжное решение – надо аккуратно писать скрипт. Записал на этот счёт 20-минутное видео Идеальный скрипт на bash, где последовательно показываю процесс создания красивого скрипта с документацией и учётом bash-идиом. В процессе показываю консольный git и интересные фишки терминала. Когда вы овладеете CLI, терминал станет для вас удобной и привычной средой обитания. Для возникшей задачи ваши пальчики сами будут выдавать однострочник, решающий проблему. И выходить из терминала вам больше не захочется.
Вместо netstat можно использовать ss, lsof или fuser, путей решения проблемы всегда более одного. С опытом пополняется пул известных разработчику команд, что позволяет сразу решать проблему или быстро воспринимать нагугленное решение.
Изучается один раз
Из предыдущего пункта вытекает следующий. Графический интерфейс (GUI) учится под каждую программу. Интерфейс командной строки (CLI) учится один раз, дальше только необходимо пополнять пул известных команд за счёт поиска. Причём отдельный инструмент может внести огромный вклад – например, понимание регулярных выражений сразу делает доступным sed, awk и другие инструменты, которые завязаны на регулярках.
Docker для DevOps
Уже достаточно давно технология контейнерной виртуализации Docker стала популярным способом деплоя приложений, который применяется разработчиками. Даже небольшое современное приложение требует фронтенд, бекенд, базу данных, nginx для балансировки и другой магии, автообновление сертификатов. Это 3+ сервиса, объединённые в одно целое с помощью docker compose. GUI для docker существует, но большая часть гайдов и примеров приводятся для терминала. Чем эффективнее вы умеете работать в терминале, тем эффективнее вы сможете работать с докером – решать возникающие проблемы, модифицировать готовое решение под ваши реалии и так далее.
Можно для команды на сервере поднять кучу инструментов – gitlab для разработки, mattermost для коммуникации, систему мониторинга, локальное хранилище и прочее. Для DevOps всё ещё сильнее завязано на bash. CI/CD-пайплайны, "инфраструктура как код" и прочее требуют Linux вообще и bash в частности.
Терминал часто нужен для настройки серверов и развёртывания инфраструктуры в облаке. И тут SSH вообще вне конкуренции для удалённого управления серверами. С помощью SSH вы можете работать с удалённым сервером так же, как с локальным, писать скрипты для автоматизации и многое другое.
Ускоряем работу на примере
Завершить хотелось бы решением прикладной задачу: попробуем найти уникальные строки в большом файле. Начинающие разработчики для решения подобной задачи склонны либо садиться писать небольшую программу, либо искать готовую программу на просторах интернета. Но в Linux всё уже под рукой, надо найти и настроить под свой случай.
В качестве поля для экспериментов возьмём утечку rockyou, в которой 139 мегабайт (14 млн) утекших в 2009 году паролей. Замерять время будем с помощью time, смотрим на время real. Решение в лоб состоит в сортировке с флагом --unique или -u и последующем подсчёте строк с помощью команды wc
time cat rockyou.txt | sort --unique | wc -l # 47s у меня
Решение уже есть, но с ростом размера файла неприятно растёт и время обработки. Если мы хотим разобрать больше строк, либо если внутренний критик хочет посмотреть на потенциал ускорения при решении такой задачи, то приглашаем вас в пучины технологической магии по его ускорению.
Неожиданно, но замена одной команды sort -u на две отдельные команды sort и uniq даёт выигрыш в скорости. Подозреваю, что дело в возможности распараллелить их работу.
time cat rockyou.txt | sort | uniq | wc -l # 43s
Дальше умудрённый опытом пользователь терминала обратит внимание, что команда cat в начале не нужна. Команда sort сама умеет работать с файлом. Убираем лишний cat и получаем ещё бонус в скорости.
time sort rockyou.txt | uniq | wc -l # 33s
А следующее изменение максимально нетрививальное. Команда sort сортирует в текущей кодировке пользователя, сейчас обычно это utf-8. А можно заставить sort работать в однобайтовой кодировке, что может сэкономить время, и, как выясняется, очень существенное.
time LC_ALL=C sort rockyou.txt | uniq | wc -l # 5s
В результате наших действий мы в десять раз сократили время получения уникальных строк в файле. Напоминает про часто поднимаемую тему 10x-разработчиков про десятикратную разницу между крутыми и посредственными разработчиками.
Заключение
На разных примерах мы продемонстрировали, как быстро решать самые разнообразные задачи, имея в своем арсенале навык работы с командной строкой. Некоторые заголовки и тезисы провокационны и с ними можно поспорить. Но можем сказать абсолютно точно – освоенный навык работы с терминалом становится базовым инструментом для решения многих повседневных задач. Терминал позволит материализовать ваши мысли: открыл терминал, похимичил и задача решена.
В канале DevFM мы делимся опытом разработки на python, проектирования систем, работой с базами данных и полезными тулзами. Присоединяйтесь!
Комментарии (291)
Vitaly83vvp
09.06.2023 14:23-2Можно ещё отимизировать:
"sort | uniq" => "sort -u"
DevFM Автор
09.06.2023 14:23+5sort -u эквивалентен sort --unique. И занятно, что он медленнее, чем sort | uniq, об этом написано
laatoo
09.06.2023 14:23+28я говорю на двух, а код пишу на 2 языках + всякие "побочные" синтаксисы.
каждый раз когда нужно что то автоматизировать с помощью bash у меня выступает холодный пот и внутри случается маленькая истерика. этот синтаксис всрат.
когда нужно что то изменить под себя в этом всратом линуксовом зоопарке,и оно не получается с первого раза – у меня выпадают волосы и случается микроинсульт.
линукс и вся экосистема вокруг – всратое.
DevFM Автор
09.06.2023 14:23+2Местами bash ужасен, да. К сожалению, адекватных общепринятых альтернатив нет :(
sepetov
09.06.2023 14:23+4В моих случаях на работе удаётся просто писать скрипты на php или python, добавив в начало что-то типа #!/usr/bin/php, ну а потом chmod +x.
Для каких-то случаев это не сработает, видимо?
laatoo
09.06.2023 14:23+2как открыть последный загруженный в ~/Downloads файл ассоциированной программой?
желательно, чтобы закрыв терминал программа с файлом не закрывалась
sepetov
09.06.2023 14:23Да, контр-пример хороший. Навскидку придумываю способ, которого лучше бы не было: scandir() даст список файлов, stat() позволит получить дату любого из этих файлов не открывая файловый дескриптор, а вот дальше - беда, без поисковика не придумать.
laatoo
09.06.2023 14:23+1я часа полтора ковырялся с башом и сдался. открываю руками)
sepetov
09.06.2023 14:23Это боль! Вы правы. Приходится совмещать разные инструменты: где-то я всё же использую bash, но при каждой возможности соскакиваю на какой-нибудь другой скриптовый из имеющихся.
0xd34df00d
09.06.2023 14:23+1Потому что ковыряться надо было не с башем!
Набросал за 10 минут, типобезопасно и осмысленно учитывающе крайние случаи:
% cat OpenLast.hs
#!/usr/bin/env stack -- stack --resolver lts-20.20 script {-# LANGUAGE OverloadedStrings #-} import Data.Functor import Turtle -- (decodeString, toText) import System.Environment main :: IO () main = do files <- sortOn (negate . snd) $ do file <- liftIO getArgs >>= msum . map (ls . decodeString) fileStat <- stat file guard $ isRegularFile fileStat case toText file of Right filename -> pure (filename, modificationTime fileStat) Left _ -> mzero case files of [] -> putStrLn "no files in target dir" ((newest, _) : _) -> do putStrLn $ "opening: " <> show newest shell ("xdg-open " <> newest <> " &") mzero $> ()
% ./OpenLast.hs ~/Downloads ~/tmp opening: "/home/d34df00d/tmp/notes.txt" …
В качестве бонуса поддерживает открытие последнего файла из множества разных директорий суммарно. Если поменять местами
sortOn
иgetArgs
, то можно будет открывать по последнему файлу из каждого переданного пути.
Kergan88
09.06.2023 14:23+11в ps делается в одну строчку весьма очевидным способом:
Get-ChildItem ~/Downloads -File | Sort-Object -Property CreationTime -Descending | Select-Object -First 1 | Invoke-Item
чот прям удивлен, что в линуксе с такой задачкей проблемы оО
nronnie
09.06.2023 14:23+3Исчерпал лимит плюсов, поэтому не могу поставить. Очень демонстрирует круть PowerShell - пайпы линукса это, конечно, хорошо, для своего времени это была невероятно крутая идея. Но. Они текстовые, у каждого приложения свой какой-то формат, который еще надо разбирать (а очень редко, но бывает, что это вообще невозможно). Пайпы PowerShell это уже другой уровень, потому что это объекты, к которым уже можно обращаться по всем свойствам и методам которые у них есть
Kergan88
09.06.2023 14:23Пайпы PowerShell это уже другой уровень, потому что это объекты, к которым уже можно обращаться по всем свойствам и методам которые у них есть
И ни каких проблем, как у человека ниже со слешами - потому что
Invoke-Item
применяется именно к объекту файла, а не к строке с путем)
valrust
09.06.2023 14:23Прошу обратить внимание, что проблемы не в Linux, а в Bash. PowerShell можно установить в Linux и назначить его как основной интерпретатор пользователя.
saboteur_kiev
09.06.2023 14:23проблема именно в Линукс, а не в баш
khajiit
09.06.2023 14:23То есть, если на виндовом cmd проблема так же не решается, то проблема в Windows.
И что-то каджит не видит решений на cmd…saboteur_kiev
09.06.2023 14:23Моя претензия в первую очередь относится к "ассоциации", что является частью самого ядра Виндовс, но не является частью Линукс.
khajiit
09.06.2023 14:23И в этом вы таки ошибаетесь.
Если вы переразбивали системный диск любой утилитой, умеющей выполнять операции во время перезагрузки — то вы видели как работает настоящая консольная винда. И хоть в это время кусты реестра загружены в память, механизмы, отвечающие за обработку ассоциаций — юзерспейсные, и будут загружены сильно позже.
Как, внезапно, и xdg.
saboteur_kiev
09.06.2023 14:23Потому что люди пытаются делать вещи, которые архитектурно в линуксе не сделаны. А придираются к bash
Поставьте баш на винду, и сделайтеeval $(ls -lt ~/Downloads | head -n1)
DevFM Автор
09.06.2023 14:23+1Объекты имеют свои плюсы и минусы. Во-первых, адекватно их смогли реализовать в PowerShell лет этак 20 после релиза bash. Во-вторых, у объектов несколько ограниченная область применения. Сила конвейера bash в том, что всё текст. Я могу любые команды с любыми состыковывать. Я одинаково могу работать как с выводом ls, так и с сохранёнными в файле путями. Я могу написать какую угодно программу, и с помощью cut в её выводе брать нужное. В этом и сила bash, и его слабость
DevFM Автор
09.06.2023 14:23+13nohup xdg-open `
find ~/Downloads/* -printf '%T+ %p\n' | sort -r | head -n1 | cut -d ' ' -f2 -`
nohup - чтобы отвязать от терминала
xdg-open - открывает ассоциированную программу. Дальше один аргумент в обратных кавычках, чтобы стать путём для xdg-open
find ищет в заданном каталоге все файлы и выводит дату модификации
sort - сортирует
head - выводит первый, в нашем случае самый свежий файл
cut - оставляет только имя файла, в таком виде устойчиво к пробелам внутри
laatoo
09.06.2023 14:23+2спасибо, моя жизнь стала чуточку удобнее
UPD: не стала, оно не работает :)
но это ничего, даже прибавляет веса статье
too@too-Inspiron-3542:~$ xdg-open find ~/Downloads/* -printf '%T+ %p\n' | sort -r | head -n1 | cut -d ' ' -f2 - xdg-open: unexpected argument '/home/too/Downloads/Anonymous_Pro.zip' Try 'xdg-open --help' for more information. too@too-Inspiron-3542:~$ nohup xdg-open find ~/Downloads/* -printf '%T+ %p\n' | sort -r | head -n1 | cut -d ' ' -f2 - nohup: ignoring input and redirecting stderr to stdout unexpected
DevFM Автор
09.06.2023 14:23+4Прошу прощения, хабр скушал обратные кавычки, которые стоят вокруг find
nohup xdg-open `
find ~/Downloads/* -printf '%T+ %p\n' | sort -r | head -n1 | cut -d ' ' -f2 -`
laatoo
09.06.2023 14:23+4:)
сломалось об слэш в имени файла
Пастуховские четверги ⧸ Владимир Пастухов* и Алексей Венедиктов** ⧸⧸ 08.06.2023 [kEQhLohtjPU].m4a
too@too-Inspiron-3542:~$ xdg-open `find ~/Downloads/* -printf '%T+ %p\n' | sort -r | head -n1 | cut -d ' ' -f2 -` gio: file:///home/too/Downloads/%D0%9F%D0%B0%D1%81%D1%82%D1%83%D1%85%D0%BE%D0%B2%D1%81%D0%BA%D0%B8%D0%B5: Error when getting information for file “/home/too/Downloads/Пастуховские”: No such file or directory too@too-Inspiron-3542:~$ nohup xdg-open $(find ~/Downloads/* -printf '%T+ %p\n' | sort -r | head -n1 | cut -d ' ' -f2 -) nohup: ignoring input and appending output to 'nohup.out'
чудесные удобные линуксовые однострочники для автоматизации повседневной рутины во всей красе
DevFM Автор
09.06.2023 14:23+3В имени файла не может быть слеша, это будет подкаталог. Добавил два фикса: двойные кавычки поверх обратных (да-да, в баше экранирование - ад) и минус после двойки, чтобы взять все компоненты, несмотря на пробелы. У меня запустилось с кирилицей и пробелами, файл со слешом создать не могу
nohup xdg-open "`find ~/Downloads/* -printf '%T+ %p\n' | sort -r | head -n1 | cut -d ' ' -f2- -`"
laatoo
09.06.2023 14:23-1В имени файла не может быть слеша, это будет подкаталог
:)
может это какой-то мнемонический слэш?
вот base64-encoded название файла:
0J/QsNGB0YLRg9GF0L7QstGB0LrQuNC1INGH0LXRgtCy0LXRgNCz0Lgg4qe4INCS0LvQsNC00LjQvNC40YAg0J/QsNGB0YLRg9GF0L7Qsu+8iiDQuCDQkNC70LXQutGB0LXQuSDQktC10L3QtdC00LjQutGC0L7Qsu+8iu+8iiDip7jip7ggMDguMDYuMjAyMyBba0VRaExvaHRqUFVdLm00YQ==
DevFM Автор
09.06.2023 14:23+1Какая прелесть, мне такое не даёт создать
Возможно, где-то (типа в винде или маке) такой файл создать можно, поэтому чисто технически он может существовать. Я думал, что POSIX запрещает слеш в имени, видимо, не шарю...
laatoo
09.06.2023 14:23это работает, но теперь мы же хотели с nohup?
аудиоплеер неэстетично засирает весь терминал логом
Hidden text
too@too-Inspiron-3542:~$ xdg-open "`find ~/Downloads/* -printf '%T+ %p\n' | sort -r | head -n1 | cut -d ' ' -f2- -`" too@too-Inspiron-3542:~$ 03:03:09.956 INFO main:172 Strawberry 1.0.17 Qt "6.2.4" 03:03:09.957 INFO main:173 "Linux Mint 21.1 21.1 - (linux 5.19.0-43-generic) [x86_64]" 03:03:10.033 DEBUG logging:85(GLib-GIO) _g_io_module_get_default: Found default implementation gvfs (GDaemonVfs) for ‘gio-vfs’ 03:03:10.109 DEBUG main:234 Style: "fusion" 03:03:10.115 DEBUG Application:256 Database(0x55d509706090) moved to thread QThread(0x55d50972f4c0) 03:03:10.115 DEBUG SCollection:68 CollectionBackend(0x55d5096d6de0) moved to thread QThread(0x55d50972f4c0) 03:03:10.142 DEBUG Application:256 AlbumCoverLoader(0x55d509711cc0) moved to thread QThread(0x55d50974ffc0) 03:03:10.151 DEBUG SCollection:101 CollectionWatcher(0x55d5099a0260) moved to thread Thread(0x55d509794be0) 03:03:10.151 DEBUG Application:256 TagReaderClient(0x55d509765b80) moved to thread QThread(0x55d509738870) 03:03:10.151 DEBUG NetworkProxyFactory:52 Detected system proxy URLs: QList("", "", "", "") 03:03:10.152 DEBUG WorkerPool<HandlerType>:258 Using worker "strawberry-tagreader" from "/usr/bin" 03:03:10.152 DEBUG WorkerPool<HandlerType>:309 Starting worker 0x7f3cf37fcf40 "/usr/bin/strawberry-tagreader" "/tmp/strawberry_43946680" 03:03:10.174 INFO main:57 TagReader worker connecting to "/tmp/strawberry_43946680" 03:03:10.174 DEBUG WorkerPool<HandlerType>:331 Worker 0x7f3cec0035d0 connected to "/tmp/strawberry_43946680" 03:03:10.190 DEBUG Engine::Base:157 SOUP_FORCE_HTTP1: ON 03:03:10.213 DEBUG GlobalShortcutsBackendGnome:61 Registering 03:03:10.291 WARN IconLoader:87 Couldn't load icon "configure" from system theme icons. 03:03:10.305 WARN IconLoader:87 Couldn't load icon "edit-rename" from system theme icons. 03:03:10.356 WARN IconLoader:87 Couldn't load icon "view-media-playlist" from system theme icons. 03:03:10.370 WARN IconLoader:87 Couldn't load icon "edit-rename" from system theme icons. 03:03:10.376 WARN IconLoader:87 Couldn't load icon "edit-rename" from system theme icons. 03:03:10.377 INFO Player:945 Registered URL handler for "subsonic" 03:03:10.388 DEBUG InternetServices:48 Added internet service "Subsonic" 03:03:10.388 INFO Player:945 Registered URL handler for "tidal" 03:03:10.421 DEBUG InternetServices:48 Added internet service "Tidal" 03:03:10.421 INFO Player:945 Registered URL handler for "qobuz" 03:03:10.455 DEBUG InternetServices:48 Added internet service "Qobuz" 03:03:10.474 WARN IconLoader:87 Couldn't load icon "configure" from system theme icons. 03:03:10.488 WARN IconLoader:87 Couldn't load icon "configure" from system theme icons. 03:03:10.511 WARN IconLoader:87 Couldn't load icon "configure" from system theme icons. 03:03:10.533 WARN IconLoader:87 Couldn't load icon "configure" from system theme icons. 03:03:10.555 WARN IconLoader:87 Couldn't load icon "configure" from system theme icons. 03:03:10.562 WARN IconLoader:87 Couldn't load icon "configure" from system theme icons. 03:03:10.578 WARN IconLoader:87 Couldn't load icon "configure" from system theme icons. 03:03:10.590 WARN IconLoader:87 Couldn't load icon "configure" from system theme icons. 03:03:10.641 WARN IconLoader:87 Couldn't load icon "configure" from system theme icons. 03:03:10.662 WARN IconLoader:87 Couldn't load icon "configure" from system theme icons. 03:03:10.686 WARN IconLoader:87 Couldn't load icon "configure" from system theme icons. 03:03:10.692 WARN IconLoader:87 Couldn't load icon "configure" from system theme icons. 03:03:10.709 WARN IconLoader:87 Couldn't load icon "configure" from system theme icons. 03:03:10.720 WARN IconLoader:87 Couldn't load icon "configure" from system theme icons. 03:03:10.758 WARN IconLoader:87 Couldn't load icon "scrobble" from system theme icons. 03:03:10.760 DEBUG MainWindow:349 Starting 03:03:10.767 WARN IconLoader:87 Couldn't load icon "star" from system theme icons. 03:03:10.774 WARN IconLoader:87 Couldn't load icon "edit-rename" from system theme icons. 03:03:10.801 DEBUG CoverProviders:106 Registered cover provider "Last.fm" 03:03:10.801 DEBUG CoverProviders:106 Registered cover provider "MusicBrainz" 03:03:10.801 DEBUG CoverProviders:106 Registered cover provider "Discogs" 03:03:10.801 DEBUG CoverProviders:106 Registered cover provider "Deezer" 03:03:10.801 DEBUG CoverProviders:106 Registered cover provider "Musixmatch" 03:03:10.802 DEBUG CoverProviders:106 Registered cover provider "Spotify" 03:03:10.802 DEBUG CoverProviders:106 Registered cover provider "Tidal" 03:03:10.802 DEBUG CoverProviders:106 Registered cover provider "Qobuz" 03:03:10.819 DEBUG LyricsProviders:105 Registered lyrics provider "AudD" 03:03:10.819 DEBUG LyricsProviders:105 Registered lyrics provider "Genius" 03:03:10.819 DEBUG LyricsProviders:105 Registered lyrics provider "Lyrics.ovh" 03:03:10.819 DEBUG LyricsProviders:105 Registered lyrics provider "LoloLyrics" 03:03:10.819 DEBUG LyricsProviders:105 Registered lyrics provider "Musixmatch" 03:03:10.819 DEBUG LyricsProviders:105 Registered lyrics provider "ChartLyrics" 03:03:10.819 DEBUG LyricsProviders:105 Registered lyrics provider "Lyrics.com" 03:03:10.838 WARN IconLoader:107 Can't use system icon for "library-music" icon too small. 16 03:03:10.843 WARN IconLoader:107 Can't use system icon for "footsteps" icon too small. 16 03:03:10.851 WARN IconLoader:87 Couldn't load icon "view-media-playlist" from system theme icons. 03:03:10.861 WARN IconLoader:87 Couldn't load icon "view-media-playlist" from system theme icons. 03:03:10.862 WARN IconLoader:107 Can't use system icon for "document-open" icon too small. 16 03:03:10.866 WARN IconLoader:87 Couldn't load icon "radio" from system theme icons. 03:03:10.871 WARN IconLoader:107 Can't use system icon for "device" icon too small. 16 03:03:10.876 WARN IconLoader:87 Couldn't load icon "subsonic" from system theme icons. 03:03:10.879 WARN IconLoader:87 Couldn't load icon "tidal" from system theme icons. 03:03:10.883 WARN IconLoader:87 Couldn't load icon "qobuz" from system theme icons. 03:03:10.886 DEBUG MainWindow:400 Initializing player 03:03:10.887 DEBUG MainWindow:410 Creating models 03:03:10.887 DEBUG MainWindow:417 Creating models finished 03:03:10.889 DEBUG DeviceLister:67 CddaLister(0x55d50a3e2a70) moved to thread QThread(0x55d50a3e0740) 03:03:10.889 DEBUG DeviceLister:67 Udisks2Lister(0x55d50a3e47e0) moved to thread QThread(0x55d50a3e38e0) 03:03:10.889 DEBUG DeviceLister:67 GioLister(0x55d50a3e5340) moved to thread QThread(0x55d50a3e3900) 03:03:10.890 DEBUG CddaLister:115 No CD devices found 03:03:10.912 DEBUG Application:256 PlaylistBackend(0x55d50a412360) moved to thread QThread(0x55d50972f4c0) 03:03:10.931 DEBUG Application:256 RadioBackend(0x55d50a4425e0) moved to thread QThread(0x55d50972f4c0) 03:03:10.935 WARN IconLoader:87 Couldn't load icon "somafm" from system theme icons. 03:03:10.937 DEBUG RadioServices:67 Adding radio service: "SomaFM" 03:03:10.939 WARN IconLoader:87 Couldn't load icon "radioparadise" from system theme icons. 03:03:10.941 DEBUG RadioServices:67 Adding radio service: "Radio Paradise" 03:03:10.941 DEBUG MainWindow:437 Creating UI 03:03:10.947 WARN IconLoader:87 Couldn't load icon "edit-rename" from system theme icons. 03:03:10.952 WARN IconLoader:87 Couldn't load icon "edit-rename" from system theme icons. 03:03:10.958 WARN IconLoader:87 Couldn't load icon "edit-rename" from system theme icons. 03:03:10.964 WARN IconLoader:87 Couldn't load icon "tools-wizard" from system theme icons. 03:03:10.968 WARN IconLoader:87 Couldn't load icon "configure" from system theme icons. 03:03:10.975 WARN IconLoader:87 Couldn't load icon "scrobble" from system theme icons. 03:03:10.982 WARN IconLoader:87 Couldn't load icon "view-choose" from system theme icons. 03:03:10.986 WARN IconLoader:87 Couldn't load icon "musicbrainz" from system theme icons. 03:03:10.992 WARN IconLoader:87 Couldn't load icon "scrobble-disabled" from system theme icons. 03:03:11.008 WARN IconLoader:87 Couldn't load icon "tools-wizard" from system theme icons. 03:03:11.010 DEBUG ScrobblerServices:48 Registered scrobbler service "Last.fm" 03:03:11.010 DEBUG ScrobblerServices:48 Registered scrobbler service "Libre.fm" 03:03:11.010 DEBUG ScrobblerServices:48 Registered scrobbler service "ListenBrainz" 03:03:11.010 DEBUG ScrobblerServices:48 Registered scrobbler service "Subsonic" 03:03:11.014 WARN IconLoader:87 Couldn't load icon "configure" from system theme icons. 03:03:11.031 DEBUG MainWindow:864 Creating playing widget 03:03:11.111 DEBUG MainWindow:911 Loading settings 03:03:11.362 DEBUG SongLoader:232 Loading local file "/home/too/Downloads/Пастуховские четверги ⧸ Владимир Пастухов* и Алексей Венедиктов** ⧸⧸ 08.06.2023 [kEQhLohtjPU].m4a" 03:03:11.363 DEBUG MainWindow:1049 Started QThread(0x55d509587470) 03:03:11.363 DEBUG _MessageReplyBase:31 Waiting on ID 0 03:03:11.364 DEBUG TagReaderTagLib:194 Checking for valid file "/home/too/Downloads/Пастуховские четверги ⧸ Владимир Пастухов* и Алексей Венедиктов** ⧸⧸ 08.06.2023 [kEQhLohtjPU].m4a" 03:03:11.364 DEBUG MessageReply<MessageType>:90 Releasing ID 0 (finished) 03:03:11.364 DEBUG _MessageReplyBase:33 Acquired ID 0 03:03:11.367 DEBUG _MessageReplyBase:31 Waiting on ID 1 03:03:11.367 DEBUG TagReaderTagLib:237 Reading tags from "/home/too/Downloads/Пастуховские четверги ⧸ Владимир Пастухов* и Алексей Венедиктов** ⧸⧸ 08.06.2023 [kEQhLohtjPU].m4a" 03:03:11.368 DEBUG GlobalShortcutsBackendGnome:99 Registered. 03:03:11.368 DEBUG MessageReply<MessageType>:90 Releasing ID 1 (finished) 03:03:11.368 DEBUG _MessageReplyBase:33 Acquired ID 1 03:03:11.419 DEBUG MainWindow:1366 Song changed to "" "" "Пастуховские четверги ⧸ Владимир Пастухов* и Алексей Венедиктов** ⧸⧸ 08.06.2023 [kEQhLohtjPU].m4a" 03:03:11.421 DEBUG Player:733 Playing song "" QUrl("file:///home/too/Downloads/Пастуховские четверги ⧸ Владимир Пастухов* и Алексей Венедиктов** ⧸⧸ 08.06.2023 [kEQhLohtjPU].m4a") position 0 03:03:11.431 DEBUG GstEnginePipeline:617 Setting buffer duration: 4000000000 low watermark: 0.33 high watermark: 0.99 03:03:11.432 DEBUG GstEnginePipeline:700 Setting channels to 2 03:03:11.435 DEBUG Playlist:1185 Updating playlist with new tracks' info 03:03:11.468 DEBUG GstEnginePipeline:783 "autoaudiosink" has volume, enabling volume synchronization. 03:03:11.560 DEBUG GstEngine:965 Got stream info for "file:///home/too/Downloads/%D0%9F%D0%B0%D1%81%D1%82%D1%83%D1%85%D0%BE%D0%B2%D1%81%D0%BA%D0%B8%D0%B5%20%D1%87%D0%B5%D1%82%D0%B2%D0%B5%D1%80%D0%B3%D0%B8%20%E2%A7%B8%20%D0%92%D0%BB%D0%B0%D0%B4%D0%B8%D0%BC%D0%B8%D1%80%20%D0%9F%D0%B0%D1%81%D1%82%D1%83%D1%85%D0%BE%D0%B2%EF%BC%8A%20%D0%B8%20%D0%90%D0%BB%D0%B5%D0%BA%D1%81%D0%B5%D0%B9%20%D0%92%D0%B5%D0%BD%D0%B5%D0%B4%D0%B8%D0%BA%D1%82%D0%BE%D0%B2%EF%BC%8A%EF%BC%8A%20%E2%A7%B8%E2%A7%B8%2008.06.2023%20[kEQhLohtjPU].m4a:" "MP4 AAC" 03:03:11.661 DEBUG GstEnginePipeline:1379 Pipeline initialized: State changed from 2 to 3 03:03:11.662 DEBUG GstEnginePipeline:751 1 event latency 03:03:12.370 DEBUG PlaylistBackend:330 Saving playlist 1
laatoo
09.06.2023 14:23too@too-Inspiron-3542:~$ nohup xdg-open "`find ~/Downloads/* -printf '%T+ %p\n' | sort -r | head -n1 | cut -d ' ' -f2- -`" nohup: ignoring input and appending output to 'nohup.out'
теперь создаётся ненужный файл nohup.out
laatoo
09.06.2023 14:23+5ну вот, за час попыток удалось-таки создать однострочник для открытия файла.
баш такой баш :)
P.S: если кто захочет в .bash_aliases засунуть, не забудьте экранировать кавычку.
alias ldf="nohup xdg-open \"`find ~/Downloads/* -printf '%T+ %p\n' | sort -r | head -n1 | cut -d ' ' -f2- -`\" >& /dev/null"
saboteur_kiev
09.06.2023 14:23Баш был создан тогда, когда GUI не существовал, и нормальной конструкции для запуска гуишных приложений не было в архитектуре линукс, отсюда основной сыр бор.
Я вот считаю себя спецом по баш, но у меня гуишного линукса под рукой никогда не было, чтобы тестить подобные вещи.
DevFM Автор
09.06.2023 14:23Можно весь вывод убить с помощью 2>/dev/null в конце
nohup xdg-open "`find ~/Downloads/* -printf '%T+ %p\n' | sort -r | head -n1 | cut -d ' ' -f2- -`" 2> /dev/null
sswwssww
09.06.2023 14:23Создал алиас, а если мне нужно ещё для 5 директорий такое вытворять? Не создавать же 5 алиасов с разными директориями... Как можно динамически передавать путь?
AlexGluck
09.06.2023 14:23alias vyebon=nohup xdg-open "$(find "${1:-~/Downloads}"/* -printf '%T+ %p\n' | sort -r | head -n1 | cut -d ' ' -f2- -)" 2> /dev/null vyebon vyebon ./v-directorii
DevFM Автор
09.06.2023 14:23Выбор имени для алиаса очень хорош, улыбнуло)
Кстати, вы привели хороший пример, где ещё в bash беды - конструкции вроде ${1:-~/Downloads} не читаемые и контринтуитивные
saboteur_kiev
09.06.2023 14:23я все-таки не очень понимаю, зачем нужен нохап, и как он повлияет на открытое гуишное приложение, если закрыть терминал. IMHO он излишний
DevFM Автор
09.06.2023 14:23Если просто открыть приложение типа gedit 1.txt, то при закрытии терминала приложение будет закрыто. В справке по xdg-open ничего не сказано, что оно работает по-другому. Но, судя по всему, работает по-другому :) т.е. с xdg-open действительно nohup не обязателен, т.к. открытое приложение оказывается отвязанным от терминала.
Правда, вывод приложения будет сыпаться в консоль и мешать. Но тут, наверное, хватит перенаправления. Я ещё поковыряю вопрос
saboteur_kiev
09.06.2023 14:23Нужно просто понимать что именно делает nohup на архитектурном уровне.
он
1. игнорирует сигнал nohup
2. Перенаправляет stdout и stderr (если они еще не перенаправлены) в файл nohup.out
многие приложения сами по себе умеют игнорировать sighup
опять таки нужно понимать архитектуру линукс и что такое сигналы.
Никогда не следует забывать, что баш, кроме того что это язык программирования, это оболочка операционной системы, которая является интерфейсом пользователя операционной системы, и многие вещи, которые вы делаете в этой оболочке опираются на архитектуру.
DevFM Автор
09.06.2023 14:23Блин, точно. По поведению nohup ещё в студенческие годы десять лет назад я ошибочно решил, что оно делает отвязку от родительского процесса, что-то вроде double fork для создания процесса-демона. Был не прав, блокируется сигнал о потере управляющего терминала
RranAmaru
09.06.2023 14:23ls -t ~/Downloads | head -n1 вместо find и т.д. разве не сработает?
DevFM Автор
09.06.2023 14:23Будет, но не рекурсивно. То есть если надо смотреть в подкаталоги, то понадобится find
valrust
09.06.2023 14:23Иногда вместо файла может быть каталог с последним изменением, но с этим можно поработать.
xdg-open ~/Downloads/"$(ls -1 -F -t ~/Downloads/ | grep -v '/$' | head -1)" 2>/dev/null
saboteur_kiev
09.06.2023 14:23Мой вариант с финд
xdg-open "$(find . -printf "%Cs %p\n"|sort -k1|tail -n1|cut -d' ' -f2-)"
VADemon
09.06.2023 14:23+1backtick - устаревший и костыльный синтаксис, используйте "$()", который кавычки внутри по-человечески обрабатывает.
@laatooкамрад толсто тонко потроллил.
valrust
09.06.2023 14:23Благодаря вам загуглил и теперь знаю, что лучше юзать $()
Такие знания лучше не гуглить, а получать из официальной документации
man bash
раздел Command Substitution или из соответствующего раздела Bash Reference Manual.
saboteur_kiev
09.06.2023 14:23проще гуглить правильные термины. Называется это command substitution
`` в принципе не поддерживает вложенность, поэтому $() предпочтительнее
$() легче читать чем ``, особенно учитывая что может встретиться дурацкий шрифт, где разница между кавычками будет плохо видна.
`` не является депрекейтед, и учитывая строгость обратной совместимости, которую обеспечивает POSIX, они всегда будут работать но уже наверное лет 10-15 все рекомендации говорят о том, что надо юзать $()
VT100
09.06.2023 14:23У меня что-то тоже с нохапом грабли при запуске анализатора Saleae:
>s@s:~$ nohup ./Logic-2.3.56-master.AppImage
nohup: ввод игнорируется, вывод добавляется в 'nohup.out'Потом - "интерпретатор занят выполнением команды".
И редактор каментов стал всратый...
DevFM Автор
09.06.2023 14:23+1можно попробовать ещё в фон увести, добавив в конец амперсанд
nohup ./Logic-2.3.56-master.AppImage &
с редактором тут вообще беда. У меня на половине сниппетов кода подсветка не работает. Причём в редакторе она работает, выбран язык и всё хорошо. Но в самой статье не работает...
saboteur_kiev
09.06.2023 14:23Если прямо в ~/Downloads без подкаталогов, то можно упростить до:
xdg-open $(sort -1t ~/Downloads|head -n1)
laatoo
09.06.2023 14:23too@too-Inspiron-3542:~$ xdg-open $(sort -1t ~/Downloads|head -n1) sort: invalid option -- '1' Try 'sort --help' for more information. xdg-open - opens a file or URL in the user's preferred application Synopsis xdg-open { file | URL } xdg-open { --help | --manual | --version } Use 'man xdg-open' or 'xdg-open --manual' for additional info.
ой да господи, уже не смешно, ребятки
DevFM Автор
09.06.2023 14:23А в чём вопрос? Товарищ использует неклассический sort (вроде solaris), у которого есть флаг -1. В его мире такой флаг есть
DevFM Автор
09.06.2023 14:23А о какой ОС речь? Флаг -1 у sort есть не везде. Нашёл такой для solaris
lealxe
09.06.2023 14:23Думаю, что-то вроде этого:
xdg-open "`stat -c '%y %n' Downloads/*|sort|tail -n 1|sed 's/^[0-9-]*\ [0-9:.]*\ +[0-9]*\ //'`"
Nasreddin_Hodja
09.06.2023 14:23+1как открыть последный загруженный в ~/Downloads файл ассоциированной программой? желательно, чтобы закрыв терминал программа с файлом не закрывалась
nohup xdg-open "$(find ~/Downloads/ -type f | xargs -I '{}' stat --printf='%Y %n\n' '{}' | sort | tail -n 1 | awk '{ print $2}')" &
UPD: уже после того как написал свой вариант увидел что выше уже предложили похожие варианты ))
iig
09.06.2023 14:23+2как открыть последный загруженный в ~/Downloads файл ассоциированной программой?
Отличный пример криво поставленной задачи, которую программист сразу бросился криво решать ;) Обычно когда мне предлагают запилить чего-то странного, я задаю 1 уточняющий вопрос: "зачем это нужно?". Если ответа нет - решать задачу не нужно.
Поясняю. В Downloads файлы обычно попадают из броузера. Броузер уже умеет открывать скачанные файлы. Открывать файлы из консоли таким образом бессмысленно. Во первых, если скачивается >1 файл - неизвестно, который скачается последним. Во вторых, если скачивается большой файл, лиса, например, создает 2 файла - пустой (его открывать бессмыссленно), и файл докачки (его тоже открывать бессмыссленно). Нужно сначала делать синхронизацию с броузером.
laatoo
09.06.2023 14:23-1я уже под этим постом чего только не наслушался)
и синтаксис нормальный у баша, просто надо чучуть запомнить, и задача не та, и разработчики целыми днями уникальные строки в файлах ищут :D
Поясняю. В Downloads файлы обычно попадают из броузера
вы ошиблись здесь. home/Downloads она для загрузок, а не только для загрузок браузера.
я все утилиты аля yt-dlp настраиваю на загрузку файла туда по умолчанию, и чищу systemd-tmpfiles'ом каждый день. это такая буферная зона.
если я качаю файл браузером мне удобнее тыкнуть мышкой по иконке загрузок и открыть файл, чем лезть в терминал. зачем мне из контекста гуя переползать в консоль, я ж не больной.
юзкейс:
yt-dlp URL && handy-open-last-downloaded-file-alias && exit
aria2c URL && handy-open-last-downloaded-file-alias && exit
итп
скачать подкаст с ютубчика в аудио и открыть в плеере как будет готово, пока я завариваю кофе
скачать серию/лекцию и открыть как будет готово, пока я начинаю мыть посуду
скачать че угодно и открыть как будет готово, пока я занимаюсь чем то более важным в своей жизни, чем дожидаться когда некая консольная утилита сообщит мне о том что файл загружен и искать его в загрузках руками
randomsimplenumber
09.06.2023 14:23+1Костыли и велосипеды наше всё;)
man этот ваш yt-dlp. Особенно опция --exec. И не надо никаких странных скриптов с поисками и сортировками.
laatoo
09.06.2023 14:23для aria2c, wget, итп?
мне для каждой отдельно взятой команды отдельно искать аналогичный --exec, если единственное общее между ними - это то, что они достанут файл откуда-то и положат в заранее известную мне папку, и этот файл будет там самым новым?
а потом ждать пока в очередной мажорной версии изменят --exec на --then-execute?
странным скрипт выглядит только в баше, потому что баш странный.
не бесите, вы не правы
randomsimplenumber
09.06.2023 14:23+1aria2c, wget, итп
man bash /alias
положат в заранее известную мне папку
Нет. Положат в текущую папку. Поэтому нужно не забывать делать cd куда надо, чтобы костыль работал. Автоматизация,хе-хе.
странным скрипт выглядит только в баше
Странный алгоритм выглядит странно на любом языке;)
Штош, людям нравится придумывать проблемы, не очень удачно их решать, а виноваты в этом bash и Торвальдс;)
laatoo
09.06.2023 14:23Нет. Положат в текущую папку. Поэтому нужно не забывать делать cd куда надо, чтобы костыль работал. Автоматизация,хе-хе.
ну у вас в текущую, я в конфигах на уровне системы/алиасах (если иначе никак) указываю куда складывать. в 99% случаев мне нужно чтобы скачиваемый файл был в ~/Downloads, а не в текущей папке. мне так удобно
Странный алгоритм выглядит странно на любом языке;)
там где-то выше в комментах то же самое, но на powershell.
гляньте ради любопытства, увидите что скрипт можно читать, а не парсить. и вот в уродстве и нечитабельности баша в виноваты bash и Торвальдс :)
вам же кажется что задача неправильно поставлена, и вообще глупая. зачем вы вынуждаете меня доказывать обратное? мне до вашего отношения к этой задаче нет дела. мне нужно, есть инструмент, инструмент, к сожалению, дерьмовый.
хорошего вам дня! :)
randomsimplenumber
09.06.2023 14:23инструмент, инструмент, к сожалению, дерьмовый.
Тут демократия, в смысле open source. Либо за этот инструмент проголосовало большинство, и он им достаточно удобный,либо вы таки забиваете шурупы топором ;)
Раз уже упоролись делать alias'ы - можно сделать ещё полшага и сделать нормально.
Вот вам ещё намек: вы ссылки для yt-dl откуда берете?
DevFM Автор
09.06.2023 14:23Справедливости ради, распространённость != удобность. Bash везде не потому, что он хорош. Тут самоподдерживающаяся система - везде был bash, поэтому много людей знаю bash и считают его нормой, пишут софт в предположении, что bash есть. Поэтому если я напишу софт для не-bash, то он не запустится
А вообще у нас Стокгольмский синдром, и это нормально. После года с bash он уже кажется приемлемым
iig
09.06.2023 14:23Когда начинает казаться что bash плох - пробуем написать что-то подобное но на cmd ;)
valrust
09.06.2023 14:23Скорее всего история развивалась вот так:
В 1970-х годах был создан Unix в котором была командная оболочка Bourne shell (sh). Unix стал популярным, но был проприетарным.
В 1983 начался проект GNU, что бы создать операционную систему похожую на Unix, но свободную.
В 1989 года появилась бета-версия BASH, как замена sh из Unix.
В 1991 год началась история ядра Linux.
С первой половины 1990-х и по наши дни начали собирать дистрибутивы на базе ядра Linux и ПО написанного проектом GNU. Так GNU Bash стал стандартом де-факто в большинстве дистрибутивов GNU/Linux.
AlexGluck
09.06.2023 14:23То есть если писать по стандарту 50 летней давности POSIX shell совместимые скрипты, оно хуже объектной работы в powershell? А то что даже 15 лет назад повершелл был с некоторыми недостатками и работать с ним можно стало только в 2010 с версии 6?
saboteur_kiev
09.06.2023 14:23То есть если писать по стандарту 50 летней давности POSIX shell совместимые скрипты
СТандарту поиск около 30 лет, и он описывает не стандарт для шелл скриптов, а стандарты архитектуры операционных систем.
При этом тот же МакОС сертифицирован с POSIX, а линукс всего лишь совместим
saboteur_kiev
09.06.2023 14:23Bourne Shell это уже продвинутая оболочка, котрую сделал Стивен Борн, изначально первый sh делал еще Кен Томпсон.
А bash (bourne again) сделан уже совсем другим автором.
Кроме того, прикол еще в том, что стандарт POSIX появился ближе к 90м, к котому потом подвели уже все шеллы.
Сейчас баш один из самых популярных, но кроме него полно легковесных sh и dash в разных облачных виртуалках и контейнерах.
Плюс zsh который летит впереди всех.
А еще 10 лет назад в всяких "хакерских" дистрибутивах был популярен korn sh (ksh)
DevFM Автор
09.06.2023 14:23Далеко не у каждой команды есть флаг --exec. Предлагаемый конвейер работает для любого входного каталога, и в этом его сила
iig
09.06.2023 14:23я все утилиты аля yt-dlp настраиваю
s/настраиваю/ниасилил настроить/ ;)
Сама концепция того чего вы хотите странная и состоит в основном из исключений из себя же. Вот допустим, запустил я скачиваться серию My Little pony, учебный фильм с Сашей Серовой, и ушел мыть посуду. Приходят гости, и Саша скачивается первой. Конфуз. Или просто что-то скачалось и запустилось во время zoom-конференции.
Напоминает умный дом, где все лампочки включаются с помощью смартфона, поэтому без
консолисмартфона шагу нельзя ступить ;)Ну и инструмент вы взяли не тот. bash хорош для запуска других программ. Для обработки строк он не подходит. Разве что есть желание превозмогать. Нужно что-то делать со строками - берите python, простое правило, легко запомнить ;)
laatoo
09.06.2023 14:23и задача не та, и инструмент не тот ????
а баш он прекрасен, просто он для чего то другого, а не для того, что нужно ????????
я уже все настроил и доволен, отстаньте, баш все равно останется дерьмом которым является сейчас )
saboteur_kiev
09.06.2023 14:23Архитектура Линукс не подразумевает ассоциаций с программами.
Если GUI умеет это делать, то это фича GUI, а не операционной системы. Следовательно баш и не знает в ассоциации.
Ну а найти последний загруженный файл ls -1t ~Downloads|head -n1
laatoo
09.06.2023 14:23xdg-open меня вполне устраивает, причем тут архитектура линукс.
то что из вывода ls -1t ~Downloads|head -n1 нужно какими-то костылями передавать путь файла на вход xdg-open, при этом обходя разложенные грабли с пробелами в имени, спецсимволами итп - вопрос уже архитектуры линукса, баша, шелла, хоть линуса лично, мне плевать: я не виноватого ищу, а констатирую факт.
это - дерьмо. смешно и нелепо спотыкаться о пробел/спецсимвол в имени файла в 2023 году.
защищать это - ещё смешнее и нелепее.
khajiit
09.06.2023 14:23это — дерьмо. смешно и нелепо спотыкаться о пробел/спецсимвол в имени файла в 2023 году.
PS C:\Users\khajiit> cd \Program Files Set-Location: A positional parameter cannot be found that accepts argument 'Files'. PS C:\Users\khajiit> cd \"Program Files" PS C:\Program Files>
Упс.
laatoo
09.06.2023 14:23PS: читается, поддерживается, понятно
Get-ChildItem ~/Downloads -File | Sort-Object -Property CreationTime -Descending | Select-Object -First 1 | Invoke-Item
Bash: брэйнфак
nohup xdg-open "`find ~/Downloads/* -printf '%T+ %p\n' | sort -r | head -n1 | cut -d ' ' -f2- -`" >& /dev/null
Можете дальше отрицать очевидное, и пытаться искать аргументы в пользу прелестей баша
И вам хорошего дня :)
khajiit
09.06.2023 14:23Этот отвечал на аргумент не о синтаксисе, а о пробелах, если вы не заметили.
Будьте внимательнее, не будьте сиримэ )laatoo
09.06.2023 14:23Get-ChildItem ~/Downloads -File | Sort-Object -Property CreationTime -Descending | Select-Object -First 1 | Invoke-Item
я не вижу в однострочнике проблемы с пробелами и попытки её решить.
потому что её нет.
khajiit
09.06.2023 14:23А каджит уже все показал 4 коммента вверх по ветке, но вы таки упорствуете в бытие сиримэ.
Nasreddin_Hodja
09.06.2023 14:23я не вижу в однострочнике проблемы с пробелами и попытки её решить.
В этом однострочнике как бы проблемы тоже нет:
find /tmp -type f -name '*.txt' 2>/dev/null | xargs -I '{}' stat --printf '%Y <%n>\n' '{}'
1686481894 </tmp/какая-то директория с пробелами/файл с пробелами два.txt>
1686481891 </tmp/какая-то директория с пробелами/файл с пробелами раз.txt>
Nasreddin_Hodja
09.06.2023 14:23find /tmp -type f -name '*.txt' 2>/dev/null | while read L; do stat --printf '%Y <%n>\n' "$L"; done
1686486461 </tmp/какая-то директория с пробелами/директория с "кавычками"/файл с 'кавычками' раз.txt>
1686486465 </tmp/какая-то директория с пробелами/директория с "кавычками"/файл с 'кавычками' два.txt>
1686481894 </tmp/какая-то директория с пробелами/файл с пробелами два.txt>
1686481891 </tmp/какая-то директория с пробелами/файл с пробелами раз.txt>
valrust
09.06.2023 14:23Можно без while
find /tmp -type f -name '*.txt' 2>/dev/null -print0 | xargs -0 stat --printf '%Y <%n>\n'
DevFM Автор
09.06.2023 14:23+1Скрипты на python являются хорошей альтернативой. Но у питона куча нюансов - есть зависимость от версии интерпретатора, от библиотек, от положения луны. С точки зрения скриптов стабильность bash куда лучше. Правда, обработка ошибок - это ад адский, ситуации вроде "обновление драйвера принтера снесло всю систему" случаются
Alexey2005
09.06.2023 14:23+2Самый адский ад в Bash — это то, как оно работает со строками (подстановка, объединение и подобное). Как ни экранируй, а всё равно найдётся такая комбинация символов в путях/именах файлов и содержимом переменных окружения, которая сломает скрипт.
M_AJ
09.06.2023 14:23А еще он может сломаться на кириллице, если соответствующая локаль не установлена в системе.
lorc
09.06.2023 14:23python же. Все что имеет больше одного `if`/`for`/`case` лучше писать на пайтоне.
DevFM Автор
09.06.2023 14:23+1Да, на питоне куда приятнее. Однако тут тоже есть свои проблемы - версия интерпретатора, библиотеки, взаимодействие с операционной системой. Это негативно влияет на переносимость, баш тут надёжнее. Но писать неприятнее
А всякие однострочники - вот это сильная сторона bash
Alexey2005
09.06.2023 14:23+1Perl. Он есть везде, даже в Busybox, и работает везде одинаково. Для однострочников идеально.
DevFM Автор
09.06.2023 14:23-1Писать на перле ещё хуже, чем на баш. Перл настолько write-only, что разобрать потом вообще невозможно
Alexey2005
09.06.2023 14:23+1Писать не хуже, хуже потом возвращаться к написанному через полгода. Но в случае однострочников читать их и не требуется. Написал — и используешь. Если однострочник устарел, он пишется полностью заново, благо это редко занимает свыше 20 минут чистого времени.
Andrusha
09.06.2023 14:23+1А что там такого нечитабельного? Регулярные выражения? Ну так они везде есть и везде выглядят одинаково, просто пишущие на Perl ими могут злоупотреблять, да. А нечитабельный код можно и на Python наваять.
saboteur_kiev
09.06.2023 14:23регулярками могут злоупотреблять все =)
перл еще терпимо, по сравнению с sed/awk синтаксисомDevFM Автор
09.06.2023 14:23Как в известном анекдоте. У тебя была проблема, и ты решил применить регулярку. Теперь у тебя две проблемы...
DevFM Автор
09.06.2023 14:23У меня не очень большой опыт на perl, но там каждое действие можно сделать 5 разными способами. В результате скрипты разных людей выглядят насколько чужеродными и разными, что страшно смотреть
А вообще это общепринятый мем. Перл, насколько я знаю, самый распространённый из write-only языков
Nasreddin_Hodja
09.06.2023 14:23Однако тут тоже есть свои проблемы - версия интерпретатора
А что именно там ломается? 2 vs.3 не в счёт, почти все уже переехали на тройку. В тройке только API asyncio всё никак толком не стабилизируют вроде как, постоянно что-то меняют.
DevFM Автор
09.06.2023 14:23Обновление любой библиотеки чревато поломкой. Отсюда желание всегда юзать venv / docker для изоляции, и общая концепция "не пишите системные скрипты на питоне". Возможно, в этой части я устарел, и писать такое на питоне уже считается нормой
Nasreddin_Hodja
09.06.2023 14:23Так сами дистроклепатели давно пишут системные утилиты на питоне. Он потому и стоит зачастую из коробки.
А venv обычно юзается когда нужны какие-то модули более свежей версии чем в репозиториях, Django например. Ну или там чтобы не засорять глобально какими-то модулями, которые нужны ради одной какой-то утилиты или в процессе разработки.
А так обычно если таки пишется системная утилита, то лучше ориентироваться на версии библиотек что идут из дефолтных реп целевой системы.
iig
09.06.2023 14:23+2bash привычное зло ;) Прекрасно в нем то, синтаксис того, что набирается в командной строке, и того, что внутри скрипта - одинаковый. Это очень удобно. Можно просто взять кусок истории и скопировать в скрипт. А неудобно то, что нужно помнить про экранирование пробелов, кавычек, слешей.. Иногда нужно экранировать 2 раза.. И что если запущена >1 оболочка - в .bash_history будет записано чортичто.
DevFM Автор
09.06.2023 14:23Экранирование то ещё адище. Как-то писал сложные curl в баше, никому не пожелаю лезть в этот ад
khajiit
09.06.2023 14:23В некоторых случаях экранирование и разделение приходилось решать совсем интересно:
# block menu, for git output wt_menu_git () { title=$1; shift; msg=$1; shift; items="${@}" wt_cmd="3>&1 1>&2 2>&3 whiptail --notags --title "Push to …" --menu "${menu_push_title}" 0 0 0" IFS=' ' for i in $items; do unset IFS wt_cmd=$(printf "${wt_cmd} ${i%% *} \"${i#* }\"") done eval "${wt_cmd}" return $? }
anetto
09.06.2023 14:23+1Ненавижу IFS, всегда работает ужасно криво
valrust
09.06.2023 14:23Работает именно так как описано в разделе "Word Splitting" в мануале от Bash. Не замечал проблем с этим механизмом.
anetto
09.06.2023 14:23Так любая ошибка - и у тебя вместо приглашения командной строки начнутся каркозябры. Почти всегда, когда приходилось что-то делать с IFS, это занимало кучу времени на отладку, только неприятные впечатления. Особенно, когда это где-то в чужом скрипте
valrust
09.06.2023 14:23Так любая ошибка - и у тебя вместо приглашения командной строки начнутся каркозябры.
Переменная
IFS
используется Bash для определения какие символы являются разделителями (сепараторами) строки на слова. Если значение в IFS не установлено, то разделителями будут пробел, таб и перевод строки. И эта переменная не влияет на приглашение командной строки.На приглашение может влиять переменная
PS1
.
khajiit
09.06.2023 14:23каркозябры обычно начинаются если бинарник вывести в консоль как есть. Там не только каркозябры начнутся, там полное повисание терминала может произойти.
lorc
09.06.2023 14:23Это вы еще скриптов на Perl не видели...
А как вы автоматизируете ручной труд? Нет, нет, да и возникает задача типа "найти в дереве каталогов все файлы с заданным расширением и сложить их все в одну кучу". Или даже банальное "погрепать заданную переменную в куче мейкфайлов". Каждый раз добавлять проект в IDE?
laatoo
09.06.2023 14:23+4найти в дереве каталогов все файлы с заданным расширением и сложить их все в одну кучу".
ищу в файлменеджере *.расширение, в зависимости от всратости окружения подождать .2-5сек, ctrl+a, ctrl+c, открыть место будущей кучи, ctrl+v
ilitaiksperta
09.06.2023 14:23найти в дереве каталогов все файлы с заданным расширением и сложить их все в одну кучу
Сtrl+f, "*.ext", ctrl+c\ctrl+v(или f5\f6) в любом вменяемом файловом менеджере.
Но куда чаще надо не в дереве, а в одной папке. Тогда просто вбиваешь .ext, выделяешь и копируешь.
погрепать заданную переменную в куче мейкфайлов
Сtrl+f, "*.mk" "VAR_NAME" в любом вменяемом файловом менеджере. Или в открыть папку в любом вменяемом текстовом редакторе и ctrl+f "VAR_NAME"
Какойто херней страдаете, реально. Это задачи для файлменеджера, и консольные очевидно тоже такое умеют.
slonopotamus
09.06.2023 14:23+1каждый раз когда нужно что то автоматизировать с помощью bash у меня выступает холодный пот и внутри случается маленькая истерика.
Попробуйте IDE + shellcheck.
laatoo
09.06.2023 14:23я, конечно, гляну, чисто из любопытства, но в любом случае буду со всех сил стараться избегать взаимодействия с башем, настолько, насколько это возможно.
slonopotamus
09.06.2023 14:23+1С этим не спорю, но лично мне удалось уменьшить степень боли и страдания от процесса до вполне приемлемого уровня. Если что, среды разработки от JetBrains имеют поддержку shellcheck из коробки. Ошибки оно подсвечивает автоматически.
Также стоит в самих скриптах включать "Bash strict mode": http://redsymbol.net/articles/unofficial-bash-strict-mode/
saboteur_kiev
09.06.2023 14:23+1Просто многие считают, что баш - это какой-то простенький недоязык, и совершенно не пытаются изучить базовый синтаксис.
А на самом деле, он достаточно удобен. Главное помнить, что в качестве библиотек в баш используются различные консольные команды, и их синтаксис это не часть баш. А в основном критика идет именно к этому.
valrust
09.06.2023 14:23Просто многие считают, что баш - это какой-то простенький недоязык, и совершенно не пытаются изучить базовый синтаксис.
Я бы еще добавил, что кроме синтаксиса нужно знать хотя бы о других подстановках в Bash, а не только о подстановке параметров (переменных) типа
$varname
.
aftertherainbow
09.06.2023 14:23+3Про терминал всё понятно, про Линукс не очень, все пункты можно также выполнить в windows терминале.
DevFM Автор
09.06.2023 14:23Верное замечание. Старался написать про прелесть терминала. Но есть некоторая специфика, так как в винде с терминалом несколько хуже. Либо было хуже в мою активную жизнь в винде, если сейчас они сдвинулись вперёд
astentx
09.06.2023 14:23+3В Windows есть WSL и есть дотнет с объектами в PowerShell. Так что да, сдвинулись. Но обычный cmd, конечно, "несколько хуже", мягко говоря
DevFM Автор
09.06.2023 14:23+1WSL - это ровно тот терминал, о котором я пишу :) в powershell есть прикольные штуки, их объекты куда круче текста. Но в теории - потому что на практике всё криво и не консистентно. Было, по крайней мере - не моя область сейчас
SquareRootOfZero
09.06.2023 14:23Для Windows есть альтернативные терминалы — я, например, перешёл на ConEmu (перешёл давно, так что вспомнить, чем именно оно лучше дефолтного cmd не могу, но точно лучше). Там даже можно выбрать командный интерпретатор — между cmd и PowerShell, линуксоида такой мега-фичей вряд ли удивишь, но тем не менее.
DevFM Автор
09.06.2023 14:23Альтернативные терминалы и в линуксе есть, с куда более приятными циклами, экранированием и всем прочим. Но сразу теряется мощь в виде переносимости, к сожалению. И это неприятный компромисс
SquareRootOfZero
09.06.2023 14:23Много где много что есть, так и что с того? Губы Никанора Ивановича не приставишь к носу Ивана Кузьмича, приходится жить с тем, что есть на конкретно твоей платформе.
valrust
09.06.2023 14:23Альтернативные терминалы и в линуксе есть, с куда более приятными циклами, экранированием и всем прочим.
Циклы, экранирование и всё прочие к терминалу никакого отношения не имеют. Это всё функции командного интерпретатора (оболочки - shell).
Но вы правы в том, что в Linux есть выбор терминалов, точнее эмуляторов терминала: GNOME terminal, Konsole, xterm, Guake, Qterminal и т.д.
И есть альтернативы командных интерпретаторов (оболочек): sh, bash, dash, zsh, ipython3, psh, powershel и т.д.
saboteur_kiev
09.06.2023 14:23Вот сразу вижу непонимание между терминами шелл и терминал.
Откуда в конему циклы и экранирование, если это терминал?
deitry
09.06.2023 14:23+1Современный Windows Terminal прекрасен, им бы только Quake mode допилить до уровня линуксового guake
DerRotBaron
09.06.2023 14:23Не всегда и не все так же.просто. cmd.exe старый, тупой и просится на свалку, а powershell умеет много, но довольно сложно и не очень понятно, зачем учить редкий язык для редкой технологии, если нет необходимости и планов быть виндовым админом.
Ну и тем временем на дворе 2023 и есть жизнь без винды, и в этой жизни умения работы с *nix/*sh вполне себе востребованы
slonopotamus
09.06.2023 14:23а powershell умеет много
До тех пор пока по умолчанию в винде не появится запуск powershell-скриптов по дабл-клику, bat-файлы никуда не денутся.
vasyakolobok77
09.06.2023 14:23Если очень хочется, то можно сделать запуск по клику, вот только запуск отдельным пунктом меню сделан специально в целях безопасности. Лучше сделать обдуманное действие, чем чинить последствия необдуманного.
slonopotamus
09.06.2023 14:23+1Мне очень хочется чтобы оно было по умолчанию.
запуск отдельным пунктом меню сделан специально в целях безопасности
Не вижу в этом логики. Экзешники запускать дабл-кликом можно, .bat можно, ярлыки можно, а .ps1 небезопасно?
nronnie
09.06.2023 14:23+1Тут все поголовно путают "терминал" и "шелл". "Шелл" - это только интерпретатор строковых команд, "терминал" - это приложение для взаимодействия с пользователем через устройства ввода-вывода. И они, по сути, очень слабо связаны.
saboteur_kiev
09.06.2023 14:23Вы тоже путаете =)
shell - это оболочка, не обязательно строковых команд. Это в принципе софтварная часть интерфейса. Шелл может быть не только CLI, но также и графическим, или например оболочка может быть предоставлена в виде окошек и диалогов в текстовом режиме, или те же панельные менеджеры - тоже оболочки.valrust
09.06.2023 14:23В контексте статьи все таки речь идет о shell как он определяется стандартами Unix.
3.347 Shell
A program that interprets sequences of text input as commands. It may operate on an input stream or it may interactively prompt and read commands from a terminal.
saboteur_kiev
09.06.2023 14:23Это у вас RFC или вырезали вне контекста кусок чего-то?
Оболочка - это интерфейс пользователя. Оболочка состоит из железа и софта.
Если мы говорим про текстовый терминал, то шелл будет что-то вроде bash/cmd/powershell. Если мы говорим о GUI , это будет что-то вроде проводник/KDE/что-то еще.
Слово shell это именно оболочка, а не текстовый терминал.
laatoo
09.06.2023 14:23+27решением прикладной задачу: попробуем найти уникальные строки в большом файле
очень прикладная задача. все вокруг только этим и занимаются за компьютерами да ноутбуками.
вот буквально сегодня пришел кофе попить, смотрю - люди за ноутбуками.
подхожу к одному - говорит, ну что, брат, щас вот досчитаю строчки в файле, а вечером домой к семье.
за другим столиком два человека, тычут пальцем в экран, что то бурно обсуждают. я было заподозрил неладное, но тут содин другому говорит "вот эту строчку мы уже видели час назад!". все встало на свои места.
улыбнулся, заказал кофеек, сел, открыл ноутбук. досчитал свои строчки, подписался на рекламируемый телеграм канал, написал этот коммент, и пошел домой, девушка ужин приготовила
DevFM Автор
09.06.2023 14:23Спасибо, посмеялся :) Такого действительно много вокруг. Например, слить базы поставщиков/клиентов/товаров - вполне прикладная задача. Если условная CRM этого не умеет, то это надо как-то самому. Понятно, что эксель такое может. Но на миллионах строк эксель начинает грустить
Я из своей практики собрал, на свой вкус, самые показательные примеры. Возможно, они кривые и косые - но последние 10 лет я постоянно сталкиваюсь с подобным в совершенно разных сферах деятельности. А реклама ТГ... Ну, я там выкладываю интересные материалы. Если вам они понравятся, буду рад
ris58h
09.06.2023 14:23+3очень прикладная задача. все вокруг только этим и занимаются за компьютерами да ноутбуками.
Зачем разработчику нужен Linux вообще и терминал в частности
Сарказм почти удался.
laatoo
09.06.2023 14:23+1удался, т.к. для разработчиков поиск уникальных строк в большом файле это примерно столь же актуальная задача, что и для рандомного офисного клерка.
пример "прикладной" задачи разработчика высосан из пальца
сколько ваших коллег прямо сейчас ищут уникальную строчку в файле? может, делали это хотя бы раз за последний месяц? год? сколько таких задач возникало за последние 5 лет? сколько из них решали с помощью баша?
DevFM Автор
09.06.2023 14:23+3В моём мире это довольно частая задача, если без акцента на "больших файлах". Что-то грепнуть, отсортировать, слить, найти, заменить - все варианты работы с текстовыми файлами нужны. Если освоить принцип декомпозиции и применения конвейера, то эти задачи решаются влёт. Я рассмотрел одну конкретную. Вы считаете, что надо трактат писать? Есть advanced bash scripting guide на 1.5к страниц для этих целей. Я хотел заинтересовать, показать удобство, показать примеры
putnyk
09.06.2023 14:23+2Зря Вы так. Мне вчера подобная задача пришла: в каталоге мониторить наличие новых *.csv, выпиливать из них строки-дубли (без учёта id строки) и сохранять в новый файл.
laatoo
09.06.2023 14:23+1я не утверждаю что таких задач не бывает.
я утверждаю что это плохой пример прикладной задачи для разработчика, так как такая задача - это исключение, а не будни.
в общем случае будни разработчика проходят в IDE, а не в баше и мире всратых линуксовых утилит. и это прекрасно.
ris58h
09.06.2023 14:23Ответ на ваши вопросы - да.
У админов, devops, backend регулярно возникает такая задача.
А, например, у фронта, который сидит в кофейне и только код в IDE пишет, а что там внутри он не знает и не понимает, таких задач не возникает.
сочувствую :)
laatoo
09.06.2023 14:23+1у фронта, который сидит в кофейне и только код в IDE пишет, а что там внутри он не знает и не понимает, таких задач не возникает.
я по обе стороны (фронт и бэк) работал и работаю в ide.
админы и девопсы это не оч то про разработку (обслуживание бизнеса) в принципе, это обслуживание разработки и/или техники, я поэтому их особо не рассматриваю здесь.
спесь про ничего не понимающих "фронтендщиков" пропадает когда садишься на его место. убедился на себе лично.
можете поверить на слово, можете проверить сами. ну а можете дальше ковыряться в башах, консервируя свои представления, как угодно ;)
хорошего вам дня!
N-Cube
09.06.2023 14:23Да и разработчик без шелла мало чего стоит - к примеру, хорошо настроенный кластер может обойтись в разы дешевле за счет инстансов попроще и их количества, а на какой-нибудь университетский суперкомпьютер с древним линуксом/юниксом вы свою программу и зависимости в жизни не установите без отличного знания разных шеллов (и их версий). Ну или хотя бы скомпилировать и запустить на гитхабе тесты (github actions) под все поддерживаемые операционки (и удалить все, что возможно, чтобы место освободить, но не сломать нужного). В эмбеддед разработке все еще интереснее :)
laatoo
09.06.2023 14:23хорошо настроенный кластер
а разработчик тут причем?
N-Cube
09.06.2023 14:23Простите, вы как будете софт разрабатывать, под сферический кластер в вакууме? Нужно кластер развернуть, настроить, разработать софт, протестировать, документировать, передать админам - только тогда это будет эффективно и надежно работать лет так 5-10, сколько «железо» выдержит. С эмбеддед все еще веселее, потому что еще и операционку зачастую собрать самому надо, не говоря уж о сборке и настройке системных утилит - и это все разработчик сам делает обычно. А если вы про кодера, который пишет одну функцию и понятия не имеет, зачем, то это вовсе не разработчик.
slonopotamus
09.06.2023 14:23+1Вы думаете какой-нибудь Wordpress разрабатывают под конкретный кластер?
N-Cube
09.06.2023 14:23Вот вы серьезно называете вордпресс и прочие веб-формочки кластерным софтом? Выше я вполне доступно написал, о какой разработке речь.
laatoo
09.06.2023 14:23+1кроме вас никто не говорил про «кластерный» софт
Нужно кластер развернуть, настроить, разработать софт, протестировать, документировать, передать админам
разработчик во всей этой цепочке занимается, собственно, разработкой софта
N-Cube
09.06.2023 14:23Вы утверждаете, что разработчик Kubernetes ничего о кластерах знать не должен, а все ему админы устанавливают и настраивают (видимо, еще до написания самого Kubernetes, да)? И булки на деревьях растут, ага.
laatoo
09.06.2023 14:23+1сколько раз вам нужно указать явно/неявно на то, что ваш случай частный, а не общий?
N-Cube
09.06.2023 14:23Глупости говорите. Четверть века назад «контейнером» был chroot, который еще надо ухитриться собрать, а линукс, или тот же постгрес или перл с апачем собирались из исходников - так что, прежде чем начать программировать хоть что-то, нужно было уметь все скомпилировать (с патчами, конечно, иначе никак), установить и настроить. Да еще лет 10 назад на ноуте при каждом обновлении ядра мне приходилось заново видеодрайвер компилировать и вкорячивать его в систему (амд тогда на ноуте под линуксом был тот еще квест), а потом настраивать управление энергосбережением, яркостью экрана и прочим. А управление кодировками? Лет 20 назад для этого приходилось самому системные утилиты дописывать (ну, нужна мне была KOI8 по историческим причинам). И так далее и так далее. Конечно, знание шелла было необходимо ежедневно. Да и сегодня, собрать деб-пакеты или там homebrew пакеты (для Мак; а попробуйте питон с поддержкой эппловского Accelerate на Apple Silicon без шелла собрать), развернуть кластер, сделать CI тесты и все прочее - требует шелла. Кстати, все или почти все квалифицированные админы еще со времен Unix ушли в программирование, так что средний программист нынче на голову лучше среднего админа :) Еще раз - не путайте кодера (решает одну или несколько уже сформулированных задач) с программистом (решает проблему).
laatoo
09.06.2023 14:23в огороде бузина, в киеве дядька..
вы уже сами запутались в том что хотите мне доказать :)
хорошего вам дня!
N-Cube
09.06.2023 14:23+1Не в чем тут запутываться - баш «хоронят» так же, как доллар. Однако все слухи о его смерти сильно преувеличены (с).
DevFM Автор
09.06.2023 14:23+1Согласен с вами. Как пишет Джоел в Законе дырявых абстракций, надо знать на один уровень глубже того, на котором вы работаете. Поэтому уметь самому собрать кластер и понимать как он работает важно для того, кто пишет софт под этот кластер. Да, это не обязательно. Да, с разделением труда всё больше тех, кто крутят гайку в своём закрытом мире. Но как раз bash - это наша латынь, которая 30 лет работает и ещё столько же будет, вероятно. Занятно слушать тех, кто с этим не согласен)
ris58h
09.06.2023 14:23+1спесь про ничего не понимающих "фронтендщиков" пропадает когда садишься на его место. убедился на себе лично.
Я не говорю про всех фронтов, а про описанного вами разработчика, который дальше IDE не вылезает. Коллеги фронты с которыми мне доводилось работать - крутые инженеры, которые баш лучше меня знают и проблем с работой в командной строке у них не возникает, как и вопросов о том, зачем им это.
И вам не хворать!
Kotofay
09.06.2023 14:23Если начинать от печки, то нужно рассказать откуда взялась эта строчка: "
libheif-examples
"DevFM Автор
09.06.2023 14:23Если загуглить "ubuntu heic to jpg" среди первых ссылок будет ман, в котором предлагается heif-convert. Если попробовать его выполнить, то вывод будет такой
$ heif-convert
Command 'heif-convert' not found, but can be installed with:
sudo apt install libheif-examples
Вот и он
DerRotBaron
09.06.2023 14:23Отличный вопрос, кроме гугла, как предложили выше, есть еще метод:
$ apt search heic Sorting... Done Full Text Search... Done python3-filetype/jammy,jammy 1.0.10-2 all Infer file type and MIME type of any file/buffer
Так, не очень интересно, но можно вспомнить, что. HEIC это HEIF
$ apt search heif Sorting... Done Full Text Search... Done ... libheif-dev/jammy 1.12.0-2build1 amd64 ISO/IEC 23008-12:2017 HEIF file format decoder - development files libheif-examples/jammy 1.12.0-2build1 amd64 ISO/IEC 23008-12:2017 HEIF file format decoder - examples libheif1/jammy,now 1.12.0-2build1 amd64 [installed,automatic] ISO/IEC 23008-12:2017 HEIF file format decoder - shared library ``°
DevFM Автор
09.06.2023 14:23Обожаю решения, которые не требуют интернета. Начинающие разработчики не знают, как это "без интернета" :))
ifFamous
09.06.2023 14:23Поставил недавно Линукс. Так как изучаю java со всеми вытекающими, решил поставить туда docker. На макОси просто программа с гуи и ставиться изи, на винде тоже самое. На линуксе решил поставить докер, пошел по "сложному" пути установки последней версии, не знал, что можно накатить через apt, но там, насколько я понял, отстает с обновами. Ну да ладно, первый раз не вышло, что-то где-то прошляпил в настройках или что, не знаю. Снес все, а все ли? xD Ладно, нашел гайд на ютубе и поставил, все вроде действия те же самые, но в этот раз получилось. Накатил поверх гуи, все окей. Месяц не садился за комп, тут сел, зашел в докер, а тут и обновление и насколько я понял, чтоб обновится, нужно по сути снести его полностью и накатить снова. Ладно, снес и поставил через apt.
В общем, основную фрустрацию вызывает конкретно установка и непонимание, а правильно ли я все поставил, а не возникнет ли потом проблем из-за того, что из-за косяка на каком-то шаге, что-то не так установил, такое. Опять же, это только с docker так было, в остальном - норм. Терминал по тихой осваиваю :)DevFM Автор
09.06.2023 14:23+1Как раз спорили недавно об этом с коллегой. Мне офф гайд установки докера на убунту кажется простым, пяток команд и всё. Коллега не согласился :)
ifFamous
09.06.2023 14:23Я скорее о том, что используя всю жизнь винду и год макось, к такому я не был готов) И уверенности в том, что все сделал правильно, тоже не особо, хоть и шагов не так много, но все же в первый раз я где-то накосячил(перешел по ссылке на офф гайд, вроде по гайду с того же сайта в первый раз ставил, но шагов больше было и еще там перенаправляли что-то дополнительное ставить на их же сайте).
Сейчас стоит через apt, насколько я понимаю, теперь и при обычном sudo apt update && sudo apt upgrade, должен обновляться.CherryPah
09.06.2023 14:23а в макоси с brew не сталкивались?
N-Cube
09.06.2023 14:23Чем брю не угодил? Готовых пакетов полно, свои писать можно (и куда как попроще, чем, скажем, в дебиане).
CherryPah
09.06.2023 14:23Да в общем и целом устраивает, только по мне он немного неповоротливый, особенно если софт через него раз в полгода ставить.
Просто комментатор выше пишет что у него опыт работы с макосью/виндой и его смутил apt в линуксах. Хотя в маке пакетный менеджер брю вполне себе распространенное явление, когда нужно поставить что-то не из аппстора
ifFamous
09.06.2023 14:23Практически все, что стоит на маке, было установлено скачиванием .dmg с сайтов программ, кроме git и postgres. Но разница в том, что brew, как и sudo apt install, все понятно и просто, а когда что-то ставишь и там много шагов, начинаешь задумываться, а норм ли поставил и встало ли все как надо. В первый раз, когда ставил docker, где-то накосячил, потому и появляются сомнения)
ifFamous
09.06.2023 14:23Сталкивался. Если память не изменяет, ставил гит через него или постгрес, проблем не было, на этом все. Но там и команда была всего одна, по моему, как на убунту какой-нибудь sudo apt install ... и забыл)
nronnie
09.06.2023 14:23+2На cайте докера есть скрипт, который для любого линукса всё делает сам:
$ curl -fsSL https://get.docker.com -o get-docker.sh $ sudo sh ./get-docker.sh
В продакшен ставить им не рекомендуют, но локально для разработки вполне норм.
DevFM Автор
09.06.2023 14:23+4Кстати, это одна из ужасно плохих практик - делать sudo рандомному скрипту из интернета
nronnie
09.06.2023 14:23+3Что мешает сначала внутрь посмотреть? Но, лично вы, если такой "тру" то можете вообще всё из исходников собирать - кто вам запретит.
nronnie
09.06.2023 14:23+2Скрипт, к слову сказать, и не "рандомный". Или, что, выходит, что скачать и установить *.deb c docker.com это ок, но, запустить скрипт оттуда же это фу?
slonopotamus
09.06.2023 14:23+3И вот так, лёгким движением руки любой линукс-дистрибутив превращается в слакварь. Горите пожалуйста в аду советчики устанавливать system-wide софт в обход менеджера пакетов.
DerRotBaron
09.06.2023 14:23+1Надо сказать, на дебчатые и шапчатые дистрибутивы подобные скрипты ставят такое через добавление репозитория в менеджер пакетов, а не через произвольную запись в /ussr/local или /opt. Ну или в хомяк, если это что-то пользовательское вроде rustup.
Но отучать доверять
curl | sh
и особенноcurl | sudo sh
крайне стоит.
DevFM Автор
09.06.2023 14:23Факт. Ещё жутко не люблю snap из-за появления кучи доп проблем без особых выгод
Melirius
09.06.2023 14:23Ооо, докер в снапе на Убунте - это вообще кошмар.
nronnie
09.06.2023 14:23У меня снап всегда ассоциируется с Windows Store под виндой - какая-то хрень, которую прикрутили параллельно с привычным менеджером пакетов только чтобы всё запутать.
DevFM Автор
09.06.2023 14:23А как вам Windows Store? Моё активное использование винды закончилось до его появления, и я не в курсе, удобно ли это и стал ли Store стандартом распространения софта, как steam для игр
slonopotamus
09.06.2023 14:23докер в снапе на Убунте
Но зачем?
sudo apt-get install docker.io
и вы великолепны.khajiit
09.06.2023 14:23+1А если хочется совсем-совсем свежего — есть роллинги, тысячи их, включая Debian sid.
nronnie
09.06.2023 14:23В случае debian-based там внутри такой же apt, просто уже с нужными настройками.
slonopotamus
09.06.2023 14:23Ну и вообще,
sudo apt-get install docker.io
и не надо возиться ни с какимиcurl | bash
.nronnie
09.06.2023 14:23Ну, опять-таки - это способ (curl / bash) не с балды ведь я взял, а с официальной доки самого докера - если они там так пишут, то, возможно, причина какая-то есть. Я ведь не советую скрипты скачанные с ВКонтакта запускать.
exadmin
09.06.2023 14:23+5Мой реалистичный сценарий: когда есть только доступ по ssh к удаленному linux-серверу по не самому быстрому каналу, как раз всю вот эту магию очень удобно делать поверх множества жирных log-файлов, которые не вытянешь себе в windows-песочницу, потому что очень тяжелые и по секюрити соображениям.
DevFM Автор
09.06.2023 14:23Именно! Идеальный use-case. Правда, дальше ещё начинаются пляски, так как на нестабильному каналу ещё надо screen/tmux и настройки ssh клиента, а то больно будет. Довольно непростая тема
exadmin
09.06.2023 14:23+2О да, классные штуки. Когда запускаешь тяжёлое, а потом из метро или электрички с телефона контролируешь/доделываешь...
nronnie
09.06.2023 14:23Легко автоматизировать процессы
Я сам достаточно работаю с Линуксом, но после PowerShell делать что-то на bash это какая-то адова боль.
tommyangelo27
09.06.2023 14:23+1Для простых задач (вроде сортировки и грепа) есть git bash под Винду. А для чего-то более сложного - я лучше скрипт на php/питоне напишу.
nronnie
09.06.2023 14:23-1есть git bash под Винду
Да, в принципе, зачем, когда есть PowerShell, где все на порядки логичней и более упорядоченно. Ну а если ты .NET разработчик, то в нем ты вообще как рыба в воде, т.к. все его объекты это объекты .NET.
Sild
09.06.2023 14:23+8Ну, поехали
Легко поставить софт
Давайте поставим virtualbox. Что для этого нужно? Добавить репозиторий, обновить кеш, добавить ключ, непосредственно установить. В каждом дистрибутиве это разные команды.
Легко вспомнить
Или не вспомнить, потому что сессии баша сохраняются при определенных условиях. Или под другим пользователем. Или с другими флагами. Зато есть риск выполнить не ту команду.
Легко настроить под себя
Хе-хе, и вам придется настраивать под себя! Ну ладно, тут мне особо возразить нечего, насколько я знаю винда действительно менее конфигурируема
Изучается один раз
Графический UI призван быть интуитивно-понятным. Вы нажимаете на кнопку, и видите возможности. Все команды линукса надо учить, и помнить какими возможностями они обладают. Вы уже выучили 1 раз как посмотреть текущую загрузку сети? Или уровень заряда батареи? Уж для батареи то наверняка используете UI...Что проще - выучить все флаги nc/netstat/tcpdump или таки взять wireshark?
Docker для DevOps
Уже лет 7 есть под винду
Ускоряем работу на примере
22:36:54 @mac:~/Downloads$ time cat rockyou.txt | sort --unique | wc -l sort: Illegal byte sequence 0 real 0m0.120s user 0m0.085s sys 0m0.020s
Хрюк-пук...сиди-разбирайся что не так. Я, конечно, в маке, как можно заметить - но казалось бы, тут тот же самый терминал и те же самые команды?
Заключение
Работайте там, где привыкли и где вам удобно. Все существующие инструменты - говно, просто используйте то, что вам нравится.
DevFM Автор
09.06.2023 14:23+1Коллега тоже возмущался этому тезису. Ну, на мой вкус, apt в целом куда приятнее и понятнее, чем ставить рандомный экзешник
nronnie
09.06.2023 14:23Екзешник, как правило, подписан, содержит в себе стандартный
*.msi
, а если его ставишь черезwinget
(лично я так уже давно и делаю), то еще и имеет хеш, который проверяется. Т.ч. вовсе не и не такой рандомный.
slonopotamus
09.06.2023 14:23Давайте поставим virtualbox. Что для этого нужно? Добавить репозиторий, обновить кеш, добавить ключ, непосредственно установить.
Что за бред. `emerge virtualbox`. Конец.
auresio
09.06.2023 14:23-1Ну не нравится вам лично, ну так не ешьте. Линукс штука добровольная, никого по страхом смерти пользоваться не заставляют. Претензии типа это "не так как в винде", как минимум глупость. Вы тоже не сын маминой подруги, что теперь расстрелять вас из зенитки что ли.
DerRotBaron
09.06.2023 14:23Давайте поставим virtualbox. Что для этого нужно?
Взять и поставить. Последняя версия вам почти наверняка не нужна, а в большей части пригодных к использованию конфигураций он уже есть, а если у вас БолгенОС или упаси торвальдс Федора без RPM Fusion, это скорее всего ваша проблема.
Легко вспомнить
Как хорошо, что это с GUI решается легко и просто, да?
Легко настроить под себя
Угу, все дефолты идеальны, и раз они идеальны, их никто не меняет просто такИзучается один раз
Только это и есть один из интерспрайзных интерфейсов, который обычно стараются не ломать. А с интуитивно понятными GUI регулярно интуитивно понятно что-то куда-то двигают, и в результате не поцмешь, эта настройка в Accessibility, тнтерфецсе, экспериментальных опциях.или вовсе удалена 3 версии назад как непопулярная.Ускоряем работу на примере
Если обратиться ко второму слову в заголовке статьи, это можно воспринимать как признание в профнепригодности для почти всех, кто попадает под это самое второе слово.Заключение
Согласен, но с важным замечанием:
следите за тем, какие инструменты еще решают задачу, возможно, они эффективнее настолько, что игнорированее этого когда-нибудь обойдется дорого
AlexGluck
09.06.2023 14:23+5Открываем центр приложений
Вбиваем в поиске название приложения
Наживаем кнопку установить
Не пишем бред в интернетах
Sild
09.06.2023 14:23А куда это мы в GUI полезли...
У вас же там свежая версия? Оракловая небось, именно та, на которой запустятся образы для отладки? (спойлер - не думаю. Потому что оракловая устанавливается через внешний репозиторий или скачиванием с сайта)AlexGluck
09.06.2023 14:23+1Это gpl версия, свежая. Просили просто гуй вот я и гуй дал. Сам бы системный софт ставил через `dnf install virtualbox`
DevFM Автор
09.06.2023 14:23Менеджер пакетов работает поверх apt и ничем не отличается, ниже предложили apt install virtualbox. Думаю, тут скрин - красивый способ показать, что оно есть из коробки и даже терминала не требует
Darkholme
09.06.2023 14:23-1apt install virtualbox
Если нужна более новая версия - у вас специфические условия и думаю, что вы осилите запустить 4 команды в терминале с офф. сайта или установить deb оттуда же. В винде же устанавливают msi?
Хрюк-пук...сиди-разбирайся что не так. Я, конечно, в маке
Казалось бы, а причём здесь линукс...
То, что ваш вендор впихнул какую-то древнюю/обрезанную/модифицированную версию утилиты в свою ОС - повод обращаться к разработчикам ОС, а не утилиты или других ОС. С таким же успехом можна Linux клясть, ведь в windows версия curl с уязвимостями (практически свежий сейс)
Mayurifag
09.06.2023 14:23+2Как будто бы не самый лучший пример выбран, я про HEIC. Вот сижу я на маке, и, допустим не знаю, что оказывается линукс мне нужен, допустим что я — ЦА статьи.
Я уже давно сделал через автоматизатор и чатгпт чтобы по ПКМ в выпадающей менюшке -> Services -> Convert to .jpg было. Лично у меня ещё и исходник удаляет, обычно мне сам этот .HEIC больше ни к чему после конвертации. Соответственно, часто пользуюсь, перекидываю по airdrop фото со смартфона и, бывает, этот промежуточный шаг в конвертацию jpg нужен.
Способ замечательно масштабируется и на один файл, и на выделенные все файлы в директории, и ещё особенно на выделенную часть файлов, например недавно закинутыx, — ничего вспоминать не надо из альясов или истории команд в терминале.
Может и на виндовсе можно аналогично сделать. Я хотел к тому лишь написать, что несмотря на то, что консолью я пользуюсь постоянно, но вот к конкретно этой задаче подхожу с использованием гуя.
N-Cube
09.06.2023 14:23-1Просто автор не линуксоид, а телеграм-канал-пиарщик, отсюда и выбор софта (кто вообще слышал о таком? явно нагуглено на скорую руку) и советов (предлагать баш зависимые скрипты, когда баш по умолчанию перестали лет пять назад и на линуксах и на маке ставить это уже профнепригодность).
Есть замечательный набор утилит обработки изображений imagemagick, с ним пишем
convert -resize … a…. a.jpg
и заданный файл превращается в указанного размера (в пикселах или процентах) жпег. Можно заодно вырезать нужный кусок изображения, сгенерировать анимированный гиф и так далее. Вот недавно для книги делал обложку с помощью imagemagick - разместить картинку, сделать обрамление, заголовки и прочее напечатать - можно запустить пакетно для всех установленных шрифтов и сравнить, легко сгенерировать обложки для серии книг, всегда можно посмотреть историю изменений скрипта и так далее.
Маковский автоматизатор позволяет скрипт вызывать, так что часто употребляемые задачи можно и в контекстное меню добавить.DevFM Автор
09.06.2023 14:23Люблю диагнозы по интернету. Может, и моё видео из статьи Идеальный скрипт на bash тоже нагуглено на скорую руку?
В каком мире и куда bash перестали ставить, если в самых популярных дистрибутивах он всегда есть?
То есть я не знаю нюансы imagemagick, поэтому я не ликуксоид? Я не фоторедактор и решаю задачу, как умею. Мне не нужны ресайзы и прочее, нужно изменить формат фото, и всё. За софтину спасибо, посмотрю
И маковский автоматизатор на убунте не очень поможет
DevFM Автор
09.06.2023 14:23Я посмотрел другие статьи на этот счёт и они мне показались кривыми. Там либо рассуждения в стиле "линукс - это производительная и масштабируемая ОС", либо кривые примеры использования "если вот так хитро извернуться, то вот это вам понадобится"
Взял пример из того, с чем сталкивался вне программирования. Фотки с айфона в ТГ - вполне реальный пример, решил начать с него. Он мне тоже не кажется идеальным, но рассматривать на примере "найдём все фотки с заданной датой" выглядят куда более вымученными
ilitaiksperta
09.06.2023 14:23+12Если бы линукс-сообщество вместо рассказвания сказок какой линукс прекрасный, работало бы над тем чтобы его реально таким сделать, доля линукса на десктопе была бы сильно выше 1%.
Тема "Windows vs Linux" является частой причиной холиваров
Показательно что причина для холиваров именно "Windows vs Linux" , а не например "macOS vs Linux". Хотя бы даже сказал что холивары идут вообще по теме "Windows XP/7 vs Linux", потому что аргументы линуксоидов с тех пор вообще не изменились, хотя винда с тех пор кучу раз обновилась.
Легко поставить софт
Хорошее выструпление принято начинать с шутки, но с чего вы взяли что это относиться к статьям? Легко поставить софт - это drag & drop в папку с программами, клик по apk и кнопке "установить", или на худой конец пару раз нажать next в инсталляторе. А установка софта через безпомощный без сети ворох пакетных менеджеров, с депенденси хеллом и жуткими костылями типа флатпака и снапа, это почти самое сложное что есть. Сложнее только сборка руками из полуживых исходников. Куда правильне будет сказать, что линукс не справляется с установкой софта вообще.
Легко автоматизировать процессы
Вам за баш уже в кабину накидали. Хуже баша только писать скрипты на брейнфаке или на Си. Синтаксис типа
if [ $number -ge n ] then fi
можно придумать либо если ты кукухой едешь в дурку, либо если хочешь поиздеваться над людьми.Как видно из результатов, Linux среди разработчиков занимает очень весомые позиции.
Как видно из результатов, сумма профессиональных юзеров на графике - 136%.
Как вы пользуетесь Git? Интересно, что 84% разработчиков используют интерфейс командной строки. Не удивительно,
Не удивительно, потому что под линукс практически нет вменяемых GUI тулов для гита.
При этом можно пойти дальше, добавив алиасы для ещё большей скорости работы в терминале. В дополнение к стрелочкам, ctrl+R и tab у нас есть автозамены, они же alias. Писать git status слишком долго, проще написать gs.
Чего только не изобретают люди, чтобы продолжать использовать интерфейс из времен Брежнева не по назначению. Есть задачи для которых консольный интерфейс удобен, но гит к ним не относится. Знаете что надо делать в гуе, чтобы увидеть вывод git status? Ничего, вообще, оно само обновляется. Просто возьмите нормальный гуевый клиент и не мучайте себя. Ах, да, я забыл, под линукс же их забыли написать.
Завершить хотелось бы решением прикладной задачу: попробуем найти уникальные строки в большом файле. <... Далее идет де-факто программирование (но не на человеческих инструментах) , с какойто оптимизационной магией, чтобы вкурить которую ушло явно дольше 5 минут ...> В результате наших действий мы в десять раз сократили время получения уникальных строк в файле
Каждый день на работе такое делаю. Шучу, это задача для джунов на собесе, решается скриптом на питоне за 5 минут. И я думаю джунов, которые ее решают сортировкой, на работу не берут.
А можно заставить sort работать в однобайтовой кодировке
Ага, и удачи со строчками не из ascii символов.
Напоминает про часто поднимаемую тему 10x-разработчиков про десятикратную разницу между крутыми и посредственными разработчиками
Вы валите собеседование на джуна, але.
Вы не способны выбрать подходящий инструмент для решения задачи для джуна. Вы даже не способны решить ее корректно. Зато способны писать веселые статейки про прелести терминала. Очевидно, вам просто нравиться трахаться с консолькой. Т.е. вы даже не способны понять с кем надо трахаться.
Лол, это очень забавно.
randomsimplenumber
09.06.2023 14:23под линукс практически нет вменяемых GUI тулов для гита
Шта? О_о Недавно была статья на хабре, как раз про gui для git. Штук 10 навскидку, большинство кроссплатформенные. В каждом вменяемом IDE , кстати, тоже есть git client.
задача для джунов на собесе, решается скриптом на питоне за 5 минут
Через 5 минут, пока пишется скрипт, односторочник на баше уже отработал и забыт.
Синтаксис типа
if [ $number -ge n ] then fi
Вот синтаксис с отступами это удобно , да. :)
ilitaiksperta
09.06.2023 14:23+1Шта? О_о Недавно была статья на хабре, как раз про gui для git. Штук 10 навскидку, большинство кроссплатформенные
Большинство из них под винду и мак онли. Для линукса из вменяемых только проприетарные и платные сублим и смартгит.
В каждом вменяемом IDE , кстати, тоже есть git client.
Не все пишут строго под один стек.
Через 5 минут, пока пишется скрипт, односторочник на баше уже отработал и забыт.
В общем случае да, но именно на примере из статьи это не валидно. Автор явно не 5 минут потратил чтобы добиться вменяемой скорости работы на большом файле. За то время, которое у него решение в лоб выполняется можно успеть накидать говноскрипт, который в лоб работает быстрее оптимизированного однострочника.
Вот синтаксис с отступами это удобно
Явно удобнее чем шиза типа if fi или -ge
randomsimplenumber
09.06.2023 14:23Большинство из них под винду и мак онли.
Достаточно одного из 100500 оставшихся, который решает ваши задачи. Или ваши вкусы слишком специфичны? ;) Giteye неплох, например.gitkraken можно и бесплатно использовать, с ограничениями.
Автор явно не 5 минут потратил
Автор демонстрировал ;) Одноразовые задачи такого уровня должны решаться не думая.
ilitaiksperta
09.06.2023 14:23+2ваши вкусы слишком специфичны?
Да, мне нравится когда софт выглядит не вырвиглазно, удобен и работает быстро и без особых глюков.
Giteye
Вырвиглазная поделка на основе эклипса. Как "охеренно" работает эклипс я на практике знаю.
gitkraken
Тормозное, жрущее и глючное говно на электроне, почитайте отзывы из статьи на которую ссылаетесь.
100500 оставшихся
Кривые поделки, либо неудобные, либо с интерфейсом от вин98, либо и то и другое. Авторы которых даже не могут тупо взять дефолтный qt или gtk и лепят "красивый" кастомный дизайн, при том что им медведь на глаза наступил.
Или вот например есть простой, но юзабельный gitg, в котором какойто даун намертво захардкодил на всех цветовых схемах числа и строки ярко розовым цветом. Зачем? Что с этими людьми не так?
Автор демонстрировал
Ага, то что лучше не демонстрировать.
iig
09.06.2023 14:23Да, мне нравится когда софт выглядит не вырвиглазно, удобен и работает быстро и без особых глюков.
Это фантастика ;)
Если вы покажете свой любимый софт - вам 2 панамки накидают, и за его вырвиглазность, и за глючность. И за неудобство, само собой ;)
vasyakolobok77
09.06.2023 14:23+2Автор ветки комментариев говорил про гит-клиент в средах разработки. Для большинства ЯП могут подойти продукты от JetBrains, ну или VSCode. В них gui для git не выглядит вырвиглазно, хотя все вкусовщина это.
valrust
09.06.2023 14:23Синтаксис типа
if [ $number -ge n ] then fi
можно придумать либо если ты кукухой едешь в дурку, либо если хочешь поиздеваться над людьми.Вы забыли, что Bash это командный интерпретатор, а не язык программирования общего назначения и в нем нет True и False.
В приведённом примере
[
это не часть синтаксиса, а вполне обычная команда, такая же какcd
,pwd
,alias
и другие встроенные команды, просто у неё имя такое. Оставшаяся часть$number -ge n ]
это аргументы команды.Конечно еще нужно не забывать, что перед тем как выполнить команду
[
Bash вместо$number
подставит значение переменной с именемnumber
.laatoo
09.06.2023 14:23от этого знания синтаксис не стал удобнее
randomsimplenumber
09.06.2023 14:23А в чем неудобство то? Синтаксис работает, свои задачи решает. Расхождений с тем чтобы man bash написано, я не вижу. Достаточно просто запомнить, как это пишется.
valrust
09.06.2023 14:23+1Синтаксис простой:
if test-commands; then consequent-commands; else alternate-consequents; fi
Еще раз напомню, Bash - это командный интерпретатор.
test-commands
- любая команда: внешняя, внутрення. Если тестовая команда завершилась удачно (Exit Status = 0), то выполняем команду послеthen
, если тестовая команда завершилась с ошибкой (Exit Sttaux ≠ 0), то выполняем команду послеelse
. Это простой вариант, более точный синтаксис смотрите вman bash
.Пример
DWN=~/Downloads if ls ${DWN} &>/dev/null ; then xdg-open "${DWN}/$(ls -t -F -1 ${DWN} | grep -v '/$' | head -1)" 2>/dev/null else echo "No such file or directory: $DWN" ; fi
В этом примере тестовой командой является
ls
. Хотя это плохой пример, потому что существование пути лучше проверять встроенной командой[
или составной командой[[
. Но пример показывает, что дляif
используется команда как условие и он анализирует статус её завершения.laatoo
09.06.2023 14:23+1там выше ребята дали однострочник для выпрлнения той же задачи на powershell.
сравните читаемость и перестаньте писать ерунду про простой и удобный синтаксис
saboteur_kiev
09.06.2023 14:23Сравните операционные системы и перестаньте писать ерунду =)
laatoo
09.06.2023 14:23+1я сравниваю синтаксисы
saboteur_kiev
09.06.2023 14:23Тогда просто вопрос. Как работает ассоциация файлов в Виндовс и Линукс?
saboteur_kiev
09.06.2023 14:23+1Так грубо говоря, вы ругаетесь на отдельную программу, которая лежит в /usr/bin/[
а обвиняете именно баш.
vasyakolobok77
09.06.2023 14:23+1То что bash это интерпретатор команд это не оправдание для синтаксиса. Можно было сделать лучше и удобней, но увы нет. Посмотрите как МС реализовал PowerShell, по сути ЯП для написания скриптов автоматизации.
Nasreddin_Hodja
09.06.2023 14:23PowerShell появился в середине нулевых только, а bash появился в 89 и ему приходится сохранять некоторую совместимость с предшественниками.
Ну и под линуксами это не особо проблема, т.к. скрипты там можно писать не только на нём, да хоть на tcl, который с большой вероятностью уже присутствует в системе, как и питон.
valrust
09.06.2023 14:23+1Приведите примеры не нормальности синтаксиса Bash.
Когда сравниваете Bash и PowerShell учитывайте, что Bash был выпущен в 1989 году и он следует стандарту IEEE POSIX Shell and Tools, а PowerShell вышел 2006 году.
Nasreddin_Hodja
09.06.2023 14:23+1И ещё дополню:
Посмотрите как МС реализовал PowerShell, по сути ЯП для написания скриптов автоматизации.
Зря старались, способных написать что-то на PS всё равно меньше чем на баше ))
Да и всякую повседневную рутину типа отправить уведомление на email когда на удалённой страничке появится ключевое слово, на баше делается одной строчкой гораздо проще.
Nasreddin_Hodja
09.06.2023 14:23В приведённом примере
[
это не часть синтаксиса, а вполне обычная команда, такая же какcd
,pwd
,alias
и другие встроенные команды, просто у неё имя такое. Оставшаяся часть$number -ge n ]
это аргументы команды.Правда, насколько я знаю, современные реализации не дёргают команду
[
, а ради эффективности оно интерпретируется самим bash/dash. Аналогично с некоторыми другими командами, например printf.valrust
09.06.2023 14:23Так и есть
[
или она жеtest
- это встроенная команда Bash, для нее не запускается отдельный процесс.
DevFM Автор
09.06.2023 14:23менеджер пакетов apt вполне неплох. Проблемы есть везде
автоматизация всё ещё хороша, хотя и тоже не без проблем
сумма больше 100% из-за multichoice - можно было выбирать несколько ОС
GUI под линукс есть всякий разный, можно выбрать
многие вещи в терминале выполняются куда быстрее. Наверное, горячие клавиши вам тоже не нравятся, т.к. во времена Брежнева были изобретены?
смысл однострочника в том, что можно многие задачи решить очень быстро без необходимости непосредственно программировать
для не ascii символов моё решение будет корректно удалять дубликаты. И чем предлагаемый мной инструмент не корректен, по вашему мнению? Он решает задачу просто и элегантно
ilitaiksperta
09.06.2023 14:23apt вполне неплох.
Для пакетного менеджера да. Но как решение для установки софта пакетный менеджер в котором есть зависимости, это однозначно плохое решение. Не просто так за пределами линуксов оно практически нигде не используется.
Проблемы есть везде
В отличии от apt
GUI под линукс есть всякий разный, можно выбрать
Кроме качественного
многие вещи в терминале выполняются куда быстрее.
А какие-то даже удобнее, а какие-то вообще в гуе не сделаете. Но я нигде не утверждал что консоль говно, потому что она Брежнева помнит. Я ткнул вас в то, что вы сами пишете, что вам нужны костыли чтобы удобно ей пользоваться, а вы пытаетсь это подать как преимущество. В то время как уже десятилетия есть более удобные и подходящие инструменты для этой задачи.
смысл однострочника в том, что можно многие задачи решить очень быстро без необходимости непосредственно программировать
Вы прямо в вашем же примере показываете, что чтобы решить эту задачу приемлемо надо де-факто заниматься программированием
для не ascii символов моё решение будет корректно удалять дубликаты. И чем предлагаемый мной инструмент не корректен, по вашему мнению? Он решает задачу просто и элегантно
Вы сортируете 14 миллонов строк, для того чтобы решить задачу где сортированный список вообще не требуется. Говноскрипт на питоне решает эту задачу быстрее, как по времени его написания, так и времени выполнения. И его потом спокойно можно использовать в т.ч. в однострочниках. Для неascii я проверил, да, одинаковые строки оно корректно ставит рядом.
nivorbud
09.06.2023 14:23+3Всё от целей зависит. Мне как веб-разработчику конечно же удобней линукс. Когда среда разработки близка к целевой (на серверах я использую дебиан), это и удобно, и уменьшает вероятность неожиданных ошибок.
Что касается простоты. По мне сейчас действительно многие современные линуксы намного проще и в установке, и в настройке, чем винда.
Настройки через консоль и простые текстовые файлы по мне намного удобней и практичней, чем настройки через оконный интерфейс. Чтобы передать кому-нибудь (или применить чьи то) настройки, или чтобы задокументировать что-то, то намного удобнее это представлять в виде консольных команд (их можно просто копипастить себе в консоль). Это удобней, чем работать со скриншотами окон настроек.
Скопипастить несколько команд в консоль очень просто. Найти необходимые команды с необходимыми ключами в 99% случев можно мгновенно с помощью гугления (если правильно сформулировать запрос). И это всё плюсы консольной работы.
Еще момент. Надо стремиться пользоваться штатными инструментами. Если в системе есть пакетный менеджер, то надо пользоваться именно им по максимуму, а не компилировать скаченные программы вручную. Если в штатном репозитории нет нужного пакета, то у многих крупных производителей софта есть собственные репозитории - нужный репозиторий можно подключить и пользоваться штатным пакетным менеджером, как обычно.
Это в конце концов намного безопасней. Сейчас, когда в винде иногда приходится софт ставить, то прям дрожь берет, когда приходится запускать скаченный из инета инсталлятор. С маком похожая ситуация: сын тут же засрал аймак малварем, путем беспорядоченного скачивания и установок програмок и плагинов (к игрушкам и пр.). Пришлось с ним беседы проводить на эту тему (как источники проверять).Кстати, обратил внимание, что домохозяйкам, пенсионерам и пр., которым нужен по сути только браузер, почта, просмотор фоток и видео, им лучше всего заходит линукс типа минт или манджаро. Там работа напоминает работу со смартфоном: все обновления (системы и всех программ) осуществляются одной кнопкой (хотя даже с этим меня просили помочь - эту кнопку нажать :)), установка/удаления программ - из соответстующего упрощенного менеджера программ (тоже одной кнопкой). Вероятность подхватить вирус намного меньше (хотя на фишинг тоже попадают).
Что касается возникающих проблем и их исправления, то... с виндой и маком исправление проблем бывает не менее замороченным. Например рекомендация от производителя МФУ залезть в определенную ветку реестра и исправить там шестнадцатиричное значение какого-то ключа. Этот квест для обычного пользователя не проще, чем изменить настройку в простом текстовом файле в линуксе.
Теперь пару слов о простоте макоси, типа мышкой закинул или выкинул в корзину... Вот, к примеру, инструкция по полному удалению Java из системы:
sudo rm -rf /Library/PreferencePanes/JavaControlPanel.prefPane sudo rm -rf /Library/Internet\ Plug-Ins/JavaAppletPlugin.plugin sudo rm -rf /Library/LaunchAgents/com.oracle.java.Java-Updater.plist sudo rm -rf /Library/LaunchDaemons/com.oracle.java.Helper-Tool.plist sudo rm -rf /Library/Preferences/com.oracle.java.Helper-Tool.plist sudo rm -rf /System/Library/Frameworks/JavaVM.framework sudo rm -rf /var/db/receipts/com.oracle.jdk8u65.bom sudo rm -rf /var/db/receipts/com.oracle.jdk8u65.plist sudo rm -rf /var/db/receipts/com.oracle.jre.bom sudo rm -rf /var/db/receipts/com.oracle.jre.plist sudo rm -rf /var/root/Library/Preferences/com.oracle.javadeployment.plist sudo rm -rf ~/Library/Preferences/com.oracle.java.JavaAppletPlugin.plist sudo rm -rf ~/Library/Preferences/com.oracle.javadeployment.plist sudo rm -rf ~/.oracle_jre_usage
Весьма просто, да...
Это я к тому, что не надо сравнивать штатные случаи с нештатными. Установка в линуксе программ в обход пакетного менеджера - это нештатный случай, а нештатный случай непрост в любой системе.DevFM Автор
09.06.2023 14:23Спасибо, что поделились своим опытом. Многие пытаются сравнивать тёплое с мягким, совершенно не учитывая современные реалии - несмотря на то, что bash весьма не юзер-френдли, без него нынче разработчику очень и очень тяжело
MyraJKee
09.06.2023 14:23+2Непосредственно для разработки линух мне очень нравится. Но к сожалению работа != разработка.
Например с каких-то пор у меня не работает anyconnect для cisco. Недавно начались проблемы с kmail + ews, пришлось устанавливать evolution, который тоже работает не идеально. И т.д. постоянно происходит какая-нибудь фигня, которую неважно прям превозмогать.
Semigradsky
09.06.2023 14:23+2Чтобы не было холиваров - ставим Windows и включаем WSL. Красота)
khajiit
09.06.2023 14:23А как ее снепшотить? Как загрузиться со снепшота, если основная конфигурация полетела? )
selivanov_pavel
09.06.2023 14:23+1Пока не приходилось, но вроде как-то так:
wsl --export --vhd <Distribution Name> <FileName> wsl --import --vhd <Distribution Name> <InstallLocation> <FileName>
Можно без
--vhd
, тогда будет tar вместо дискового образа.khajiit
09.06.2023 14:23Спасибо, но, не отрицая пользы вашего коммента, вопрос таки был про винду =)
slonopotamus
09.06.2023 14:23Засунули винду в виртуалку, сняли с виртуалки снапшот.
khajiit
09.06.2023 14:23+1Двойная виртуализация, однако, выйдет, если нужен докер или производительная ФС. Ну и исходному комменту это противоречит )
А так да.slonopotamus
09.06.2023 14:23+2Если вам нужна производительная ФС, винду придётся вычеркнуть из схемы.
khajiit
09.06.2023 14:23Несомненно! Вот zfs для каджита — достаточно произодительная ФС. Но вопрос-то был не к вам )
DevFM Автор
09.06.2023 14:23Очень боюсь, что винда в части WSL пойдёт по пути EEE - Embrace, extend, and extinguish. Когда значительная часть разработчиков будут пробовать линукс через WSL, MS вполне может делать свои, несовместимые красивые штуки. Условно, вместо bash будет предлагать аналог powershell, несовместимый с линуксом. И те, кто живут в WSL-мире, не смогут жить в линукс-мире
para9mm
09.06.2023 14:23+6Херь полная и притянутая за уши, с таким же успехом можно работать с командной строкой вообще без оболочки а еще лучше в чистом двоично коде без костылей.
Самое большое достижение софта - возможность реализовать профессиональные потребности БЕЗ навыков программирования.
А сам линукс имеет такую кучу глюков и косяков которые уже не годами - десятилетиями кочуют от релиза к релизу что подумать страшноDevFM Автор
09.06.2023 14:23Движ типа no-code раз в десять лет приходит и успешно загибается. Конкретно bash с нами 30 лет и не видно, чтобы набирала популярность какая-то альтернатива. Я очень удивлён, что более user-friendly терминалы не могут набрать критическую массу пользователей - вероятно, таки bash не настолько плох, чтобы мотивировать куда-то переходить
randomsimplenumber
09.06.2023 14:23+1более user-friendly терминалы не могут набрать критическую массу пользователей
Терминал - это программа, внутри которой запускается bash.
bash не настолько плох
Любой инструмент достаточно хорош в своей области. Говорят, zsh лучше. Но переучиваться я ниасилил.
DevFM Автор
09.06.2023 14:23В среднем, не понимаю терминологических споров на пустом месте. А терминал - это устройство. Программа, о которой говорите вы - это эмулятор терминала.
Не вижу смысла разводить демагогию bash vs shell vs terminal
randomsimplenumber
09.06.2023 14:23не понимаю терминологических споров на пустом месте
Как же в клубе зануд без председателя;)
Ну и неплохо, когда все пользуются общей терминологией.кмк, gnome-terminal достаточно user friendly.
DevFM Автор
09.06.2023 14:23+1Да, общая терминология - это важно во многих случаях. Конкретно эта троица так друг в друга проросла, что вот линейка "вы запускаете GUI terminal emulator, оно запускает shell, который обычно bash как конкретная реализация шелла" в среднем неважна. В плане, на GUI обычно плевать (ну, вот я использую terminator, но я оттуда юзаю infinite scroll, цвет, split screen, вроде всё). Дальше, те, кто знаком с не-bash шеллами, понимают, о чём речь при вопросе bash vs shell. Для остальных это всё терминал и всё
valrust
09.06.2023 14:23+2Не вижу смысла разводить демагогию bash vs shell vs terminal
В том то и дело, что terminal и shell в мире Unix это разные вещи.
Хотелось бы в статье видеть употребление правильных терминов. Эти термины существуют уже несколько десятков лет и даже определены стандартами POSIX.
Если интересно в чем различие между termina, pseudoterminal, console, virtual console, terminal emulator, shell, то рекомендую статью "Hello, World! Глубокое погружение в Терминалы".
А что касается bash, то это конкретная реализация shell. Так же и zsh - это тоже реализация shell.
DevFM Автор
09.06.2023 14:23Спасибо за статью. Всегда искал, куда людей про TTY тыкать, т.к. на пальцах я только на уровне "ну, это такое устройство псевдо-файл и он есть по историческим причинам" могу объяснить
GBR-613
09.06.2023 14:23+3Во-первых, стоило бы отметить, что примеры команд - не для Linux вообще, а для Ubuntu/Debian.
Во-вторых, терминал с довольно продвинутым языком уже давно существует и для Windows: PowerShell. Кстати, с можно и по SSH подключиться к удалённому Windows и работать с PowerShell.
В-третьих. GUI учить не нужно: он для этого и предназначен, чтобы его можно было не учить, и так все будет понятно. А вот shell это фактически язык программирования. Может, уж лучше выучить Python, который и на Windows так же хорош?
Единственным серьёзным фактором является то, что есть программы, которые на Windows есть, а на Linux нет, и наоборот. Или есть аналоги, но слишком убогие. Или на одной из них они работают гораздо хуже, чем на другой. Скажем, есть библиотеки Python, которые на Windows не поддерживаются. И тутужевопрос будет - что Вам нужно для работы. Или в дело вмешивается политика, как сейчас с импортозамещением.
Если Вы делаете Docker images, то тут всё понятно, потому что Docker это фактически Linux, и тогда уж лучше с самого начала на Linux работать.
DevFM Автор
09.06.2023 14:23Подскажите, где именно я предлагаю не POSIX-решение?
GUI приходится учить. Любая сложная программа требует времени на освоение. А потом меняет интерфейс и всё по новой. Даже word редизайнился уже столько раз, что грустно об этом говорить. А сила bash в том, что приобретённые знания будут с вами десятки лет. Это, конечно, тянет назад огромным количеством легаси. Но для других языков, вы к курсе, через 10 лет уже не запустить свои наработки - в языках всё меняется
А docker для backend dev / datascience насколько сейчас глубоко врос, как и гит. Не знаю, где посмотреть свежую аналитику, но docker уже давно в backend developer roadmap и в 50%+ вакансий
piton369
Приглашаю к обсуждению. Кто как ставит пакеты с зависимостями, если на устройстве нет интернета, а зависимостей или много или неизвестное количество?
Vitaly83vvp
И в дополнение: как запустить программу, если на устройстве нет интернета, а требуемых .DLL нет и они не поставляются с инсталлятором.
DevFM Автор
Я делаю так
apt-get install --download-only # на машине с инетом
Копирую из /var/cache/apt/archives пакеты на другую машину, и простым apt-get ставлю на ней. Она проверяет пакеты в кэше и ставит оттуда
Работает отлично, если машина с инетом и машина без инета одинаковые. Если на машине с инетом какие-то пакеты уже стоят, они не скачаются в кэш
khajiit
Можно загрузить все пакеты с зависимостями, хоть сразу на флешку
https://stackoverflow.com/questions/13756800/how-to-download-all-dependencies-and-packages-to-directory
dbax
А как на Windows поставить программу, если нет интернета?
dyadyaSerezha
А если нет Windows, да и компьютера тоже нет? А поставить хочется.