Тема "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 флаги обеспечивают такое визуальное представление:

git log example
Пример вывода настроенного 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?)

Основная ОС
Основная ОС разработчика по опросу Stackoverflow developer survey

Как видно из результатов, Linux среди разработчиков занимает очень весомые позиции.

Как вы пользуетесь Git? В вопросе системы контроля версий в общем виде, но 97% используют git. (How do you interact with your version control system? Select all that apply.)

VCS by type
Как разработчики используют git

Интересно, что 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)


  1. piton369
    09.06.2023 14:23
    +4

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


    1. Vitaly83vvp
      09.06.2023 14:23
      +6

      И в дополнение: как запустить программу, если на устройстве нет интернета, а требуемых .DLL нет и они не поставляются с инсталлятором.


    1. DevFM Автор
      09.06.2023 14:23
      +20

      Я делаю так

      apt-get install --download-only # на машине с инетом

      Копирую из /var/cache/apt/archives пакеты на другую машину, и простым apt-get ставлю на ней. Она проверяет пакеты в кэше и ставит оттуда

      Работает отлично, если машина с инетом и машина без инета одинаковые. Если на машине с инетом какие-то пакеты уже стоят, они не скачаются в кэш


      1. khajiit
        09.06.2023 14:23
        +2

        Можно загрузить все пакеты с зависимостями, хоть сразу на флешку
        https://stackoverflow.com/questions/13756800/how-to-download-all-dependencies-and-packages-to-directory


    1. dbax
      09.06.2023 14:23

      А как на Windows поставить программу, если нет интернета?


      1. dyadyaSerezha
        09.06.2023 14:23

        А если нет Windows, да и компьютера тоже нет? А поставить хочется.


  1. Vitaly83vvp
    09.06.2023 14:23
    -2

    Можно ещё отимизировать:

    "sort | uniq" => "sort -u"


    1. DevFM Автор
      09.06.2023 14:23
      +5

      sort -u эквивалентен sort --unique. И занятно, что он медленнее, чем sort | uniq, об этом написано


  1. laatoo
    09.06.2023 14:23
    +28

    я говорю на двух, а код пишу на 2 языках + всякие "побочные" синтаксисы.

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

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

    линукс и вся экосистема вокруг – всратое.


    1. DevFM Автор
      09.06.2023 14:23
      +2

      Местами bash ужасен, да. К сожалению, адекватных общепринятых альтернатив нет :(


      1. sepetov
        09.06.2023 14:23
        +4

        В моих случаях на работе удаётся просто писать скрипты на php или python, добавив в начало что-то типа #!/usr/bin/php, ну а потом chmod +x.

        Для каких-то случаев это не сработает, видимо?


        1. laatoo
          09.06.2023 14:23
          +2

          как открыть последный загруженный в ~/Downloads файл ассоциированной программой?

          желательно, чтобы закрыв терминал программа с файлом не закрывалась


          1. sepetov
            09.06.2023 14:23

            Да, контр-пример хороший. Навскидку придумываю способ, которого лучше бы не было: scandir() даст список файлов, stat() позволит получить дату любого из этих файлов не открывая файловый дескриптор, а вот дальше - беда, без поисковика не придумать.


            1. laatoo
              09.06.2023 14:23
              +1

              я часа полтора ковырялся с башом и сдался. открываю руками)


              1. sepetov
                09.06.2023 14:23

                Это боль! Вы правы. Приходится совмещать разные инструменты: где-то я всё же использую bash, но при каждой возможности соскакиваю на какой-нибудь другой скриптовый из имеющихся.


              1. 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, то можно будет открывать по последнему файлу из каждого переданного пути.


                1. randomsimplenumber
                  09.06.2023 14:23
                  +3

                  Какой то слишком громоздкий односторочник получился ;)


            1. Kergan88
              09.06.2023 14:23
              +11

              в ps делается в одну строчку весьма очевидным способом:

              Get-ChildItem ~/Downloads -File | Sort-Object -Property CreationTime -Descending | Select-Object -First 1 | Invoke-Item

              чот прям удивлен, что в линуксе с такой задачкей проблемы оО


              1. nronnie
                09.06.2023 14:23
                +3

                Исчерпал лимит плюсов, поэтому не могу поставить. Очень демонстрирует круть PowerShell - пайпы линукса это, конечно, хорошо, для своего времени это была невероятно крутая идея. Но. Они текстовые, у каждого приложения свой какой-то формат, который еще надо разбирать (а очень редко, но бывает, что это вообще невозможно). Пайпы PowerShell это уже другой уровень, потому что это объекты, к которым уже можно обращаться по всем свойствам и методам которые у них есть


                1. Kergan88
                  09.06.2023 14:23

                  Пайпы PowerShell это уже другой уровень, потому что это объекты, к которым уже можно обращаться по всем свойствам и методам которые у них есть

                  И ни каких проблем, как у человека ниже со слешами - потому что Invoke-Itemприменяется именно к объекту файла, а не к строке с путем)


              1. valrust
                09.06.2023 14:23

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


                1. saboteur_kiev
                  09.06.2023 14:23

                  проблема именно в Линукс, а не в баш


                  1. khajiit
                    09.06.2023 14:23

                    То есть, если на виндовом cmd проблема так же не решается, то проблема в Windows.
                    И что-то каджит не видит решений на cmd…


                    1. saboteur_kiev
                      09.06.2023 14:23

                      Моя претензия в первую очередь относится к "ассоциации", что является частью самого ядра Виндовс, но не является частью Линукс.


                      1. khajiit
                        09.06.2023 14:23

                        И в этом вы таки ошибаетесь.
                        Если вы переразбивали системный диск любой утилитой, умеющей выполнять операции во время перезагрузки — то вы видели как работает настоящая консольная винда. И хоть в это время кусты реестра загружены в память, механизмы, отвечающие за обработку ассоциаций — юзерспейсные, и будут загружены сильно позже.
                        Как, внезапно, и xdg.


              1. laatoo
                09.06.2023 14:23

                ps 1:0 bash


              1. saboteur_kiev
                09.06.2023 14:23

                Потому что люди пытаются делать вещи, которые архитектурно в линуксе не сделаны. А придираются к bash

                Поставьте баш на винду, и сделайте
                eval $(ls -lt ~/Downloads | head -n1)


              1. DevFM Автор
                09.06.2023 14:23
                +1

                Объекты имеют свои плюсы и минусы. Во-первых, адекватно их смогли реализовать в PowerShell лет этак 20 после релиза bash. Во-вторых, у объектов несколько ограниченная область применения. Сила конвейера bash в том, что всё текст. Я могу любые команды с любыми состыковывать. Я одинаково могу работать как с выводом ls, так и с сохранёнными в файле путями. Я могу написать какую угодно программу, и с помощью cut в её выводе брать нужное. В этом и сила bash, и его слабость


          1. DevFM Автор
            09.06.2023 14:23
            +13

            nohup xdg-open `find ~/Downloads/* -printf '%T+ %p\n' | sort -r | head -n1 | cut -d ' ' -f2 -`

            nohup - чтобы отвязать от терминала

            xdg-open - открывает ассоциированную программу. Дальше один аргумент в обратных кавычках, чтобы стать путём для xdg-open

            find ищет в заданном каталоге все файлы и выводит дату модификации

            sort - сортирует

            head - выводит первый, в нашем случае самый свежий файл

            cut - оставляет только имя файла, в таком виде устойчиво к пробелам внутри


            1. 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
              


              1. garwall
                09.06.2023 14:23

                nohup xdg-open $(find ~/Downloads/* -printf '%T+ %p\n' | sort -r | head -n1 | cut -d ' ' -f2 -) ?


                1. laatoo
                  09.06.2023 14:23
                  +3

                  вы, ребят, у себя потестируйте, пожалуйста, а там если что - я никуда не пропаду :)


              1. DevFM Автор
                09.06.2023 14:23
                +4

                Прошу прощения, хабр скушал обратные кавычки, которые стоят вокруг find

                nohup xdg-open `find ~/Downloads/* -printf '%T+ %p\n' | sort -r | head -n1 | cut -d ' ' -f2 -`


                1. 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'

                  чудесные удобные линуксовые однострочники для автоматизации повседневной рутины во всей красе


                  1. DevFM Автор
                    09.06.2023 14:23
                    +3

                    В имени файла не может быть слеша, это будет подкаталог. Добавил два фикса: двойные кавычки поверх обратных (да-да, в баше экранирование - ад) и минус после двойки, чтобы взять все компоненты, несмотря на пробелы. У меня запустилось с кирилицей и пробелами, файл со слешом создать не могу

                    nohup xdg-open "`find ~/Downloads/* -printf '%T+ %p\n' | sort -r | head -n1 | cut -d ' ' -f2- -`"


                    1. laatoo
                      09.06.2023 14:23
                      -1

                      В имени файла не может быть слеша, это будет подкаталог

                      :)

                      может это какой-то мнемонический слэш?

                      вот base64-encoded название файла:

                      0J/QsNGB0YLRg9GF0L7QstGB0LrQuNC1INGH0LXRgtCy0LXRgNCz0Lgg4qe4INCS0LvQsNC00LjQvNC40YAg0J/QsNGB0YLRg9GF0L7Qsu+8iiDQuCDQkNC70LXQutGB0LXQuSDQktC10L3QtdC00LjQutGC0L7Qsu+8iu+8iiDip7jip7ggMDguMDYuMjAyMyBba0VRaExvaHRqUFVdLm00YQ==


                      1. DevFM Автор
                        09.06.2023 14:23
                        +1

                        Какая прелесть, мне такое не даёт создать

                        Возможно, где-то (типа в винде или маке) такой файл создать можно, поэтому чисто технически он может существовать. Я думал, что POSIX запрещает слеш в имени, видимо, не шарю...


                      1. laatoo
                        09.06.2023 14:23

                        таки да, это другой utf8 символ.

                        ⧸ - U+29F8

                        / - U+002F


                      1. laatoo
                        09.06.2023 14:23
                        -1

                        диакритический, а не мнемонический, конечно же *


                    1. 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
                      


                      1. DevFM Автор
                        09.06.2023 14:23
                        +1

                        Просто nonup в начало, дополнил


                      1. laatoo
                        09.06.2023 14:23

                        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'
                        

                        теперь создаётся ненужный файл nohup.out


                      1. DevFM Автор
                        09.06.2023 14:23

                        Дааа, давненько я nonup не ковырял. Там куча нюансов. Чтобы nohup.out не создавался, надо перенаправлять с помощью >&

                        nohup xdg-open "`find ~/Downloads/* -printf '%T+ %p\n' | sort -r | head -n1 | cut -d ' ' -f2- -`" >& /dev/null


                      1. 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"


                      1. saboteur_kiev
                        09.06.2023 14:23

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

                        Я вот считаю себя спецом по баш, но у меня гуишного линукса под рукой никогда не было, чтобы тестить подобные вещи.


                      1. 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


                      1. sswwssww
                        09.06.2023 14:23

                        Создал алиас, а если мне нужно ещё для 5 директорий такое вытворять? Не создавать же 5 алиасов с разными директориями... Как можно динамически передавать путь?


                      1. AlexGluck
                        09.06.2023 14:23

                        alias 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


                      1. sswwssww
                        09.06.2023 14:23

                        Благодарю!


                      1. DevFM Автор
                        09.06.2023 14:23

                        Выбор имени для алиаса очень хорош, улыбнуло)

                        Кстати, вы привели хороший пример, где ещё в bash беды - конструкции вроде ${1:-~/Downloads} не читаемые и контринтуитивные


                      1. saboteur_kiev
                        09.06.2023 14:23

                        я все-таки не очень понимаю, зачем нужен нохап, и как он повлияет на открытое гуишное приложение, если закрыть терминал. IMHO он излишний


                      1. DevFM Автор
                        09.06.2023 14:23

                        Если просто открыть приложение типа gedit 1.txt, то при закрытии терминала приложение будет закрыто. В справке по xdg-open ничего не сказано, что оно работает по-другому. Но, судя по всему, работает по-другому :) т.е. с xdg-open действительно nohup не обязателен, т.к. открытое приложение оказывается отвязанным от терминала.

                        Правда, вывод приложения будет сыпаться в консоль и мешать. Но тут, наверное, хватит перенаправления. Я ещё поковыряю вопрос


                      1. valrust
                        09.06.2023 14:23

                        Я ещё поковыряю вопрос

                        Посмотрите код самой команды xdg-open :-)


                      1. saboteur_kiev
                        09.06.2023 14:23

                        Нужно просто понимать что именно делает nohup на архитектурном уровне.
                        он
                        1. игнорирует сигнал nohup
                        2. Перенаправляет stdout и stderr (если они еще не перенаправлены) в файл nohup.out

                        многие приложения сами по себе умеют игнорировать sighup
                        опять таки нужно понимать архитектуру линукс и что такое сигналы.

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


                      1. DevFM Автор
                        09.06.2023 14:23

                        Блин, точно. По поведению nohup ещё в студенческие годы десять лет назад я ошибочно решил, что оно делает отвязку от родительского процесса, что-то вроде double fork для создания процесса-демона. Был не прав, блокируется сигнал о потере управляющего терминала


                    1. RranAmaru
                      09.06.2023 14:23

                      ls -t ~/Downloads | head -n1 вместо find и т.д. разве не сработает?


                      1. DevFM Автор
                        09.06.2023 14:23

                        Будет, но не рекурсивно. То есть если надо смотреть в подкаталоги, то понадобится find


                      1. valrust
                        09.06.2023 14:23

                        Иногда вместо файла может быть каталог с последним изменением, но с этим можно поработать.

                        xdg-open ~/Downloads/"$(ls -1 -F -t ~/Downloads/ | grep -v '/$' | head -1)" 2>/dev/null


                      1. saboteur_kiev
                        09.06.2023 14:23

                        Мой вариант с финд

                        xdg-open "$(find . -printf "%Cs %p\n"|sort -k1|tail -n1|cut -d' ' -f2-)"


                    1. VADemon
                      09.06.2023 14:23
                      +1

                      backtick - устаревший и костыльный синтаксис, используйте "$()", который кавычки внутри по-человечески обрабатывает.

                      @laatooкамрад толсто тонко потроллил.


                      1. DevFM Автор
                        09.06.2023 14:23
                        +1

                        Всегда юзал `` или $() как синонимы в случайном порядке. Благодаря вам загуглил и теперь знаю, что лучше юзать $()

                        1. экранирование внутри `` крипое

                        2. вложенные подвызовы в $() проще, т.к. не требуют экранирования

                        А ещё хабрапарсер не ест $(), но удаляет обратные кавычки)


                      1. valrust
                        09.06.2023 14:23

                        Благодаря вам загуглил и теперь знаю, что лучше юзать $()

                        Такие знания лучше не гуглить, а получать из официальной документации man bash раздел Command Substitution или из соответствующего раздела Bash Reference Manual.


                      1. saboteur_kiev
                        09.06.2023 14:23

                        проще гуглить правильные термины. Называется это command substitution
                        `` в принципе не поддерживает вложенность, поэтому $() предпочтительнее
                        $() легче читать чем ``, особенно учитывая что может встретиться дурацкий шрифт, где разница между кавычками будет плохо видна.

                        `` не является депрекейтед, и учитывая строгость обратной совместимости, которую обеспечивает POSIX, они всегда будут работать но уже наверное лет 10-15 все рекомендации говорят о том, что надо юзать $()


            1. VT100
              09.06.2023 14:23

              У меня что-то тоже с нохапом грабли при запуске анализатора Saleae:

              >s@s:~$ nohup ./Logic-2.3.56-master.AppImage
              nohup: ввод игнорируется, вывод добавляется в 'nohup.out'

              Потом - "интерпретатор занят выполнением команды".

              И редактор каментов стал всратый...


              1. DevFM Автор
                09.06.2023 14:23
                +1

                можно попробовать ещё в фон увести, добавив в конец амперсанд

                nohup ./Logic-2.3.56-master.AppImage &

                с редактором тут вообще беда. У меня на половине сниппетов кода подсветка не работает. Причём в редакторе она работает, выбран язык и всё хорошо. Но в самой статье не работает...


            1. saboteur_kiev
              09.06.2023 14:23

              Если прямо в ~/Downloads без подкаталогов, то можно упростить до:

              xdg-open $(sort -1t ~/Downloads|head -n1)


              1. laatoo
                09.06.2023 14:23

                too@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.
                

                ой да господи, уже не смешно, ребятки


                1. DevFM Автор
                  09.06.2023 14:23

                  А в чём вопрос? Товарищ использует неклассический sort (вроде solaris), у которого есть флаг -1. В его мире такой флаг есть


                  1. saboteur_kiev
                    09.06.2023 14:23

                    обычный линукс Ubuntu, похоже это у топикстартера что-то нестандартное


                    1. DevFM Автор
                      09.06.2023 14:23

                      ubuntu 18.04, kernel 4.16, sort -1 нет


              1. DevFM Автор
                09.06.2023 14:23

                А о какой ОС речь? Флаг -1 у sort есть не везде. Нашёл такой для solaris


          1. 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]*\ //'`"


          1. 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: уже после того как написал свой вариант увидел что выше уже предложили похожие варианты ))


          1. iig
            09.06.2023 14:23
            +2

            как открыть последный загруженный в ~/Downloads файл ассоциированной программой?

            Отличный пример криво поставленной задачи, которую программист сразу бросился криво решать ;) Обычно когда мне предлагают запилить чего-то странного, я задаю 1 уточняющий вопрос: "зачем это нужно?". Если ответа нет - решать задачу не нужно.

            Поясняю. В Downloads файлы обычно попадают из броузера. Броузер уже умеет открывать скачанные файлы. Открывать файлы из консоли таким образом бессмысленно. Во первых, если скачивается >1 файл - неизвестно, который скачается последним. Во вторых, если скачивается большой файл, лиса, например, создает 2 файла - пустой (его открывать бессмыссленно), и файл докачки (его тоже открывать бессмыссленно). Нужно сначала делать синхронизацию с броузером.


            1. 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

              итп

              скачать подкаст с ютубчика в аудио и открыть в плеере как будет готово, пока я завариваю кофе

              скачать серию/лекцию и открыть как будет готово, пока я начинаю мыть посуду

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


              1. randomsimplenumber
                09.06.2023 14:23
                +1

                Костыли и велосипеды наше всё;)

                man этот ваш yt-dlp. Особенно опция --exec. И не надо никаких странных скриптов с поисками и сортировками.


                1. laatoo
                  09.06.2023 14:23

                  для aria2c, wget, итп?

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

                  а потом ждать пока в очередной мажорной версии изменят --exec на --then-execute?

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

                  не бесите, вы не правы


                  1. randomsimplenumber
                    09.06.2023 14:23
                    +1

                    aria2c, wget, итп

                    man bash /alias

                    положат в заранее известную мне папку

                    Нет. Положат в текущую папку. Поэтому нужно не забывать делать cd куда надо, чтобы костыль работал. Автоматизация,хе-хе.

                    странным скрипт выглядит только в баше

                    Странный алгоритм выглядит странно на любом языке;)

                    Штош, людям нравится придумывать проблемы, не очень удачно их решать, а виноваты в этом bash и Торвальдс;)


                    1. laatoo
                      09.06.2023 14:23

                      Нет. Положат в текущую папку. Поэтому нужно не забывать делать cd куда надо, чтобы костыль работал. Автоматизация,хе-хе.

                      ну у вас в текущую, я в конфигах на уровне системы/алиасах (если иначе никак) указываю куда складывать. в 99% случаев мне нужно чтобы скачиваемый файл был в ~/Downloads, а не в текущей папке. мне так удобно

                      Странный алгоритм выглядит странно на любом языке;)

                      там где-то выше в комментах то же самое, но на powershell.

                      гляньте ради любопытства, увидите что скрипт можно читать, а не парсить. и вот в уродстве и нечитабельности баша в виноваты bash и Торвальдс :)

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

                      хорошего вам дня! :)


                      1. randomsimplenumber
                        09.06.2023 14:23

                        инструмент, инструмент, к сожалению, дерьмовый.

                        Тут демократия, в смысле open source. Либо за этот инструмент проголосовало большинство, и он им достаточно удобный,либо вы таки забиваете шурупы топором ;)

                        Раз уже упоролись делать alias'ы - можно сделать ещё полшага и сделать нормально.

                        Вот вам ещё намек: вы ссылки для yt-dl откуда берете?


                      1. DevFM Автор
                        09.06.2023 14:23

                        Справедливости ради, распространённость != удобность. Bash везде не потому, что он хорош. Тут самоподдерживающаяся система - везде был bash, поэтому много людей знаю bash и считают его нормой, пишут софт в предположении, что bash есть. Поэтому если я напишу софт для не-bash, то он не запустится

                        А вообще у нас Стокгольмский синдром, и это нормально. После года с bash он уже кажется приемлемым


                      1. iig
                        09.06.2023 14:23

                        Когда начинает казаться что bash плох - пробуем написать что-то подобное но на cmd ;)


                      1. 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.


                      1. AlexGluck
                        09.06.2023 14:23

                        То есть если писать по стандарту 50 летней давности POSIX shell совместимые скрипты, оно хуже объектной работы в powershell? А то что даже 15 лет назад повершелл был с некоторыми недостатками и работать с ним можно стало только в 2010 с версии 6?


                      1. saboteur_kiev
                        09.06.2023 14:23

                        То есть если писать по стандарту 50 летней давности POSIX shell совместимые скрипты

                        СТандарту поиск около 30 лет, и он описывает не стандарт для шелл скриптов, а стандарты архитектуры операционных систем.

                        При этом тот же МакОС сертифицирован с POSIX, а линукс всего лишь совместим


                      1. saboteur_kiev
                        09.06.2023 14:23

                        Bourne Shell это уже продвинутая оболочка, котрую сделал Стивен Борн, изначально первый sh делал еще Кен Томпсон.
                        А bash (bourne again) сделан уже совсем другим автором.

                        Кроме того, прикол еще в том, что стандарт POSIX появился ближе к 90м, к котому потом подвели уже все шеллы.

                        Сейчас баш один из самых популярных, но кроме него полно легковесных sh и dash в разных облачных виртуалках и контейнерах.
                        Плюс zsh который летит впереди всех.


                        А еще 10 лет назад в всяких "хакерских" дистрибутивах был популярен korn sh (ksh)


                1. DevFM Автор
                  09.06.2023 14:23

                  Далеко не у каждой команды есть флаг --exec. Предлагаемый конвейер работает для любого входного каталога, и в этом его сила


              1. iig
                09.06.2023 14:23

                я все утилиты аля yt-dlp настраиваю

                s/настраиваю/ниасилил настроить/ ;)

                Сама концепция того чего вы хотите странная и состоит в основном из исключений из себя же. Вот допустим, запустил я скачиваться серию My Little pony, учебный фильм с Сашей Серовой, и ушел мыть посуду. Приходят гости, и Саша скачивается первой. Конфуз. Или просто что-то скачалось и запустилось во время zoom-конференции.

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

                Ну и инструмент вы взяли не тот. bash хорош для запуска других программ. Для обработки строк он не подходит. Разве что есть желание превозмогать. Нужно что-то делать со строками - берите python, простое правило, легко запомнить ;)


                1. laatoo
                  09.06.2023 14:23

                  и задача не та, и инструмент не тот ????

                  а баш он прекрасен, просто он для чего то другого, а не для того, что нужно ????????

                  я уже все настроил и доволен, отстаньте, баш все равно останется дерьмом которым является сейчас )


          1. saboteur_kiev
            09.06.2023 14:23

            Архитектура Линукс не подразумевает ассоциаций с программами.

            Если GUI умеет это делать, то это фича GUI, а не операционной системы. Следовательно баш и не знает в ассоциации.

            Ну а найти последний загруженный файл ls -1t ~Downloads|head -n1


            1. laatoo
              09.06.2023 14:23

              xdg-open меня вполне устраивает, причем тут архитектура линукс.

              то что из вывода ls -1t ~Downloads|head -n1 нужно какими-то костылями передавать путь файла на вход xdg-open, при этом обходя разложенные грабли с пробелами в имени, спецсимволами итп - вопрос уже архитектуры линукса, баша, шелла, хоть линуса лично, мне плевать: я не виноватого ищу, а констатирую факт.

              это - дерьмо. смешно и нелепо спотыкаться о пробел/спецсимвол в имени файла в 2023 году.

              защищать это - ещё смешнее и нелепее.


              1. 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>

                Упс.


                1. laatoo
                  09.06.2023 14:23

                  PS: читается, поддерживается, понятно

                  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

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

                  И вам хорошего дня :)


                  1. khajiit
                    09.06.2023 14:23

                    Этот отвечал на аргумент не о синтаксисе, а о пробелах, если вы не заметили.
                    Будьте внимательнее, не будьте сиримэ )


                    1. laatoo
                      09.06.2023 14:23

                      Get-ChildItem ~/Downloads -File | Sort-Object -Property CreationTime -Descending | Select-Object -First 1 | Invoke-Item

                      я не вижу в однострочнике проблемы с пробелами и попытки её решить.

                      потому что её нет.


                      1. khajiit
                        09.06.2023 14:23

                        А каджит уже все показал 4 коммента вверх по ветке, но вы таки упорствуете в бытие сиримэ.


                      1. 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>


                      1. iig
                        09.06.2023 14:23

                        Как насчет

                        /tmp/какая-то директория с "кавычками"/файл с 'кавычками'.txt

                        ;)


                      1. Nasreddin_Hodja
                        09.06.2023 14:23

                        find /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>


                      1. valrust
                        09.06.2023 14:23

                        Можно без while

                        find /tmp -type f -name '*.txt' 2>/dev/null -print0 | xargs -0 stat --printf '%Y <%n>\n'


                      1. AlexGluck
                        09.06.2023 14:23

                        Испортили мой комментарий(


        1. DevFM Автор
          09.06.2023 14:23
          +1

          Скрипты на python являются хорошей альтернативой. Но у питона куча нюансов - есть зависимость от версии интерпретатора, от библиотек, от положения луны. С точки зрения скриптов стабильность bash куда лучше. Правда, обработка ошибок - это ад адский, ситуации вроде "обновление драйвера принтера снесло всю систему" случаются


          1. Alexey2005
            09.06.2023 14:23
            +2

            Самый адский ад в Bash — это то, как оно работает со строками (подстановка, объединение и подобное). Как ни экранируй, а всё равно найдётся такая комбинация символов в путях/именах файлов и содержимом переменных окружения, которая сломает скрипт.


            1. DevFM Автор
              09.06.2023 14:23

              Грустный факт. Не знаю, почему до сих пор не предложили решения


            1. M_AJ
              09.06.2023 14:23

              А еще он может сломаться на кириллице, если соответствующая локаль не установлена в системе.


      1. lorc
        09.06.2023 14:23

        python же. Все что имеет больше одного `if`/`for`/`case` лучше писать на пайтоне.


        1. DevFM Автор
          09.06.2023 14:23
          +1

          Да, на питоне куда приятнее. Однако тут тоже есть свои проблемы - версия интерпретатора, библиотеки, взаимодействие с операционной системой. Это негативно влияет на переносимость, баш тут надёжнее. Но писать неприятнее

          А всякие однострочники - вот это сильная сторона bash


          1. Alexey2005
            09.06.2023 14:23
            +1

            Perl. Он есть везде, даже в Busybox, и работает везде одинаково. Для однострочников идеально.


            1. DevFM Автор
              09.06.2023 14:23
              -1

              Писать на перле ещё хуже, чем на баш. Перл настолько write-only, что разобрать потом вообще невозможно


              1. Alexey2005
                09.06.2023 14:23
                +1

                Писать не хуже, хуже потом возвращаться к написанному через полгода. Но в случае однострочников читать их и не требуется. Написал — и используешь. Если однострочник устарел, он пишется полностью заново, благо это редко занимает свыше 20 минут чистого времени.


                1. DevFM Автор
                  09.06.2023 14:23

                  В таком ключе соглашусь


              1. Andrusha
                09.06.2023 14:23
                +1

                А что там такого нечитабельного? Регулярные выражения? Ну так они везде есть и везде выглядят одинаково, просто пишущие на Perl ими могут злоупотреблять, да. А нечитабельный код можно и на Python наваять.


                1. saboteur_kiev
                  09.06.2023 14:23

                  регулярками могут злоупотреблять все =)
                  перл еще терпимо, по сравнению с sed/awk синтаксисом


                  1. DevFM Автор
                    09.06.2023 14:23

                    Как в известном анекдоте. У тебя была проблема, и ты решил применить регулярку. Теперь у тебя две проблемы...


                    1. saboteur_kiev
                      09.06.2023 14:23

                      Люди неправильно учат регулярки. Вот и все (


                1. DevFM Автор
                  09.06.2023 14:23

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

                  А вообще это общепринятый мем. Перл, насколько я знаю, самый распространённый из write-only языков


          1. Nasreddin_Hodja
            09.06.2023 14:23

            Однако тут тоже есть свои проблемы - версия интерпретатора

            А что именно там ломается? 2 vs.3 не в счёт, почти все уже переехали на тройку. В тройке только API asyncio всё никак толком не стабилизируют вроде как, постоянно что-то меняют.


            1. DevFM Автор
              09.06.2023 14:23

              Обновление любой библиотеки чревато поломкой. Отсюда желание всегда юзать venv / docker для изоляции, и общая концепция "не пишите системные скрипты на питоне". Возможно, в этой части я устарел, и писать такое на питоне уже считается нормой


              1. Nasreddin_Hodja
                09.06.2023 14:23

                Так сами дистроклепатели давно пишут системные утилиты на питоне. Он потому и стоит зачастую из коробки.

                А venv обычно юзается когда нужны какие-то модули более свежей версии чем в репозиториях, Django например. Ну или там чтобы не засорять глобально какими-то модулями, которые нужны ради одной какой-то утилиты или в процессе разработки.

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


      1. iig
        09.06.2023 14:23
        +2

        bash привычное зло ;) Прекрасно в нем то, синтаксис того, что набирается в командной строке, и того, что внутри скрипта - одинаковый. Это очень удобно. Можно просто взять кусок истории и скопировать в скрипт. А неудобно то, что нужно помнить про экранирование пробелов, кавычек, слешей.. Иногда нужно экранировать 2 раза.. И что если запущена >1 оболочка - в .bash_history будет записано чортичто.


        1. DevFM Автор
          09.06.2023 14:23

          Экранирование то ещё адище. Как-то писал сложные curl в баше, никому не пожелаю лезть в этот ад


          1. 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 $?
            }


            1. anetto
              09.06.2023 14:23
              +1

              Ненавижу IFS, всегда работает ужасно криво


              1. khajiit
                09.06.2023 14:23

                Токенизатор там совсем примитивный, что-то вроде string.split()


              1. valrust
                09.06.2023 14:23

                Работает именно так как описано в разделе "Word Splitting" в мануале от Bash. Не замечал проблем с этим механизмом.


                1. anetto
                  09.06.2023 14:23

                  Так любая ошибка - и у тебя вместо приглашения командной строки начнутся каркозябры. Почти всегда, когда приходилось что-то делать с IFS, это занимало кучу времени на отладку, только неприятные впечатления. Особенно, когда это где-то в чужом скрипте


                  1. valrust
                    09.06.2023 14:23

                    Так любая ошибка - и у тебя вместо приглашения командной строки начнутся каркозябры.

                    Переменная IFS используется Bash для определения какие символы являются разделителями (сепараторами) строки на слова. Если значение в IFS не установлено, то разделителями будут пробел, таб и перевод строки. И эта переменная не влияет на приглашение командной строки.

                    На приглашение может влиять переменная PS1.


                  1. khajiit
                    09.06.2023 14:23

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


            1. DevFM Автор
              09.06.2023 14:23
              +1

              Даааа, shift-ы, IFS, eval - это прямо путь в адский ад. Но "работает - не трогай"


              1. khajiit
                09.06.2023 14:23

                Особенно набивка аргументов в строку в цикле через printf с вынесением перенаправления перед командой… ))


    1. lorc
      09.06.2023 14:23

      Это вы еще скриптов на Perl не видели...

      А как вы автоматизируете ручной труд? Нет, нет, да и возникает задача типа "найти в дереве каталогов все файлы с заданным расширением и сложить их все в одну кучу". Или даже банальное "погрепать заданную переменную в куче мейкфайлов". Каждый раз добавлять проект в IDE?


      1. laatoo
        09.06.2023 14:23
        +4

        найти в дереве каталогов все файлы с заданным расширением и сложить их все в одну кучу".

        ищу в файлменеджере *.расширение, в зависимости от всратости окружения подождать .2-5сек, ctrl+a, ctrl+c, открыть место будущей кучи, ctrl+v


      1. 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"

        Какойто херней страдаете, реально. Это задачи для файлменеджера, и консольные очевидно тоже такое умеют.


    1. slonopotamus
      09.06.2023 14:23
      +1

      каждый раз когда нужно что то автоматизировать с помощью bash у меня выступает холодный пот и внутри случается маленькая истерика.

      Попробуйте IDE + shellcheck.


      1. laatoo
        09.06.2023 14:23

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


        1. slonopotamus
          09.06.2023 14:23
          +1

          С этим не спорю, но лично мне удалось уменьшить степень боли и страдания от процесса до вполне приемлемого уровня. Если что, среды разработки от JetBrains имеют поддержку shellcheck из коробки. Ошибки оно подсвечивает автоматически.

          Также стоит в самих скриптах включать "Bash strict mode": http://redsymbol.net/articles/unofficial-bash-strict-mode/


    1. saboteur_kiev
      09.06.2023 14:23
      +1

      Просто многие считают, что баш - это какой-то простенький недоязык, и совершенно не пытаются изучить базовый синтаксис.

      А на самом деле, он достаточно удобен. Главное помнить, что в качестве библиотек в баш используются различные консольные команды, и их синтаксис это не часть баш. А в основном критика идет именно к этому.


      1. valrust
        09.06.2023 14:23

        Просто многие считают, что баш - это какой-то простенький недоязык, и совершенно не пытаются изучить базовый синтаксис.

        Я бы еще добавил, что кроме синтаксиса нужно знать хотя бы о других подстановках в Bash, а не только о подстановке параметров (переменных) типа $varname.


  1. aftertherainbow
    09.06.2023 14:23
    +3

    Про терминал всё понятно, про Линукс не очень, все пункты можно также выполнить в windows терминале.


    1. DevFM Автор
      09.06.2023 14:23

      Верное замечание. Старался написать про прелесть терминала. Но есть некоторая специфика, так как в винде с терминалом несколько хуже. Либо было хуже в мою активную жизнь в винде, если сейчас они сдвинулись вперёд


      1. astentx
        09.06.2023 14:23
        +3

        В Windows есть WSL и есть дотнет с объектами в PowerShell. Так что да, сдвинулись. Но обычный cmd, конечно, "несколько хуже", мягко говоря


        1. DevFM Автор
          09.06.2023 14:23
          +1

          WSL - это ровно тот терминал, о котором я пишу :) в powershell есть прикольные штуки, их объекты куда круче текста. Но в теории - потому что на практике всё криво и не консистентно. Было, по крайней мере - не моя область сейчас


        1. SquareRootOfZero
          09.06.2023 14:23

          Для Windows есть альтернативные терминалы — я, например, перешёл на ConEmu (перешёл давно, так что вспомнить, чем именно оно лучше дефолтного cmd не могу, но точно лучше). Там даже можно выбрать командный интерпретатор — между cmd и PowerShell, линуксоида такой мега-фичей вряд ли удивишь, но тем не менее.


          1. DevFM Автор
            09.06.2023 14:23

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


            1. SquareRootOfZero
              09.06.2023 14:23

              Много где много что есть, так и что с того? Губы Никанора Ивановича не приставишь к носу Ивана Кузьмича, приходится жить с тем, что есть на конкретно твоей платформе.


            1. kentaskis
              09.06.2023 14:23

              Напрашивается необходимость транслятора из языка альтернативных терминалов в баш...


              1. laatoo
                09.06.2023 14:23
                +1

                бедалага которому вручат эту задачу выбросится в окно.

                пощадите


            1. valrust
              09.06.2023 14:23

              Альтернативные терминалы и в линуксе есть, с куда более приятными циклами, экранированием и всем прочим.

              Циклы, экранирование и всё прочие к терминалу никакого отношения не имеют. Это всё функции командного интерпретатора (оболочки - shell).

              Но вы правы в том, что в Linux есть выбор терминалов, точнее эмуляторов терминала: GNOME terminal, Konsole, xterm, Guake, Qterminal и т.д.

              И есть альтернативы командных интерпретаторов (оболочек): sh, bash, dash, zsh, ipython3, psh, powershel и т.д.


            1. saboteur_kiev
              09.06.2023 14:23

              Вот сразу вижу непонимание между терминами шелл и терминал.

              Откуда в конему циклы и экранирование, если это терминал?


          1. deitry
            09.06.2023 14:23
            +1

            Современный Windows Terminal прекрасен, им бы только Quake mode допилить до уровня линуксового guake


        1. khajiit
          09.06.2023 14:23

          Это не то, есть терминал и posh.


    1. DerRotBaron
      09.06.2023 14:23

      Не всегда и не все так же.просто. cmd.exe старый, тупой и просится на свалку, а powershell умеет много, но довольно сложно и не очень понятно, зачем учить редкий язык для редкой технологии, если нет необходимости и планов быть виндовым админом.

      Ну и тем временем на дворе 2023 и есть жизнь без винды, и в этой жизни умения работы с *nix/*sh вполне себе востребованы


      1. slonopotamus
        09.06.2023 14:23

        а powershell умеет много

        До тех пор пока по умолчанию в винде не появится запуск powershell-скриптов по дабл-клику, bat-файлы никуда не денутся.


        1. vasyakolobok77
          09.06.2023 14:23

          Если очень хочется, то можно сделать запуск по клику, вот только запуск отдельным пунктом меню сделан специально в целях безопасности. Лучше сделать обдуманное действие, чем чинить последствия необдуманного.


          1. slonopotamus
            09.06.2023 14:23
            +1

            Мне очень хочется чтобы оно было по умолчанию.

            запуск отдельным пунктом меню сделан специально в целях безопасности

            Не вижу в этом логики. Экзешники запускать дабл-кликом можно, .bat можно, ярлыки можно, а .ps1 небезопасно?


    1. nronnie
      09.06.2023 14:23
      +1

      Тут все поголовно путают "терминал" и "шелл". "Шелл" - это только интерпретатор строковых команд, "терминал" - это приложение для взаимодействия с пользователем через устройства ввода-вывода. И они, по сути, очень слабо связаны.


      1. saboteur_kiev
        09.06.2023 14:23

        Вы тоже путаете =)
        shell - это оболочка, не обязательно строковых команд. Это в принципе софтварная часть интерфейса. Шелл может быть не только CLI, но также и графическим, или например оболочка может быть предоставлена в виде окошек и диалогов в текстовом режиме, или те же панельные менеджеры - тоже оболочки.


        1. 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.


          1. saboteur_kiev
            09.06.2023 14:23

            Это у вас RFC или вырезали вне контекста кусок чего-то?

            Оболочка - это интерфейс пользователя. Оболочка состоит из железа и софта.
            Если мы говорим про текстовый терминал, то шелл будет что-то вроде bash/cmd/powershell. Если мы говорим о GUI , это будет что-то вроде проводник/KDE/что-то еще.

            Слово shell это именно оболочка, а не текстовый терминал.


  1. laatoo
    09.06.2023 14:23
    +27

    решением прикладной задачу: попробуем найти уникальные строки в большом файле

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

    вот буквально сегодня пришел кофе попить, смотрю - люди за ноутбуками.

    подхожу к одному - говорит, ну что, брат, щас вот досчитаю строчки в файле, а вечером домой к семье.

    за другим столиком два человека, тычут пальцем в экран, что то бурно обсуждают. я было заподозрил неладное, но тут содин другому говорит "вот эту строчку мы уже видели час назад!". все встало на свои места.

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


    1. DevFM Автор
      09.06.2023 14:23

      Спасибо, посмеялся :) Такого действительно много вокруг. Например, слить базы поставщиков/клиентов/товаров - вполне прикладная задача. Если условная CRM этого не умеет, то это надо как-то самому. Понятно, что эксель такое может. Но на миллионах строк эксель начинает грустить

      Я из своей практики собрал, на свой вкус, самые показательные примеры. Возможно, они кривые и косые - но последние 10 лет я постоянно сталкиваюсь с подобным в совершенно разных сферах деятельности. А реклама ТГ... Ну, я там выкладываю интересные материалы. Если вам они понравятся, буду рад


      1. Kotofay
        09.06.2023 14:23
        +3

        Слить базы в каком формате? Текстовом?


        1. DevFM Автор
          09.06.2023 14:23
          +1

          Угу. Типа выгруженные .csv


    1. ris58h
      09.06.2023 14:23
      +3

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

      Зачем разработчику нужен Linux вообще и терминал в частности

      Сарказм почти удался.


      1. laatoo
        09.06.2023 14:23
        +1

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

        пример "прикладной" задачи разработчика высосан из пальца

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


        1. DevFM Автор
          09.06.2023 14:23
          +3

          В моём мире это довольно частая задача, если без акцента на "больших файлах". Что-то грепнуть, отсортировать, слить, найти, заменить - все варианты работы с текстовыми файлами нужны. Если освоить принцип декомпозиции и применения конвейера, то эти задачи решаются влёт. Я рассмотрел одну конкретную. Вы считаете, что надо трактат писать? Есть advanced bash scripting guide на 1.5к страниц для этих целей. Я хотел заинтересовать, показать удобство, показать примеры


          1. laatoo
            09.06.2023 14:23

            сколько людей столько и миров, что-ж.

            сочувствую :)


        1. putnyk
          09.06.2023 14:23
          +2

          Зря Вы так. Мне вчера подобная задача пришла: в каталоге мониторить наличие новых *.csv, выпиливать из них строки-дубли (без учёта id строки) и сохранять в новый файл.


          1. laatoo
            09.06.2023 14:23
            +1

            я не утверждаю что таких задач не бывает.

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

            в общем случае будни разработчика проходят в IDE, а не в баше и мире всратых линуксовых утилит. и это прекрасно.


        1. ris58h
          09.06.2023 14:23

          Ответ на ваши вопросы - да.

          У админов, devops, backend регулярно возникает такая задача.

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

          сочувствую :)


          1. laatoo
            09.06.2023 14:23
            +1

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

            я по обе стороны (фронт и бэк) работал и работаю в ide.

            админы и девопсы это не оч то про разработку (обслуживание бизнеса) в принципе, это обслуживание разработки и/или техники, я поэтому их особо не рассматриваю здесь.

            спесь про ничего не понимающих "фронтендщиков" пропадает когда садишься на его место. убедился на себе лично.

            можете поверить на слово, можете проверить сами. ну а можете дальше ковыряться в башах, консервируя свои представления, как угодно ;)

            хорошего вам дня!


            1. N-Cube
              09.06.2023 14:23

              Да и разработчик без шелла мало чего стоит - к примеру, хорошо настроенный кластер может обойтись в разы дешевле за счет инстансов попроще и их количества, а на какой-нибудь университетский суперкомпьютер с древним линуксом/юниксом вы свою программу и зависимости в жизни не установите без отличного знания разных шеллов (и их версий). Ну или хотя бы скомпилировать и запустить на гитхабе тесты (github actions) под все поддерживаемые операционки (и удалить все, что возможно, чтобы место освободить, но не сломать нужного). В эмбеддед разработке все еще интереснее :)


              1. laatoo
                09.06.2023 14:23

                хорошо настроенный кластер

                а разработчик тут причем?


                1. N-Cube
                  09.06.2023 14:23

                  Простите, вы как будете софт разрабатывать, под сферический кластер в вакууме? Нужно кластер развернуть, настроить, разработать софт, протестировать, документировать, передать админам - только тогда это будет эффективно и надежно работать лет так 5-10, сколько «железо» выдержит. С эмбеддед все еще веселее, потому что еще и операционку зачастую собрать самому надо, не говоря уж о сборке и настройке системных утилит - и это все разработчик сам делает обычно. А если вы про кодера, который пишет одну функцию и понятия не имеет, зачем, то это вовсе не разработчик.


                  1. slonopotamus
                    09.06.2023 14:23
                    +1

                    Вы думаете какой-нибудь Wordpress разрабатывают под конкретный кластер?


                    1. N-Cube
                      09.06.2023 14:23

                      Вот вы серьезно называете вордпресс и прочие веб-формочки кластерным софтом? Выше я вполне доступно написал, о какой разработке речь.


                      1. slonopotamus
                        09.06.2023 14:23
                        +1

                        Вот это кластерный софт? Разработан под кластеры в вакууме.


                      1. laatoo
                        09.06.2023 14:23
                        +1

                        кроме вас никто не говорил про «кластерный» софт

                        Нужно кластер развернуть, настроить, разработать софт, протестировать, документировать, передать админам

                        разработчик во всей этой цепочке занимается, собственно, разработкой софта


                      1. N-Cube
                        09.06.2023 14:23

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


                      1. laatoo
                        09.06.2023 14:23
                        +1

                        сколько раз вам нужно указать явно/неявно на то, что ваш случай частный, а не общий?


                      1. N-Cube
                        09.06.2023 14:23

                        Глупости говорите. Четверть века назад «контейнером» был chroot, который еще надо ухитриться собрать, а линукс, или тот же постгрес или перл с апачем собирались из исходников - так что, прежде чем начать программировать хоть что-то, нужно было уметь все скомпилировать (с патчами, конечно, иначе никак), установить и настроить. Да еще лет 10 назад на ноуте при каждом обновлении ядра мне приходилось заново видеодрайвер компилировать и вкорячивать его в систему (амд тогда на ноуте под линуксом был тот еще квест), а потом настраивать управление энергосбережением, яркостью экрана и прочим. А управление кодировками? Лет 20 назад для этого приходилось самому системные утилиты дописывать (ну, нужна мне была KOI8 по историческим причинам). И так далее и так далее. Конечно, знание шелла было необходимо ежедневно. Да и сегодня, собрать деб-пакеты или там homebrew пакеты (для Мак; а попробуйте питон с поддержкой эппловского Accelerate на Apple Silicon без шелла собрать), развернуть кластер, сделать CI тесты и все прочее - требует шелла. Кстати, все или почти все квалифицированные админы еще со времен Unix ушли в программирование, так что средний программист нынче на голову лучше среднего админа :) Еще раз - не путайте кодера (решает одну или несколько уже сформулированных задач) с программистом (решает проблему).


                      1. laatoo
                        09.06.2023 14:23

                        в огороде бузина, в киеве дядька..

                        вы уже сами запутались в том что хотите мне доказать :)

                        хорошего вам дня!


                      1. N-Cube
                        09.06.2023 14:23
                        +1

                        Не в чем тут запутываться - баш «хоронят» так же, как доллар. Однако все слухи о его смерти сильно преувеличены (с).


                      1. DevFM Автор
                        09.06.2023 14:23
                        +1

                        Согласен с вами. Как пишет Джоел в Законе дырявых абстракций, надо знать на один уровень глубже того, на котором вы работаете. Поэтому уметь самому собрать кластер и понимать как он работает важно для того, кто пишет софт под этот кластер. Да, это не обязательно. Да, с разделением труда всё больше тех, кто крутят гайку в своём закрытом мире. Но как раз bash - это наша латынь, которая 30 лет работает и ещё столько же будет, вероятно. Занятно слушать тех, кто с этим не согласен)


            1. ris58h
              09.06.2023 14:23
              +1

              спесь про ничего не понимающих "фронтендщиков" пропадает когда садишься на его место. убедился на себе лично.

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

              И вам не хворать!


    1. khajiit
      09.06.2023 14:23
      +7

      А зря смеетесь, потому что грепанье логов — это как раз оно, и elk с мантикорами далеко не всегда подключены, не то что вообще установлены, к исследуемому хосту.


      1. DevFM Автор
        09.06.2023 14:23
        +2

        Факт


  1. Kotofay
    09.06.2023 14:23

    Если начинать от печки, то нужно рассказать откуда взялась эта строчка: "libheif-examples"


    1. 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

      Вот и он


    1. 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
      ``°


      1. DevFM Автор
        09.06.2023 14:23

        Обожаю решения, которые не требуют интернета. Начинающие разработчики не знают, как это "без интернета" :))


  1. ifFamous
    09.06.2023 14:23

    Поставил недавно Линукс. Так как изучаю java со всеми вытекающими, решил поставить туда docker. На макОси просто программа с гуи и ставиться изи, на винде тоже самое. На линуксе решил поставить докер, пошел по "сложному" пути установки последней версии, не знал, что можно накатить через apt, но там, насколько я понял, отстает с обновами. Ну да ладно, первый раз не вышло, что-то где-то прошляпил в настройках или что, не знаю. Снес все, а все ли? xD Ладно, нашел гайд на ютубе и поставил, все вроде действия те же самые, но в этот раз получилось. Накатил поверх гуи, все окей. Месяц не садился за комп, тут сел, зашел в докер, а тут и обновление и насколько я понял, чтоб обновится, нужно по сути снести его полностью и накатить снова. Ладно, снес и поставил через apt.
    В общем, основную фрустрацию вызывает конкретно установка и непонимание, а правильно ли я все поставил, а не возникнет ли потом проблем из-за того, что из-за косяка на каком-то шаге, что-то не так установил, такое. Опять же, это только с docker так было, в остальном - норм. Терминал по тихой осваиваю :)


    1. DevFM Автор
      09.06.2023 14:23
      +1

      Как раз спорили недавно об этом с коллегой. Мне офф гайд установки докера на убунту кажется простым, пяток команд и всё. Коллега не согласился :)


      1. ifFamous
        09.06.2023 14:23

        Я скорее о том, что используя всю жизнь винду и год макось, к такому я не был готов) И уверенности в том, что все сделал правильно, тоже не особо, хоть и шагов не так много, но все же в первый раз я где-то накосячил(перешел по ссылке на офф гайд, вроде по гайду с того же сайта в первый раз ставил, но шагов больше было и еще там перенаправляли что-то дополнительное ставить на их же сайте).
        Сейчас стоит через apt, насколько я понимаю, теперь и при обычном sudo apt update && sudo apt upgrade, должен обновляться.


        1. CherryPah
          09.06.2023 14:23

          а в макоси с brew не сталкивались?


          1. N-Cube
            09.06.2023 14:23

            Чем брю не угодил? Готовых пакетов полно, свои писать можно (и куда как попроще, чем, скажем, в дебиане).


            1. CherryPah
              09.06.2023 14:23

              Да в общем и целом устраивает, только по мне он немного неповоротливый, особенно если софт через него раз в полгода ставить.

              Просто комментатор выше пишет что у него опыт работы с макосью/виндой и его смутил apt в линуксах. Хотя в маке пакетный менеджер брю вполне себе распространенное явление, когда нужно поставить что-то не из аппстора


              1. ifFamous
                09.06.2023 14:23

                Практически все, что стоит на маке, было установлено скачиванием .dmg с сайтов программ, кроме git и postgres. Но разница в том, что brew, как и sudo apt install, все понятно и просто, а когда что-то ставишь и там много шагов, начинаешь задумываться, а норм ли поставил и встало ли все как надо. В первый раз, когда ставил docker, где-то накосячил, потому и появляются сомнения)


          1. ifFamous
            09.06.2023 14:23

            Сталкивался. Если память не изменяет, ставил гит через него или постгрес, проблем не было, на этом все. Но там и команда была всего одна, по моему, как на убунту какой-нибудь sudo apt install ... и забыл)


    1. nronnie
      09.06.2023 14:23
      +2

      На cайте докера есть скрипт, который для любого линукса всё делает сам:

      $ curl -fsSL https://get.docker.com -o get-docker.sh
      $ sudo sh ./get-docker.sh
      

      В продакшен ставить им не рекомендуют, но локально для разработки вполне норм.


      1. ifFamous
        09.06.2023 14:23

        Сохранил на будущее. Спасибо :)


      1. DevFM Автор
        09.06.2023 14:23
        +4

        Кстати, это одна из ужасно плохих практик - делать sudo рандомному скрипту из интернета


        1. nronnie
          09.06.2023 14:23
          +3

          Что мешает сначала внутрь посмотреть? Но, лично вы, если такой "тру" то можете вообще всё из исходников собирать - кто вам запретит.


          1. izogfif
            09.06.2023 14:23
            +2

            Только не забудьте перечитать все исходники, скачанные из интернета и провести аудит кода.


            1. nronnie
              09.06.2023 14:23

              Я с *никсами начинал когда-то с FreeBSD - там сборка из исходников (причем, начиная с ядра) это была (не знаю как сейчас) обыденная повседневность :)


        1. nronnie
          09.06.2023 14:23
          +2

          Скрипт, к слову сказать, и не "рандомный". Или, что, выходит, что скачать и установить *.deb c docker.com это ок, но, запустить скрипт оттуда же это фу?


          1. slonopotamus
            09.06.2023 14:23

            Да


      1. slonopotamus
        09.06.2023 14:23
        +3

        И вот так, лёгким движением руки любой линукс-дистрибутив превращается в слакварь. Горите пожалуйста в аду советчики устанавливать system-wide софт в обход менеджера пакетов.


        1. DerRotBaron
          09.06.2023 14:23
          +1

          Надо сказать, на дебчатые и шапчатые дистрибутивы подобные скрипты ставят такое через добавление репозитория в менеджер пакетов, а не через произвольную запись в /ussr/local или /opt. Ну или в хомяк, если это что-то пользовательское вроде rustup.

          Но отучать доверять curl | sh и особенно curl | sudo sh крайне стоит.


          1. DevFM Автор
            09.06.2023 14:23

            Я даже про это статейку писал на пикабу, почему копировать сразу в терминал плохо. Даже если написано безобидное


        1. DevFM Автор
          09.06.2023 14:23

          Факт. Ещё жутко не люблю snap из-за появления кучи доп проблем без особых выгод


          1. Melirius
            09.06.2023 14:23

            Ооо, докер в снапе на Убунте - это вообще кошмар.


            1. nronnie
              09.06.2023 14:23

              У меня снап всегда ассоциируется с Windows Store под виндой - какая-то хрень, которую прикрутили параллельно с привычным менеджером пакетов только чтобы всё запутать.


              1. DevFM Автор
                09.06.2023 14:23

                А как вам Windows Store? Моё активное использование винды закончилось до его появления, и я не в курсе, удобно ли это и стал ли Store стандартом распространения софта, как steam для игр


            1. slonopotamus
              09.06.2023 14:23

              докер в снапе на Убунте

              Но зачем? sudo apt-get install docker.io и вы великолепны.


              1. khajiit
                09.06.2023 14:23
                +1

                А если хочется совсем-совсем свежего — есть роллинги, тысячи их, включая Debian sid.


              1. DevFM Автор
                09.06.2023 14:23

                Насколько я знаю, в репо от ubuntu версия с существенным отставанием. Поэтому в офф гайде рекомендуют добавить их репозиторий и ставиться оттуда


        1. nronnie
          09.06.2023 14:23

          В случае debian-based там внутри такой же apt, просто уже с нужными настройками.


          1. slonopotamus
            09.06.2023 14:23

            Во всех curl | bash?


          1. slonopotamus
            09.06.2023 14:23

            Ну и вообще, sudo apt-get install docker.io и не надо возиться ни с какими curl | bash.


            1. nronnie
              09.06.2023 14:23

              Ну, опять-таки - это способ (curl / bash) не с балды ведь я взял, а с официальной доки самого докера - если они там так пишут, то, возможно, причина какая-то есть. Я ведь не советую скрипты скачанные с ВКонтакта запускать.


  1. exadmin
    09.06.2023 14:23
    +5

    Мой реалистичный сценарий: когда есть только доступ по ssh к удаленному linux-серверу по не самому быстрому каналу, как раз всю вот эту магию очень удобно делать поверх множества жирных log-файлов, которые не вытянешь себе в windows-песочницу, потому что очень тяжелые и по секюрити соображениям.


    1. DevFM Автор
      09.06.2023 14:23

      Именно! Идеальный use-case. Правда, дальше ещё начинаются пляски, так как на нестабильному каналу ещё надо screen/tmux и настройки ssh клиента, а то больно будет. Довольно непростая тема


      1. exadmin
        09.06.2023 14:23
        +2

        О да, классные штуки. Когда запускаешь тяжёлое, а потом из метро или электрички с телефона контролируешь/доделываешь...


  1. nronnie
    09.06.2023 14:23

    Легко автоматизировать процессы

    Я сам достаточно работаю с Линуксом, но после PowerShell делать что-то на bash это какая-то адова боль.


  1. tommyangelo27
    09.06.2023 14:23
    +1

    Для простых задач (вроде сортировки и грепа) есть git bash под Винду. А для чего-то более сложного - я лучше скрипт на php/питоне напишу.


    1. nronnie
      09.06.2023 14:23
      -1

      есть git bash под Винду

      Да, в принципе, зачем, когда есть PowerShell, где все на порядки логичней и более упорядоченно. Ну а если ты .NET разработчик, то в нем ты вообще как рыба в воде, т.к. все его объекты это объекты .NET.


    1. saboteur_kiev
      09.06.2023 14:23

      Ну зачем сразу перл. На баше можно писать и чуть более сложное

      https://asciinema.org/a/468242


  1. 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
    

    Хрюк-пук...сиди-разбирайся что не так. Я, конечно, в маке, как можно заметить - но казалось бы, тут тот же самый терминал и те же самые команды?

    Заключение

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


    1. DevFM Автор
      09.06.2023 14:23
      +1

      Коллега тоже возмущался этому тезису. Ну, на мой вкус, apt в целом куда приятнее и понятнее, чем ставить рандомный экзешник


      1. Sild
        09.06.2023 14:23
        +1

        Хех, нет, это я кнопку "отправить" нашел, а кнопку "напечатать что хотел сказать" не нашел. Тезисов у меня гораздо больше :D


        1. DevFM Автор
          09.06.2023 14:23

          Посмотрел ваш отредактированный коммент - всё по делу. Да, это существующие проблемы


      1. nronnie
        09.06.2023 14:23

        Екзешник, как правило, подписан, содержит в себе стандартный *.msi, а если его ставишь через winget (лично я так уже давно и делаю), то еще и имеет хеш, который проверяется. Т.ч. вовсе не и не такой рандомный.


    1. slonopotamus
      09.06.2023 14:23

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

      Что за бред. `emerge virtualbox`. Конец.


    1. auresio
      09.06.2023 14:23
      -1

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


    1. DerRotBaron
      09.06.2023 14:23

      Давайте поставим virtualbox. Что для этого нужно?

      Взять и поставить. Последняя версия вам почти наверняка не нужна, а в большей части пригодных к использованию конфигураций он уже есть, а если у вас БолгенОС или упаси торвальдс Федора без RPM Fusion, это скорее всего ваша проблема.

      Легко вспомнить

      Как хорошо, что это с GUI решается легко и просто, да?

      Легко настроить под себя
      Угу, все дефолты идеальны, и раз они идеальны, их никто не меняет просто так

      Изучается один раз
      Только это и есть один из интерспрайзных интерфейсов, который обычно стараются не ломать. А с интуитивно понятными GUI регулярно интуитивно понятно что-то куда-то двигают, и в результате не поцмешь, эта настройка в Accessibility, тнтерфецсе, экспериментальных опциях.или вовсе удалена 3 версии назад как непопулярная.

      Ускоряем работу на примере
      Если обратиться ко второму слову в заголовке статьи, это можно воспринимать как признание в профнепригодности для почти всех, кто попадает под это самое второе слово.

      Заключение
      Согласен, но с важным замечанием:
      следите за тем, какие инструменты еще решают задачу, возможно, они эффективнее настолько, что игнорированее этого когда-нибудь обойдется дорого


    1. AlexGluck
      09.06.2023 14:23
      +5

      1. Открываем центр приложений

      2. Вбиваем в поиске название приложения

      3. Наживаем кнопку установить

      4. Не пишем бред в интернетах


      1. Sild
        09.06.2023 14:23

        А куда это мы в GUI полезли...
        У вас же там свежая версия? Оракловая небось, именно та, на которой запустятся образы для отладки? (спойлер - не думаю. Потому что оракловая устанавливается через внешний репозиторий или скачиванием с сайта)


        1. AlexGluck
          09.06.2023 14:23
          +1

          Это gpl версия, свежая. Просили просто гуй вот я и гуй дал. Сам бы системный софт ставил через `dnf install virtualbox`


        1. DevFM Автор
          09.06.2023 14:23

          Менеджер пакетов работает поверх apt и ничем не отличается, ниже предложили apt install virtualbox. Думаю, тут скрин - красивый способ показать, что оно есть из коробки и даже терминала не требует


    1. Darkholme
      09.06.2023 14:23
      -1

      apt install virtualbox

      Если нужна более новая версия - у вас специфические условия и думаю, что вы осилите запустить 4 команды в терминале с офф. сайта или установить deb оттуда же. В винде же устанавливают msi?

      Хрюк-пук...сиди-разбирайся что не так. Я, конечно, в маке

      Казалось бы, а причём здесь линукс...

      То, что ваш вендор впихнул какую-то древнюю/обрезанную/модифицированную версию утилиты в свою ОС - повод обращаться к разработчикам ОС, а не утилиты или других ОС. С таким же успехом можна Linux клясть, ведь в windows версия curl с уязвимостями (практически свежий сейс)


  1. Mayurifag
    09.06.2023 14:23
    +2

    Как будто бы не самый лучший пример выбран, я про HEIC. Вот сижу я на маке, и, допустим не знаю, что оказывается линукс мне нужен, допустим что я — ЦА статьи.

    Я уже давно сделал через автоматизатор и чатгпт чтобы по ПКМ в выпадающей менюшке -> Services -> Convert to .jpg было. Лично у меня ещё и исходник удаляет, обычно мне сам этот .HEIC больше ни к чему после конвертации. Соответственно, часто пользуюсь, перекидываю по airdrop фото со смартфона и, бывает, этот промежуточный шаг в конвертацию jpg нужен.

    Способ замечательно масштабируется и на один файл, и на выделенные все файлы в директории, и ещё особенно на выделенную часть файлов, например недавно закинутыx, — ничего вспоминать не надо из альясов или истории команд в терминале.

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


    1. N-Cube
      09.06.2023 14:23
      -1

      Просто автор не линуксоид, а телеграм-канал-пиарщик, отсюда и выбор софта (кто вообще слышал о таком? явно нагуглено на скорую руку) и советов (предлагать баш зависимые скрипты, когда баш по умолчанию перестали лет пять назад и на линуксах и на маке ставить это уже профнепригодность).
      Есть замечательный набор утилит обработки изображений imagemagick, с ним пишем
      convert -resize … a…. a.jpg
      и заданный файл превращается в указанного размера (в пикселах или процентах) жпег. Можно заодно вырезать нужный кусок изображения, сгенерировать анимированный гиф и так далее. Вот недавно для книги делал обложку с помощью imagemagick - разместить картинку, сделать обрамление, заголовки и прочее напечатать - можно запустить пакетно для всех установленных шрифтов и сравнить, легко сгенерировать обложки для серии книг, всегда можно посмотреть историю изменений скрипта и так далее.
      Маковский автоматизатор позволяет скрипт вызывать, так что часто употребляемые задачи можно и в контекстное меню добавить.


      1. DevFM Автор
        09.06.2023 14:23

        Люблю диагнозы по интернету. Может, и моё видео из статьи Идеальный скрипт на bash тоже нагуглено на скорую руку?

        В каком мире и куда bash перестали ставить, если в самых популярных дистрибутивах он всегда есть?

        То есть я не знаю нюансы imagemagick, поэтому я не ликуксоид? Я не фоторедактор и решаю задачу, как умею. Мне не нужны ресайзы и прочее, нужно изменить формат фото, и всё. За софтину спасибо, посмотрю

        И маковский автоматизатор на убунте не очень поможет


    1. DevFM Автор
      09.06.2023 14:23

      Я посмотрел другие статьи на этот счёт и они мне показались кривыми. Там либо рассуждения в стиле "линукс - это производительная и масштабируемая ОС", либо кривые примеры использования "если вот так хитро извернуться, то вот это вам понадобится"

      Взял пример из того, с чем сталкивался вне программирования. Фотки с айфона в ТГ - вполне реальный пример, решил начать с него. Он мне тоже не кажется идеальным, но рассматривать на примере "найдём все фотки с заданной датой" выглядят куда более вымученными


  1. 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-разработчиков про десятикратную разницу между крутыми и посредственными разработчиками

    Вы валите собеседование на джуна, але.

    Вы не способны выбрать подходящий инструмент для решения задачи для джуна. Вы даже не способны решить ее корректно. Зато способны писать веселые статейки про прелести терминала. Очевидно, вам просто нравиться трахаться с консолькой. Т.е. вы даже не способны понять с кем надо трахаться.

    Лол, это очень забавно.


    1. randomsimplenumber
      09.06.2023 14:23

      под линукс практически нет вменяемых GUI тулов для гита

      Шта? О_о Недавно была статья на хабре, как раз про gui для git. Штук 10 навскидку, большинство кроссплатформенные. В каждом вменяемом IDE , кстати, тоже есть git client.

      задача для джунов на собесе, решается скриптом на питоне за 5 минут

      Через 5 минут, пока пишется скрипт, односторочник на баше уже отработал и забыт.

      Синтаксис типа if [ $number -ge n ] then fi

      Вот синтаксис с отступами это удобно , да. :)


      1. ilitaiksperta
        09.06.2023 14:23
        +1

        Шта? О_о Недавно была статья на хабре, как раз про gui для git. Штук 10 навскидку, большинство кроссплатформенные

        Большинство из них под винду и мак онли. Для линукса из вменяемых только проприетарные и платные сублим и смартгит.

        В каждом вменяемом IDE , кстати, тоже есть git client.

        Не все пишут строго под один стек.

        Через 5 минут, пока пишется скрипт, односторочник на баше уже отработал и забыт.

        В общем случае да, но именно на примере из статьи это не валидно. Автор явно не 5 минут потратил чтобы добиться вменяемой скорости работы на большом файле. За то время, которое у него решение в лоб выполняется можно успеть накидать говноскрипт, который в лоб работает быстрее оптимизированного однострочника.

        Вот синтаксис с отступами это удобно

        Явно удобнее чем шиза типа if fi или -ge


        1. randomsimplenumber
          09.06.2023 14:23

          Большинство из них под винду и мак онли.

          Достаточно одного из 100500 оставшихся, который решает ваши задачи. Или ваши вкусы слишком специфичны? ;) Giteye неплох, например.gitkraken можно и бесплатно использовать, с ограничениями.

          Автор явно не 5 минут потратил

          Автор демонстрировал ;) Одноразовые задачи такого уровня должны решаться не думая.


          1. ilitaiksperta
            09.06.2023 14:23
            +2

            ваши вкусы слишком специфичны?

            Да, мне нравится когда софт выглядит не вырвиглазно, удобен и работает быстро и без особых глюков.

            Giteye

            Вырвиглазная поделка на основе эклипса. Как "охеренно" работает эклипс я на практике знаю.

            gitkraken

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

            100500 оставшихся

            Кривые поделки, либо неудобные, либо с интерфейсом от вин98, либо и то и другое. Авторы которых даже не могут тупо взять дефолтный qt или gtk и лепят "красивый" кастомный дизайн, при том что им медведь на глаза наступил.

            Или вот например есть простой, но юзабельный gitg, в котором какойто даун намертво захардкодил на всех цветовых схемах числа и строки ярко розовым цветом. Зачем? Что с этими людьми не так?

            Автор демонстрировал

            Ага, то что лучше не демонстрировать.


            1. iig
              09.06.2023 14:23

              Да, мне нравится когда софт выглядит не вырвиглазно, удобен и работает быстро и без особых глюков.

              Это фантастика ;)

              Если вы покажете свой любимый софт - вам 2 панамки накидают, и за его вырвиглазность, и за глючность. И за неудобство, само собой ;)


              1. vasyakolobok77
                09.06.2023 14:23
                +2

                Автор ветки комментариев говорил про гит-клиент в средах разработки. Для большинства ЯП могут подойти продукты от JetBrains, ну или VSCode. В них gui для git не выглядит вырвиглазно, хотя все вкусовщина это.


    1. valrust
      09.06.2023 14:23

      Синтаксис типа if [ $number -ge n ] then fi можно придумать либо если ты кукухой едешь в дурку, либо если хочешь поиздеваться над людьми.

      Вы забыли, что Bash это командный интерпретатор, а не язык программирования общего назначения и в нем нет True и False.

      В приведённом примере [ это не часть синтаксиса, а вполне обычная команда, такая же как cd, pwd, alias и другие встроенные команды, просто у неё имя такое. Оставшаяся часть$number -ge n ] это аргументы команды.

      Конечно еще нужно не забывать, что перед тем как выполнить команду [ Bash вместо $number подставит значение переменной с именем number.


      1. laatoo
        09.06.2023 14:23

        от этого знания синтаксис не стал удобнее


        1. randomsimplenumber
          09.06.2023 14:23

          А в чем неудобство то? Синтаксис работает, свои задачи решает. Расхождений с тем чтобы man bash написано, я не вижу. Достаточно просто запомнить, как это пишется.


        1. 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 используется команда как условие и он анализирует статус её завершения.


          1. laatoo
            09.06.2023 14:23
            +1

            там выше ребята дали однострочник для выпрлнения той же задачи на powershell.

            сравните читаемость и перестаньте писать ерунду про простой и удобный синтаксис


            1. saboteur_kiev
              09.06.2023 14:23

              Сравните операционные системы и перестаньте писать ерунду =)


              1. laatoo
                09.06.2023 14:23
                +1

                я сравниваю синтаксисы


                1. saboteur_kiev
                  09.06.2023 14:23

                  Тогда просто вопрос. Как работает ассоциация файлов в Виндовс и Линукс?


        1. saboteur_kiev
          09.06.2023 14:23
          +1

          Так грубо говоря, вы ругаетесь на отдельную программу, которая лежит в /usr/bin/[
          а обвиняете именно баш.


      1. vasyakolobok77
        09.06.2023 14:23
        +1

        То что bash это интерпретатор команд это не оправдание для синтаксиса. Можно было сделать лучше и удобней, но увы нет. Посмотрите как МС реализовал PowerShell, по сути ЯП для написания скриптов автоматизации.


        1. Nasreddin_Hodja
          09.06.2023 14:23

          PowerShell появился в середине нулевых только, а bash появился в 89 и ему приходится сохранять некоторую совместимость с предшественниками.

          Ну и под линуксами это не особо проблема, т.к. скрипты там можно писать не только на нём, да хоть на tcl, который с большой вероятностью уже присутствует в системе, как и питон.


        1. valrust
          09.06.2023 14:23
          +1

          Приведите примеры не нормальности синтаксиса Bash.

          Когда сравниваете Bash и PowerShell учитывайте, что Bash был выпущен в 1989 году и он следует стандарту IEEE POSIX Shell and Tools, а PowerShell вышел 2006 году.


        1. Nasreddin_Hodja
          09.06.2023 14:23
          +1

          И ещё дополню:

          Посмотрите как МС реализовал PowerShell, по сути ЯП для написания скриптов автоматизации.

          Зря старались, способных написать что-то на PS всё равно меньше чем на баше ))

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


      1. Nasreddin_Hodja
        09.06.2023 14:23

        В приведённом примере [ это не часть синтаксиса, а вполне обычная команда, такая же как cd, pwd, alias и другие встроенные команды, просто у неё имя такое. Оставшаяся часть$number -ge n ] это аргументы команды.

        Правда, насколько я знаю, современные реализации не дёргают команду [, а ради эффективности оно интерпретируется самим bash/dash. Аналогично с некоторыми другими командами, например printf.


        1. valrust
          09.06.2023 14:23

          Так и есть [ или она же test - это встроенная команда Bash, для нее не запускается отдельный процесс.


    1. DevFM Автор
      09.06.2023 14:23

      1. менеджер пакетов apt вполне неплох. Проблемы есть везде

      2. автоматизация всё ещё хороша, хотя и тоже не без проблем

      3. сумма больше 100% из-за multichoice - можно было выбирать несколько ОС

      4. GUI под линукс есть всякий разный, можно выбрать

      5. многие вещи в терминале выполняются куда быстрее. Наверное, горячие клавиши вам тоже не нравятся, т.к. во времена Брежнева были изобретены?

      6. смысл однострочника в том, что можно многие задачи решить очень быстро без необходимости непосредственно программировать

      7. для не ascii символов моё решение будет корректно удалять дубликаты. И чем предлагаемый мной инструмент не корректен, по вашему мнению? Он решает задачу просто и элегантно


      1. ilitaiksperta
        09.06.2023 14:23

        apt вполне неплох.

        Для пакетного менеджера да. Но как решение для установки софта пакетный менеджер в котором есть зависимости, это однозначно плохое решение. Не просто так за пределами линуксов оно практически нигде не используется.

        Проблемы есть везде

        В отличии от apt

        GUI под линукс есть всякий разный, можно выбрать

        Кроме качественного

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

        А какие-то даже удобнее, а какие-то вообще в гуе не сделаете. Но я нигде не утверждал что консоль говно, потому что она Брежнева помнит. Я ткнул вас в то, что вы сами пишете, что вам нужны костыли чтобы удобно ей пользоваться, а вы пытаетсь это подать как преимущество. В то время как уже десятилетия есть более удобные и подходящие инструменты для этой задачи.

        смысл однострочника в том, что можно многие задачи решить очень быстро без необходимости непосредственно программировать

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

        для не ascii символов моё решение будет корректно удалять дубликаты. И чем предлагаемый мной инструмент не корректен, по вашему мнению? Он решает задачу просто и элегантно

        Вы сортируете 14 миллонов строк, для того чтобы решить задачу где сортированный список вообще не требуется. Говноскрипт на питоне решает эту задачу быстрее, как по времени его написания, так и времени выполнения. И его потом спокойно можно использовать в т.ч. в однострочниках. Для неascii я проверил, да, одинаковые строки оно корректно ставит рядом.


  1. 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
    

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


    1. DevFM Автор
      09.06.2023 14:23

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


  1. MyraJKee
    09.06.2023 14:23
    +2

    Непосредственно для разработки линух мне очень нравится. Но к сожалению работа != разработка.

    Например с каких-то пор у меня не работает anyconnect для cisco. Недавно начались проблемы с kmail + ews, пришлось устанавливать evolution, который тоже работает не идеально. И т.д. постоянно происходит какая-нибудь фигня, которую неважно прям превозмогать.


  1. Semigradsky
    09.06.2023 14:23
    +2

    Чтобы не было холиваров - ставим Windows и включаем WSL. Красота)


    1. khajiit
      09.06.2023 14:23

      А как ее снепшотить? Как загрузиться со снепшота, если основная конфигурация полетела? )


      1. selivanov_pavel
        09.06.2023 14:23
        +1

        Пока не приходилось, но вроде как-то так:

        wsl --export --vhd <Distribution Name> <FileName>
        wsl --import --vhd <Distribution Name> <InstallLocation> <FileName>

        Можно без --vhd, тогда будет tar вместо дискового образа.


        1. khajiit
          09.06.2023 14:23

          Спасибо, но, не отрицая пользы вашего коммента, вопрос таки был про винду =)


          1. slonopotamus
            09.06.2023 14:23

            Засунули винду в виртуалку, сняли с виртуалки снапшот.


            1. khajiit
              09.06.2023 14:23
              +1

              Двойная виртуализация, однако, выйдет, если нужен докер или производительная ФС. Ну и исходному комменту это противоречит )
              А так да.


              1. slonopotamus
                09.06.2023 14:23
                +2

                Если вам нужна производительная ФС, винду придётся вычеркнуть из схемы.


                1. khajiit
                  09.06.2023 14:23

                  Несомненно! Вот zfs для каджита — достаточно произодительная ФС. Но вопрос-то был не к вам )


    1. DevFM Автор
      09.06.2023 14:23

      Очень боюсь, что винда в части WSL пойдёт по пути EEE - Embrace, extend, and extinguish. Когда значительная часть разработчиков будут пробовать линукс через WSL, MS вполне может делать свои, несовместимые красивые штуки. Условно, вместо bash будет предлагать аналог powershell, несовместимый с линуксом. И те, кто живут в WSL-мире, не смогут жить в линукс-мире


  1. para9mm
    09.06.2023 14:23
    +6

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


    1. DevFM Автор
      09.06.2023 14:23

      Движ типа no-code раз в десять лет приходит и успешно загибается. Конкретно bash с нами 30 лет и не видно, чтобы набирала популярность какая-то альтернатива. Я очень удивлён, что более user-friendly терминалы не могут набрать критическую массу пользователей - вероятно, таки bash не настолько плох, чтобы мотивировать куда-то переходить


      1. randomsimplenumber
        09.06.2023 14:23
        +1

        более user-friendly терминалы не могут набрать критическую массу пользователей

        Терминал - это программа, внутри которой запускается bash.

        bash не настолько плох

        Любой инструмент достаточно хорош в своей области. Говорят, zsh лучше. Но переучиваться я ниасилил.


        1. DevFM Автор
          09.06.2023 14:23

          В среднем, не понимаю терминологических споров на пустом месте. А терминал - это устройство. Программа, о которой говорите вы - это эмулятор терминала.

          Не вижу смысла разводить демагогию bash vs shell vs terminal


          1. randomsimplenumber
            09.06.2023 14:23

            не понимаю терминологических споров на пустом месте

            Как же в клубе зануд без председателя;)

            Ну и неплохо, когда все пользуются общей терминологией.кмк, gnome-terminal достаточно user friendly.


            1. DevFM Автор
              09.06.2023 14:23
              +1

              Да, общая терминология - это важно во многих случаях. Конкретно эта троица так друг в друга проросла, что вот линейка "вы запускаете GUI terminal emulator, оно запускает shell, который обычно bash как конкретная реализация шелла" в среднем неважна. В плане, на GUI обычно плевать (ну, вот я использую terminator, но я оттуда юзаю infinite scroll, цвет, split screen, вроде всё). Дальше, те, кто знаком с не-bash шеллами, понимают, о чём речь при вопросе bash vs shell. Для остальных это всё терминал и всё


          1. 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.


            1. DevFM Автор
              09.06.2023 14:23

              Спасибо за статью. Всегда искал, куда людей про TTY тыкать, т.к. на пальцах я только на уровне "ну, это такое устройство псевдо-файл и он есть по историческим причинам" могу объяснить


  1. 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 работать.


    1. DevFM Автор
      09.06.2023 14:23

      Подскажите, где именно я предлагаю не POSIX-решение?

      GUI приходится учить. Любая сложная программа требует времени на освоение. А потом меняет интерфейс и всё по новой. Даже word редизайнился уже столько раз, что грустно об этом говорить. А сила bash в том, что приобретённые знания будут с вами десятки лет. Это, конечно, тянет назад огромным количеством легаси. Но для других языков, вы к курсе, через 10 лет уже не запустить свои наработки - в языках всё меняется

      А docker для backend dev / datascience насколько сейчас глубоко врос, как и гит. Не знаю, где посмотреть свежую аналитику, но docker уже давно в backend developer roadmap и в 50%+ вакансий