Ghost in the Shell: Remake
В честь пятницы небольшой прикол, который встретился мне за пару недель уже раз 5-6 в разных источниках.
Чтобы посмотреть консольный ремейк Ghost in the Shell, введите к терминале следующую команду, откиньтесь на спинку кресла и наслаждайтесь.
ssh ghost@theshell.xyz
Исходный код и описание можно посмотреть на GitHub: https://github.com/esin/intheshell
Следуем пути
Раз упомянули про переменные, то давайте коротко о одной из самых важных из них — $PATH
, тем более что и статья подходящая попалась на днях. Посмотрите содержимое $PATH
.
echo $PATH
В этой переменной находится список путей разделённых двоеточиями, по этим путям ищутся утилиты, которые вы вводите в командах. $PATH
можно дополнять, и этим активно пользуются.
В системе может быть установлено несколько версий одной и той же программы. При поиске в $PATH
будет выполняться первая найденная. Узнать, какая именно версия выполнится, поможет which
, который покажет путь до исполняемого файла. А which -a
покажет все установленные версии.
В статье по ссылке всё то же, но на английском, чуть подробнее и в контексте Ruby.
https://robots.thoughtbot.com/following-the-path
Почему bash на MacOS такой старый?
Извините, пост для маководов. Такое будет не часто.
Выполните в консоли команду bash --version
. Если ранее вы специально не обновляли версию bash, то обнаружите, что установленная в системе версия празднует свой десятый день рождения в 2017 году.
Причина этого кроется в лицензии GPL. Вот небольшая выдержка из википедии:
The GPL License is incompatible with many application-distribution-systems, like the Mac App Store, and certain other software distribution platforms (on smartphones as well as PCs). The problem lies in the right "To make a copy for your neighbour", as this right is violated by the integrated DRM-Systems made to prevent copying of paid software. Even if the application is free-as-in-beer in the App Store in question, it might result in a violation of that app store's terms.
...
In other cases, such as the Ubuntu App Store, proprietary commercial software applications and GPL-licensed applications are both available via the same system; the reason that the Mac App Store (and similar projects) is incompatible with GPL-licensed apps is not inherent in the concept of an app store, but is rather specifically due to Apple's terms-of-use requirement that all apps in the store utilize Apple DRM-restrictions.
Т.е. всё дело в несовместимости яблочных terms-of-use с GPL.
Исправить дело достаточно просто с помощью Homebrew. Помимо простого brew install bash
понадобится ещё несколько простых манипуляций. Вот неплохая инструкция http://clubmate.fi/upgrade-to-bash-4-in-mac-os-x/.
А задумался я над этим, случайно наткнувшись на этот твит:
https://twitter.com/vhgalvao/status/849041797879869440
Wildcards
Вы наверняка знаете о существовании wildcards для команд в консоли: *
, ?
, []
. Применяя их в аргументах к разным командам можно делать многие вещи проще и удобнее. Например:ls *.html
— показать все html файлы в директорииfile ??? ????
— показать информацию по файлам из трёх и четырёх символовrm *.???
— удалить все файлы с трёхбуквенным расширениемfile [a-cst]*
– показать информацию по всем объектам, начинающимся с букв от a
до c
, а также с s
и t
mv public_html/*.??g public_html/images/
— переместить файлы, заканчивающиеся на g (предположительно jpg
и png
) в другую директорию
Комбинации с wildcards возникают в примерах работы с консолью регулярно.
Признаюсь, раньше я думал, что это все команды такие умные и принимают аргументы с содержанием специальных символов, самостоятельно обрабатывая их. Это неправда, всю работу выполняет оболочка. Именно она превращает набор символов в список реальных аргументов, отфильтрованных по указанному правилу, и передаёт в команду.
Чтобы посмотреть, во что развернутся аргументы команды, добавьте перед ней echo
:echo ls -la D
И увидите результат:ls -la Desktop Documents Downloads Dropbox
Особенно полезно для команд в стиле rm *
.
Также результат можно посмотреть с помощью TAB
.
Кстати, термин wildcard пришёл, конечно, из карточных игр, и ни один его перевод на русский не звучит адекватно.
Стоило показать канал опытному админу, как он прямо и правильно сказал, что мы тут пишем глупости и вообще позорище. Вот несколько грустных фактов-цитат в дополнение к предыдущим заметкам (авторская орфография и пунктуация местами отредактированы):
* половина кнопочек, которая тут описана, могут быть сконфигурированы по-разному
* что будут делать кнопочки в bash как правило зависит от конфига readline
, при этом zsh
его (ридлайн), вероятно, не использует
* немаководы активнее используют Page Up и Page Down
* делать sudo !!
никогда не стоит :)
* про кнопки тоже на самом деле неправда, биндятся последовательности символов, а не кнопки. Какая последовательность символов уйдет по той или иной кнопке может зависеть в основном от терминала (путти там, айтерм, эти вот). Как в общем-то и то что он рисует зависит от его представления о том, как надо обрабатывать те или иные последовательности. Есть как будто бы даже всякие стандарты и часть из них даже в ANSI, их обычно все и поддерживают.
* а шелл еще и от переменной окружения TERM может всякое разное слать, дабы не ломать сильно глупые терминалы. в итоге догадаться что произойдет по той или иной кнопке зачастую малореально :)
Придётся теперь с этим жить.
Но чтобы не унывать, вот вам пятничная шутка про Stories в Norton Commander
https://twitter.com/mrgan/status/847139272842887169
В школе на уроках истории я делал домашку по математике и физике, общался с одноклассниками и вообще мало уделял внимания речам Ангелины Николаевны. Теперь не жалею, могу беззаботно наступать на одни и те же грабли. Лишь иногда от созерцания окружающего мира появляется тревожное чувство, что где-то это уже было.
Но вернёмся к нашим экранам. Все знают history
и даже многие умеют ходить по ней с помощью ↑ и ↓. Особо продвинутые знают, что стрелки лучше работают, если часть команды уже ввести. Вот ещё несколько полезных сочетаний:ctrl+p
и ctrl+n
— листание истории вместо ↑ и ↓ctrl+r
— инкрементальный поиск вверх по истории, для листания вариантов нажать ещё разctrl+s
— инкрементальный поиск по истории «вниз» (у меня сработало только в zsh)
Помимо выполнения через Enter
выйти из инкрементального поиска можно с помощью ctrl+j
или ctrl+g
. Последнее оставит строку пустой.alt+p
— неинкрементальный поиск вверх по истории
Если помнить все команды по номерам в history
, то !n
— ваш друг.!!
выполнит ещё раз последнюю команду, но чаще вы будете делать sudo !!
.
Почему-то все мануалы очень любят alt+.
или !$
— выполнение последнего аргумента последней команды. Но я пока не проникся.
Историю можно посмотреть в файлах ~/.bash_history
или ~/.zsh_history
. Однажды меня очень спасла эта опция для просмотра истории команд другого пользователя на сервере.
Привет. Мы сделали этот канал, чтобы самим научиться эффективнее работать в командной строке и сойти за умных. Можете тоже так попробовать или просто понаблюдать. Мы знаем, что вам лень изучать man
. Подпишитесь на пока несуществующую рассылку, это модно: http://eepurl.com/cIo5_5
Полезные ключи grep
Уже больше одного человека прислало вопрос про то, как делать grep
и смотреть не только строку результата поиска, но и соседние. Это ещё раз доказывает, что вам лень читать man
. Поэтому вот вам заметка.
С помощью ключей -A
, -B
и -C
можно задавать, сколько строк покажет grep
соответственно до, после и вокруг найденной строки. Запомнить очень легко, как АБВ, правда?
Раз начали, вот ещё несколько ключей, а в конце ссылка на статью с примерами.grep -c searchstring filename
— покажет количество найденных строк, аналог пайпа в wc -l
grep -e foo -e bar -e baz file
— если нужно поискать несколько разных выражений, а регулярку писать не хочетсяgrep -E 'where|is|my|mind' nowhere.near
— если всё-таки хочется в регулярки, аналог использования egrep
-R
— поможет искать рекурсивно по директориям-i
— сделает поиск нечувствительным к регистру-v
— инвертнутый поиск, т.е. исключит из вывода строки с вхождением выражения
Почему-то grep
часто используют в сочетании с другими командами с помощью пайпов |
. При этом в большинстве кейсов, которые я видел и использовал раньше сам, можно обойтись без этого силами самого grep
.
https://habrahabr.ru/post/229501/
Что выведет команда?
Стоило завести умный канал, как друзья, коллеги и знакомые стали присылать запросы, вопросы или интересные находки. Давайте посмотрим на следующую простую команду, которую прислал Петя, и попробуем разобраться, что она сделает, выведет и почему.
FOO="h2Q3v$GjVHg772yQMG@5^@4?4v" && echo $FOO
Команда состоит из двух частей связанных через &&
. Двойной амперсанд позволяет выполнять команды последовательно друг за другом, причём так, что следующая выполняется только в случае успеха предыдущей (возвращается exit status равный нулю).
В первой части задаётся переменная FOO. Для названия переменных можно использовать символы [a-zA-Z_]
, по соглашению их обычно задают в верхнем регистре.
Во второй части с помощью команды echo
выводится только что заданное значение. Для доступа к переменной нужно добавлять знак $
.
Если бы это было всё, то на выводе мы получили бы h2Q3v$GjVHg772yQMG@5^@4?4v
, но это не так. Увидим мы h2Q3v@5^@4?4v
. Происходит это по нескольким причинам.
Во-первых, значение переменной окружено в двойные кавычки, поэтому дополнительно интерпретируется. Замените двойные кавычки на одинарные и предсказать результат вывода будет проще.
Во-вторых, значение в кавычках содержит знак доллара $
, поэтому часть строки $GjVHg772yQMG
воспринимается как переменная. Если до этого такую переменную не задавали, то интерпретируется она как пустая строка. Дальше @
имя переменной не проходит, так как это тоже специальный символ, и он не может быть частью имени.
Игры в консоли: OverTheWire Wargames
Изучать новое приятно в игровой форме.
Wargames — это набор игр, построенных по простой схеме: цель каждого уровня — найти пароль к следующему. Задания выполняются преимущественно прямо в консоли. Заходишь по ssh на сервер под указанным юзером и соображаешь, какие реальные команды нужно выполнить, чтобы достать пароль. В описании задания даются подсказки, что почитать и какие именно команды могут понадобиться.
Прохождение затягивает, в один присест прошёл половину игры Bandit. По пути узнал для себя кое-что новое, изучая man
команд и информацию по ссылкам.
Вот, например, несколько пригодившихся команд:cat ./-
— посмотреть содержимое файла с названием -
. Оказывается, не всегда достаточно только названия файла.find /home/ -type f -size 542c -exec ls {} \;
— найти файлы размером ровно 542 байтаls -lR
— рекурсивный ls
sort data.txt | uniq -u
— показать уникальные строки из файлаbase64 -d data.txt
— декодировать файл из base64cat data.txt | tr 'N-ZA-Mn-za-m' 'A-Za-z’
— расшифровать файл, закодированный по алгоритму rot13 и состоящий только из латинских букв
Полезного вам вечера.
http://overthewire.org/wargames/
Видео: Learning Vim in a Week
Пока готовится следующая заметка, посмотрите короткое и приятное видео для тех, кто уже умеет выходить из vim
и думает, как продвинуться в изучении этого редактора дальше.
Пара цитат из видео:
"It’s hard because it’s different.”
"Sometimes you gotta work a little so you can ball a lot.”
https://www.youtube.com/watch?v=_NUO4JEtkDw
Сегодня о редактировании команд. Про дополнение с помощью TAB
известно всем. Помимо этого есть много других полезных сочетаний.ctrl+d
— аналог delete; для пользователей Мака может быть удобнее, чем fn+backspace
alt+t
— меняет местами слово до курсора со словом после. Если применить в конце строки, то переставит два последних слова.alt+u
— перевести в верхний регистр от текущей позиции до конца словаalt+l
— перевести в верхний регистр от текущей позиции до конца словаalt+c
— перевести в верхний регистр первый символ (capitalize) слова от текущего курсора, т.е. если находимся в середине слова, то в верхний регистр переведётся текущая букваctrl+k
— удалить от текущей позиции до конца строкиctrl+u
— удалить от текущей позиции до начала строкиalt+d
— удалить от текущей позиции до конца словаctrl+w
— удалить от текущей позиции до начала слова
Если вы часто делаете опечатки в командах, то есть замечательная утилита с говорящим названием The Fuck, которая старается за вас.
https://github.com/nvbn/thefuck
Начнём с навигации, но не про cd
и урбанистику.
Как показал небольшой офисный опрос 50% из трёх разработчиков не знают, как перемещаться по текущему тексту команды в строке кроме как стрелочками. Помимо них есть много замечательных сочетаний клавиш:ctrl+a
— перейти в начало строкиctrl+e
— перейти в конец строкиalt+f
— в конец словаalt+b
— в начало слова
Если вы совсем не любите стрелочки, то можете использовать ещё и это:ctrl+f
— →ctrl+b
— ←
Если вы счастливый обладатель Mac и сочетания с alt (option/⌥) у вас не работают, то:
* для Terminal: Settings (⌘+,
) → Profiles → Keyboard, поставьте галочку на "Use Option as Meta Key"
* для iTerm: Settings (⌘+,
) → Profiles → Keys, в "Left (и/или Right) option ⌥ key act as" выберите "+Esc"
Все сочетания проверены в bash и zsh.