Как стать автором
Обновить

Комментарии 324

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

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

Я делаю так

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

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

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

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

Так же, как ставили до интернета (или когда интернеты были еще медленными и дорогими) - запустить установщик с внешнего носителя.

Ну так и на Linux тоже самое...

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

Если вы сейчас не постулировали самозарождение виндовых установщиков, то просто соврали.

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

У меня есть мой скриптик на винде. Как я могу сделать для него установщик штатными средствами?
Может я устарел, но никогда не слышал, чтобы в винде было что-то готовое, что входит в поставку.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

НЛО прилетело и опубликовало эту надпись здесь

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Если не ошибаетесь, то покажите как через функции ядра — NtCreateProcess или аналогичную, можно Zw-функцию — не импортируя юзерспейсные shell32, shellapi, com*, etc — открыть документ в ассоциированной программе, передав только путь к документу.


Еще со времен доса те же самые исполняемые файлы определялись по расширению

Вы сравнили прибитый гвоздями case с перезаписываемыми ассоциациями?
В винде, кстати, перебить ассоциацию exe-файлов можно — и это сломает юзерспейс. Но не ядро ;)


на уровне прикладной гуишной оболочки (shell32.dll), есть ассоциирование (которое можно использовать вызвав функцию семейства ShellExecute), и которое не имеет отношения к работе kernel32.dll

Поправил, не благодарите.


Вы опять с умным видом рассуждаете о том, в чем не разбираетесь. Зачем?


UPD Кстати, с dos тоже ошибка: указанный case находится в юзерспейсном command.com. А вот ядро (io.sys + msdos.sys) определяет формат файла по наличию MZ-заголовка: если его нет, то файл считается com.

shell32.dll это не прикладная, это системная часть ОС Виндовс.
В то время как bash/sh/dash/ksh вообще никакого отношения к ядру линукса не имеет, и пишутся они разными командами.

Ну, раз не верите каджиту — сходите в вику, и скажите, на каком уровне работает shell подсистемы win32, и сколько там слоёв ему контекстно переключаться до kernel.


Источником какая команда что писала не поделитесь? А то каджита терзают смутные сомнения, что хоть те, что писали ядро, и лажали но не настолько эпично, как эти.

На уровне архитектуры Windows NT, то есть это изначально заложено в архитектуру ОС. То что его реализовали в этой ос таким образом, это второй вопрос. Но программа запускается согласно ассоциациям по расширению. Если я переименую exe в txt, он не выполнится.

А в Линукс ассоацией занимается вообще сторонняя программа, которую писал не Линус Торвальдс и не те, кто изначально разрабатывали ядро юникс и составляли POSIX стандарт

На уровне архитектуры Windows NT, то есть это изначально заложено в архитектуру ОС

Следите за руками:


  • открываем cmd в привилегированном режиме
  • набираем три команды
    cd %windir%
    copy explorer.exe saboteur_kiev.УЧИМАТЧАСТЬ
    rem Оно оттабивается!
    saboteur_kiev.УЧИМАТЧАСТЬ .

После чего видим проводник, открытый в %windir%.


То есть:


  • ядро приняло произвольное имя файла к запуску
  • переименованный файл проводника корректно запустился
  • распарсил аргументы
  • выполнил вызов через DDL текущего shell

А вот попытка выполнить saboteur_kiev.УЧИМАТЧАСТЬ . из диспетчера задач или Win+R, которая, как раз, работает через шелловские ассоциации, вызовет диалог открытия неизвестного файла.

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

Делаем второй вариант, запускаем cmd и пишем

C:\>echo echo hello > учисам.bat
C:\>учисам.bat
hello
C:\>mv учисам.bat учисам.матчасть
C:\>учисам.матчасть

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

Никакого анализа файла не выполняется

Да-да, и IA64, aarch или PE64-бинарь на любой винде запустится просто так, вместо сообщения о неподдерживаемой архитектуре, которая проставляется флагом в заголовках PE.


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

а jpg запустится? а скрипт запустится? а waw запустится?

Нет, потому что виндовс не анализирует тип файла, у него ассоциация идет по расширению.

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

То есть дефолтное поведение - при запуске неизвестного формата, попробовать его выполнить как PE (несколько сигнатур). Именно так работает и Линукс - исполняемые файлы он распознает и выполняет по сигнатуре, причем есть сигнатура и для любых скриптовых файлов (в винде только исполняемые).

Но если мы говорим про все остальные ассоциации - виндовс смотрит исключительно на расширение.

Резюмируя:


  • Ассоциация с расширением есть в ядре исторически доказать вы не смогли, эксперимент каджита показал, что ядру плевать на расширение, если файл формата PE COFF (что, в общем-то, очевидно — если знать как запаскается исполняемый файл)
  • пункт выше опровергает утверждение об отсутствии анализа содержимого файла, иначе бы он не работал, а винда не могла бы даже начать загрузку
  • ваш контрэксперимент показал, что если в файле нечего анализировать — то он не анализируется (ВНЕЗАПНО, кто бы мог подумать)
  • На уровне архитектуры Windows NT ничего, способного запустить обрабатывающую программу по ассоциации вы привести не смогли тоже — и не сможете никогда, потому что архитектура заканчивается на Subsystem API (Win32 API в данном случае), а Shell API работает на несколько уровней выше
  • как следствие из предыдущего, механизм xdg, как общий для всех графических оболочек в Linux, на схеме будет располагаться ближе к ядру, чем в Windows аналогичный механизм ассоциаций

В качестве вишенки на торте можно добавить, что ассоциация для исполняемых файлов выглядит так: "%1" %* — да-да, программой для открытия exefile является сам открываемый файл. Очевидно, что в этом месте ядро с ассоциациями должно войти в бесконечный цикл еще на старте сервисов — или, все-таки, начать разбирать формат, что и происходит на самом деле.

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

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

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

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

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

В общем подсуммировали но каждый остался при своем =)

В общем подсуммировали но каждый остался при своем =)

Спорить можно бесконечно, если цель стоит поспорить, тут вы, несомненно, правы =)

ps 1:0 bash

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

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

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

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 - оставляет только имя файла, в таком виде устойчиво к пробелам внутри

спасибо, моя жизнь стала чуточку удобнее

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

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

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

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

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

:)

сломалось об слэш в имени файла

Пастуховские четверги ⧸ Владимир Пастухов* и Алексей Венедиктов** ⧸⧸ 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'

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

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

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

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

:)

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

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

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

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

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

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

это работает, но теперь мы же хотели с 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

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

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

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

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

ну вот, за час попыток удалось-таки создать однострочник для открытия файла.

баш такой баш :)

P.S: если кто захочет в .bash_aliases засунуть, не забудьте экранировать кавычку.

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

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

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

Можно весь вывод убить с помощью 2>/dev/null в конце

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

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

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

Благодарю!

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

nohup ./Logic-2.3.56-master.AppImage &

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

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.

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

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

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

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

$ uname -a
Linux saboteur-ubuntu 5.19.0-31-generic #32-Ubuntu SMP PREEMPT_DYNAMIC Fri Jan 20 15:20:08 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux

$ grep PRETTY /etc/os-release
PRETTY_NAME="Ubuntu 22.10"

И тут внезапно я понял что я опечатался. Там должен быть не сорт, а ls

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

Да, ls -1 везде существует. А sort -1 в специфических ситуациях :)

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

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

Думаю, что-то вроде этого:

xdg-open "`stat -c '%y %n' Downloads/*|sort|tail -n 1|sed 's/^[0-9-]*\ [0-9:.]*\ +[0-9]*\ //'`"

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

nohup xdg-open "$(find ~/Downloads/ -type f | xargs -I '{}'  stat --printf='%Y %n\n'  '{}' | sort | tail -n 1 | awk '{ print $2}')" &

UPD: уже после того как написал свой вариант увидел что выше уже предложили похожие варианты ))

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

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

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

я уже под этим постом чего только не наслушался)

и синтаксис нормальный у баша, просто надо чучуть запомнить, и задача не та, и разработчики целыми днями уникальные строки в файлах ищут :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

итп

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

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

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

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

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

для aria2c, wget, итп?

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

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

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

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

aria2c, wget, итп

man bash /alias

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Скорее всего история развивалась вот так:

  • В 1970-х годах был создан Unix в котором была командная оболочка Bourne shell (sh). Unix стал популярным, но был проприетарным.

  • В 1983 начался проект GNU, что бы создать операционную систему похожую на Unix, но свободную.

  • В 1989 года появилась бета-версия BASH, как замена sh из Unix.

  • В 1991 год началась история ядра Linux.

  • С первой половины 1990-х и по наши дни начали собирать дистрибутивы на базе ядра Linux и ПО написанного проектом GNU. Так GNU Bash стал стандартом де-факто в большинстве дистрибутивов GNU/Linux.

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

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

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

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

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

И всё-таки в стандарте POSIX в томе "Shell and Utilities" есть глава "Shell Command Language" в которой описан синтаксис языка shell.

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

это — дерьмо. смешно и нелепо спотыкаться о пробел/спецсимвол в имени файла в 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>

Упс.

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

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

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

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

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

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

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

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

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

В этом однострочнике как бы проблемы тоже нет:
find /tmp -type f -name '*.txt' 2>/dev/null | xargs -I '{}' stat --printf '%Y <%n>\n'  '{}'
1686481894 </tmp/какая-то директория с пробелами/файл с пробелами два.txt>
1686481891 </tmp/какая-то директория с пробелами/файл с пробелами раз.txt>

Как насчет

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

;)

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>

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

В некоторых случаях экранирование и разделение приходилось решать совсем интересно:


# 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 $?
}

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

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

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

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

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

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

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

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

каркозябры обычно начинаются если бинарник вывести в консоль как есть

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

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

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

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

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

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

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

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

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

Сtrl+f, "*.ext", ctrl+c\ctrl+v(или f5\f6) в любом вменяемом файловом менеджере.

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

погрепать заданную переменную в куче мейкфайлов

Сtrl+f, "*.mk" "VAR_NAME" в любом вменяемом файловом менеджере. Или в открыть папку в любом вменяемом текстовом редакторе и ctrl+f "VAR_NAME"

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

пощадите

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

В контексте статьи все таки речь идет о 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.

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

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

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

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

Определение Shell это цитата из документа:

The Open Group Base Specifications Issue 7, 2018 edition IEEE Std 1003.1-2017 (Revision of IEEE Std 1003.1-2008) Copyright © 2001-2018 IEEE and The Open Group

Ну теперь ясно, что вырезали кусок вне контекста.

Начало документа описывает
POSIX.1-2017 defines a standard operating system interface and environment, including a command interpreter (or “shell”)

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

А гуишный - он в POSIX вообще не указан, ибо не является частью стандарта. Но он тоже shell, согласно терминологии

Описание и ссылки на то, что есть шелл в разных ОС, можно посмотреть в вики https://en.wikipedia.org/wiki/Shell_(computing)

Вы видимо пропустили вот эту мою фразу.

В контексте статьи все таки речь идет о shell как он определяется стандартами Unix.

Статья про текстовый командный интерфейс и GUI тут ни причем.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Факт

Если загуглить "ubuntu heic to jpg" среди первых ссылок будет ман, в котором предлагается heif-convert. Если попробовать его выполнить, то вывод будет такой

$ heif-convert

Command 'heif-convert' not found, but can be installed with:

sudo apt install libheif-examples

Вот и он

Отличный вопрос, кроме гугла, как предложили выше, есть еще метод:

$ 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
``°

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Да

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

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

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

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

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

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

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

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

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

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

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

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

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

Во всех curl | bash?

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

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

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

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

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

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

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

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

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

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

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

https://asciinema.org/a/468242

Ну, поехали

Легко поставить софт

Давайте поставим 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

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

Заключение

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

apt install virtualbox

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Если бы линукс-сообщество вместо рассказвания сказок какой линукс прекрасный, работало бы над тем чтобы его реально таким сделать, доля линукса на десктопе была бы сильно выше 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-разработчиков про десятикратную разницу между крутыми и посредственными разработчиками

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Giteye

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

gitkraken

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

100500 оставшихся

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Синтаксис простой:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

В отличии от apt

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

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

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

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

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

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

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

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

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

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

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

Скопипастить несколько команд в консоль очень просто. Найти необходимые команды с необходимыми ключами в 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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Условно, вместо bash будет предлагать аналог powershell, несовместимый с линуксом.
Как будто это что-то плохое)

Плохо - это в концепции EEE разрушить линукс-сообщество, замкнув всё на себя

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

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

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

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

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

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

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

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

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

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

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

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

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

Так что, bash и терминал не всегда связаны.

даже в /etc/passwd вы прямо можете указать дефолтный shell для юзеров. И вместо bash, прописать там, например, python или date или nologin

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

В том то и дело, что terminal и shell в мире Unix это разные вещи.

Хотелось бы в статье видеть употребление правильных терминов. Эти термины существуют уже несколько десятков лет и даже определены стандартами POSIX.

Если интересно в чем различие между termina, pseudoterminal, console, virtual console, terminal emulator, shell, то рекомендую статью "Hello, World! Глубокое погружение в Терминалы".

А что касается bash, то это конкретная реализация shell. Так же и zsh - это тоже реализация shell.

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

Во-первых, стоило бы отметить, что примеры команд - не для Linux вообще, а для Ubuntu/Debian.

Во-вторых, терминал с довольно продвинутым языком уже давно существует и для Windows: PowerShell. Кстати, с можно и по SSH подключиться к удалённому Windows и работать с PowerShell.

В-третьих. GUI учить не нужно: он для этого и предназначен, чтобы его можно было не учить, и так все будет понятно. А вот shell это фактически язык программирования. Может, уж лучше выучить Python, который и на Windows так же хорош?

Единственным серьёзным фактором является то, что есть программы, которые на Windows есть, а на Linux нет, и наоборот. Или есть аналоги, но слишком убогие. Или на одной из них они работают гораздо хуже, чем на другой. Скажем, есть библиотеки Python, которые на Windows не поддерживаются. И тутужевопрос будет - что Вам нужно для работы. Или в дело вмешивается политика, как сейчас с импортозамещением.

Если Вы делаете Docker images, то тут всё понятно, потому что Docker это фактически Linux, и тогда уж лучше с самого начала на Linux работать.

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

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

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

time sort rockyou.txt | uniq | wc -l

Зачем лишний пайп и лишний вызов wc? У uniq есть ключик -c
time sort rockyou.txt | uniq -c

uniq -c к каждой строке дописывает число раз, которое строка встречается. При этом он выводит все строки. Ответа в виде "всего X уникальных строк" этой командой не получить

Кстати, вы пробовали, сколько по времени выводится 10+ млн строк? Это занимает довольно много времени

Да, прошу прощения, перепутал с grep -c, хотел удалить комментарий, но не нашёл как это сделать.
Конечно | uniq -c покажет количетво уникальных записей и это явно не то что требовалось.

Публикации

Истории