Pull to refresh

Comments 80

zsh умеет прекрасно автодополнять аргументы, например "systemc<TAB> rel<TAB> ng<TAB>" превращается в "systemctl reload nginx". А если он не может точно дополнить, то показывает возможные варианты из которых можно выбрать нужный пункт интерактивно:

$ systemctl re<TAB>
reboot -- Shut down and reboot the system <=== тут еще и курсор появляется
reenable -- Reenable one or more unit files
reload-or-restart -- Reload one or more units if possible, otherwise start or restart
reload -- Reload one or more units
rescue -- Enter system rescue mode
reset-failed -- Reset failed state for all, one, or more units
restart -- Start or restart one or more units
revert -- Revert unit files to their vendor versions

Windows Terminal тоже имеет дополнение

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

Например, в powershell за это отвечает модуль PSReadLine

Да, про автодополнение-то я и забыл упомянуть. Спасибо, что напомнил.

bash completion это все и делает. Можно дописать в bash completion автодополнение для любой утилиты. просто в zsh это уже сделано для некоторых системных утилит.

Ни zsh ни bash не смогут автодополнять аргументы неизвестной для них утилиты.

Кстати, в некоторых пределах могут. Где-то мне попадался код autocompletion, который тихонько дёргает запрашиваемую утилиту с аргументом --help, парсит оттуда ключи и подставляет их в список дополнения.

Где-то мне попадался код autocompletion, который тихонько дёргает
запрашиваемую утилиту с аргументом --help, парсит оттуда ключи и
подставляет их в список дополнения.

более того, в том же kubectl оно еще делает запросы к api серверу и показывает доступные объекты, ну например

$ kubectl get ns<TAB>
default          kube-node-lease  kube-public      kube-system      netpol-test

$ kubectl get pod -n kube-system <TAB>
coredns-6799fbcd5-tkrz7                  metrics-server-54fd9b65b-jdhgt
helm-install-traefik-44dvv               svclb-traefik-60f6a348-xt4gx
helm-install-traefik-crd-mzl2p           traefik-7d5f6474df-dcnfp
local-path-provisioner-6c86858495-r7xlw

$ kubectl create secret docker-registry test --docker-<TAB>
--docker-email     (Email for Docker registry)
--docker-password  (Password for Docker registry authentication)
--docker-server    (Server location for Docker registry)
--docker-username  (Username for Docker registry authentication)

Интересный вариант, но вы же понимаете, что не все утилиты выдают нормальный --help и отпарсить его не всякая нейросеть может корректно

Разумеется, я же и написал "в некоторых пределах". Мне и самому попадались инструменты, которые, скажем, сходу мне создавали объект с именем --help. А когда-то мне и вовсе выдалось чудесное:

$ /usr/bin/VBoxClient --help
VBoxClient: unrecognized option `--help'
Try `VBoxClient --help' for more information

Ни zsh ни bash не смогут автодополнять аргументы неизвестной для них утилиты.

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

$ kubectl completion --help
Output shell completion code for the specified shell (bash, zsh, fish, or
powershell). The shell code must be evaluated to provide interactive completion
of kubectl commands. This can be done by sourcing it from the .bash_profile.

Помимо заполнения стандартных приложений, в zsh нередко выручает подсказки по докеру

Штука годная, только потом после её длительного использования попадаешь в обычную консоль и как в анекдоте:

- Доченька, давай покажем, как мы выучили все месяца в году. Ну!.. Ян...?

- Варь!

- Фев...?

- Раль.

- Ну, давай сама!..

- Арт, Рель, Ай, Юнь, Юль, Густ, Ябрь, Ябрь, Ябрь, Ябрь!

Абсолютно так же все работает в баш с установленным автодополнением

Попадая куда-то на новое место, я вначале обустраиваю его. Ну а дальше, стандартный сценарий, только на alt + <number>могут быть иные актуальные директории

Мне регулярно приходится работать в терминальном линуксе, без иксов. Так вот, Ctrl+влево/вправо там не работают, но оказалось, что вместо них можно использовать Alt+B/F.

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

Кстати, а вы знали что в том же bash можно переключить режим с emacs на vi? И соответственно юзать все вимовские команды для работы с текстом. Просто введите "set -o vi".

Да, я знаю про такой режим, но хотя мне довольно часто приходится работать в vim, для меня он не является эталоном удобства. Скорее, вынужденным злом, когда окружение (терминал) не обладает достаточной гибкостью, и ради расширения набора функций приходится жертвовать удобством работы. Для правки командной строки эти возможности избыточны, а если и потребуется вдруг мега-правка, то всегда есть Ctrl+X+E.

Про emacs — интересная информация, я этого не знал, да и с самим emacs'ом дела иметь не приходилось. Так сложилось, что когда я знакомился с линуксом, окружающие линуксоиды предпочитали vi, так что стать емаксовцем у меня не было ни единого шанса. :-)

Довольно долго откладывал момент перехода на vi-mode в zsh, но с тех пор как переключился, уже с трудом представляю как жил до этого

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

Что за чушь? Самый яркий пример — ffmpeg для редактирования видео. Он умеет все, но каждый месяц я гуглю или прощу чатгпт написать мне команду чтобы отрезать/склеить/вытащить звук/етц у видео. И в любом графическом редакторе это делается на изи, даже если ты его используешь с той же частотой.

Вот для такого случая в статье и рассказано про скрипты. А ещё есть возможность просто записать пример, смотреть его уже описанными методами и ничего не гуглить.

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

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

И как они мне помогут, если у меня каждый раз новая задача? Если задача повторяется, я, конечно, напишу скрипт. А если у меня задача каждый раз чуть-чуть другая, мне скрипты не помогут.

не понимаю как для вас запомнить устройство gui, которое может всё, легче, чем запомнить устройство cli которое может всё.

Может у вас лучше развита зрительная память?

не понимаю как для вас запомнить устройство gui, которое может всё, легче, чем запомнить устройство cli которое может всё.

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

все ещё не понимаю в чем отличие поиска по вложенным менюшкам гуи от поиска по тексту мануала.

К слову, мануалы для cli утилит обычно написаны хорошо, в отличие от gui, где часто раскидают что куда ни попадя.

Могу для наглядности привести пример с mkvtoolnix. Скажем, мне надо вытащить одну дорожку. Что я делаю в командной строке? Сначала запускаю mkvinfo, он мне вываливает простыню текста, которую сначала надо промотать на несколько экранов обратно, во-вторых, вычленить глазами среди большого объёма никак не выделяющегося однотипного текста нужные маркеры: тип дорожки, её характеристики. Запомнить номер (или номера, если дорожек надо несколько). Начать вбивать команду mkvextract, вспомнить, что забыл точный синтаксис. Запустить мануал. Поискать несколько раз, потому что не уверен, по каким ключевым словам искать, "save" не находит ничего, а "extract" находит чуть менее чем весь мануал (что логично, учитывая название самой утилиты)… Ладно, у mkvextract мануал маленький, можно и целиком прочитать за пять минут, а бывают ведь и инструменты типа ffmpeg… ОК, нашли нужное. Выйти из мануала, снова начать набивать команду, осознать, что пока листал мануал, успел забыть номер. То ли 5, то ли 6… Снова прокручивать простыню текста обратно к нужной дорожке, ага, оказывается, номер 6, но указывать надо всё-таки 5. Возвращаемся к вводу, повторно вбиваем путь к файлу (а если хотим скопипастить — добро пожаловать в очередную прокрутку на несколько экранов наверх или в костыли с Ctrl+Shift+#, вызовом прежней команды по стрелке вверх и копированием файла оттуда). Ок, вбили, запустили — готово.

А теперь сравниваем с mkvtoolnix-gui. Запустили, добавили файл (или передали файл как аргумент на вход). Он тут же отобразил компактный и наглядный список имеющихся дорожек, по одной строчке на каждую, с разбивкой по колонкам, где сразу чётко видно и тип, и кодек, и язык, и вообще всё, что надо. Мышкой ткнул нужные галочки, не задумываясь, что там за номера и идентификаторы, и ткнул кнопку для выполнения задания. Не надо помнить синтаксис, не надо помнить терминологию, не надо постоянно гонять экран туда-сюда, копипастя куски команд, а достаточно ткнуть пальцем, что именно надо взять и что именно с этим надо сделать. То есть, да, нужную кнопку на экране необходимо сначала глазами найти, разумеется. Но структурированный блочный интерфейс позволяет это сделать в разы, если не на порядки быстрее, чем найти необходимые сведения в мануале и скомпоновать их в итоговую команду.

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

Так вы просто не умеете в консоли работать.
Например "вываливает простыню текста, которую сначала надо промотать на несколько экранов" - юзайте греп, юзайте less

" , вспомнить, что забыл точный синтаксис. Запустить мануал" - смотрите мануал в другой консоли. tmux в помощь

" А теперь сравниваем с mkvtoolnix-gui"
А теперь пробуем сделать нетипичное действие, которое умеет ffmpeg но не умеет гуй утилитка, потому что уже прям некуда впихнуть окошки?

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

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

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

Если очень хочется, можно сесть и за несколько часов наваять супер-скрипт, который будет парсить вывод, комбинировать нужные команды, запрашивать у пользователя необходимый минимум параметров в удобном промпте, не заставляя рыться в мануалах… И вот чудо-то, мы пришли к той же самой идее программы-обёртки! Но почему-то такие автоматизирующие скрипты для вас являются нормой существования, а графическая программа, делающая абсолютно то же самое — это уже фу и маздай. Почему? Только из-за того, что используются иксы вместо расово верного терминала?

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

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

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

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

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

P. S. Я тоже люблю консоль и неплохо пишу шелл-скрипты. Но это не мешает мне осознавать рамки их применимости и оценивать адекватность подходов разных инструментов для решения разных типов задач.

спасибо за подробное объяснение.

Но заявлять, что все другие инструменты нафиг никому не нужны

Я вполне допускаю что далеко не все удобнее в терминале. Иначе у меня и не было бы графического окружения .-.

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

В статье как раз и написано как. Задача у Вас точно не новая, максимум - чуть другая.

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

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

а теперь нам надо найти фотки по определенному критерию - дате создания/модификации/размеру/имени/разрешению/exif тегам. И обработать пакетно.

Ну как там, гуи все еще удобнее ?

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

$ ehco hello my world
$ ^ehco^echo^

Про это не забывайте.

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

Спасибо большое, про опцию "^" не знал.
Погуглил, очень благодарен. Дополню в статью через какое-то время.

Для меня самый полезный hotkey в терминале - это Esc + . (точка) - повтор последнего аргумента предыдущей команды.
Ещё, конечно же, повтор последней команды через !, например !cat
Ну и поиск Ctrl+R.

Про Esc + . не знал, спасибо. А можешь привести примеры команд, где это полезно?
Глянул history с домашнего ноута, не нашёл сходу применимости в своём случае.

Любые действия над одним и тем же файлом (или другим объектом). Скажем, просмотрел файл через less, понял, что не нужен, удалил через rm, напечатав только название команды и вставив путь к файлу через Esc+. (или Alt+.). Конечно, есть альтернатива: вызвать предыдущую команду и отредактировать, но это надо гонять курсор, удалять старый текст. Ввести команду и вставить готовый аргумент обычно проще и быстрее.

Есть ещё возможность вставки любого другого аргумента, необязательно последнего, через Esc+номер+. (отсчёт идёт с начала; если номер отрицательный, то с конца), но там довольно неудобно устроен ввод таких последовательностей. Часто быстрее оказывается взять мышку и выделить-вставить нужный кусок (если, конечно, система с графикой).

 Скажем, просмотрел файл через less, понял, что не нужен, удалил через rm, напечатав только название команды и вставив путь к файлу через Esc+. (или Alt+.). 

rm !$

Визуальный контроль зачастую важен. Можно по привычке запустить такую команду, не сообразив, что к предыдущей после имени файла было добавлено ещё что-то, и подставится на самом деле оно. А по Alt+. аргумент будет вставлен в интерактивном режиме, и если там что-то неожиданное, это сразу будет заметно. А ещё можно двигаться назад по истории, нажимая Alt+. несколько раз подряд, ибо часто бывает, что между двумя связанными командами было вызвано что-то ещё, какой-нибудь --help или man.

Ctrl+R в сочетании с fzf, это, что называется, game changer

Спасибо. Заберу на будущее.)

Напомнило forgit, жаль без поддержки fzf

grep "something" ./*

Нафейхуа?
grep -rn "something" .

Ну, формально, первый вариант пропустит файлы с точкой в текущем каталоге.

Кажется что лучше с zsh начать, возможностей и готовых удобств в нем сильно больше.

все-же лучше posix изучить. Ему много лет. За эти годы возникали вопросы, которые давным давно были решены.
Просто вместо того, чтобы сесть и перелистать внимательно все, что есть в /bin и /usr/bin, люди начинают писать новые утилиты. Вместо того, чтобы освоить sed/awk ставят nodejs (ну ладно если еще питон) и так далее..

Не, если вы модный и молодёжный и можете позволить себе пускать везде на серверах нормальный zsh то изучение posix - это остановк а в развитии. Оболочки шагнули достаточно далеко от этого стандарта и многие в свою сторону. А вот если у вас есть сервера с HP-UX/Solaris/scounix с sh то нужно и можно. Но это редкий энтепразный момент. На который я бы не затачивался. Стандарты очень часто застревают. И не успевают за прогрессом.

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

Уберите руку с клавиатуры и возьмите мышь, перейдите в панель запуска программ и найдите нужный текстовый редактор. Откройте программу. Щелкните в области редактирования текста. Уберите руку с мыши и введите „Hello World“ в файл. Уберите руку с клавиатуры и возьмите мышь, перейдите к значку или пункту меню, чтобы сохранить файл. Выберите место для его сохранения. Закройте файл.

чушь собачья

winkey (не важно, винда или линь), "texteditor" (любой на ваше усмотрение), он открывается и сразу печатаем, затем ctrl+s; да, надо будет выбрать куда сохранить, ну и?

Попробуйте теперь через echo и > создать маркдаун файл, удачи)

в том, что сравнивают мягкое с теплым

крайне редко приходится писать одну строчку в файл

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

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

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

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

нет, конечно, можно использовать awk/sed, но давайте будем честны, вы хоть раз таким занимались?)

vi/nano - консольные редакторы.
Не нужно путать командную строку и консоль =)

в той цитате речь именно об echo, а не о vi/nano)

да, на винде тоже есть шорткаты.

Но через какое-то время надоедает что поиск по винкей реально тупой (ввел одну букву не так или не в том порядке и удачи поискать это в bing). Ещё и открывается по 10 секунд периодически.

С ctrl+s, alt+f4 и остальными постоянная проблема с фокусом. То он есть, то теряется. Придется мышкой кликать по окну.

если еще не пробовали макось, то советую - там лучшее от обоих миров

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

макось не очень зашла по первым ощущениям, скорее всего не распробовал)

вообще ни в чем

это я к тому, что на маке удобно что так, что так работать)

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

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

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

Ctrl + X + E -> копирует всю текущую, набранную в терминале строку, в ваш editor по умолчанию. Помогает в случае, если вам нужно сохранить себе эту команду.

А за эту комбинацию спасибо — удобно в vim длинную команду подправить там же, а потом вернуться в консоль и выполнить!

удобно в vim длинную команду подправить там же, а потом вернуться в консоль и выполнить!

Проще тогда сразу шелл переключить в vi-mode, например в zsh достаточно `setopt VI`

Полагаю, преимущества CLI перед GUI не всегда в скорости выполнения операций, в общем случае это сильно зависит от поставленной задачи. Классический пример преимуществa GUI -- это редактирование графики, где на перемещеняе курсора и движение указателем завязано большинство действий. GUI при этом тоже дает задействовать клавиатуру, вводить команды, если это позволяет приложение, по сути пересекаясь по способам работы с CLI.

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

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

BTW, ещё у Джефа Раскина в его "The Human Interface" понятно описывалось, почему доступ к мыши является менее быстрым, если клавиатура является основным способом ввода.

Спасибо большое за точный и хорошо сформулированный комментарий про преимущества как GUI так и CLI. Добавлю в статью этот пункт, если позволите.

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

Важная часть работы с CLI и терминалом это навигация по файловой системе. Для чего в шеллах предоставляли алиасы, а позже появились и более продвинутые средства. Я несколько лет уже использую zoxide (обычно сокращается в терминале до команды "z") -- такой умный кеш, запоминающий ваше часто посещаемые директории и позволяющий быстро к ним переходить. Это конечно не единственная такая утилита, но в статье имхо следовало привести что-то из подобных программ, как пример эффективной навигации.

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

прям совсем-совсем навигация, так для этого есть консольные файловые менеджеры FAR и midnight commander

Нее, это всё же про другое, про интерактивные файловые операции, когда надо что-нибудь повыделять-покопировать. Интерфейсные концепции Norton Commander оказались очень живучими и возможно это идеальный интерфейс для таких задач. А вот быстро перейти в терминале из одного места в другое, просто набрав несколько букв пути -- для этого zoxide по-моему более эффективен.

А есть ещё zsh-suggestions и zsh-completions. И ещё есть fzf. Всё это плагины и ставится. Тоже дают силу, брат

Я бы еще посоветовал потенциально опасные команды начинать с пробела, чтобы они не попадали в историю. Пару раз обжигался с git push --force

$<пробел>git push --force -u origin feature/myBranch

только нужно убедиться что эта опция включена

Хочу ещё порекомендовать изучить VIM до уровня "свободно вношу мелкие правки". Как минимум потому, что большинство консольных утилит используют схожие горячие клавиши

Ещё утилиты-заменители:

Bottom — htop/top замена/дополнение

Bat — cat с подсветкой

Tspin (tails pin) — дополнение к tail с подсветкой

Docker Dry — управление Docker в консоли

Topgrade — обновление различных аспектов системы (от системных пакетов, заканчивая плагинами в vim-е)

Lsd (LS Deluxe) — удобный ls с подсветками и прочим

Du Dust — замена утилите Du (disk usage)

CLI настолько хорош и быстр, что автор написал статью про то, как его ускорить

Sign up to leave a comment.

Articles