diff --git a/README-ru.md b/README-ru.md index d6e71e0..3c2f3e9 100644 --- a/README-ru.md +++ b/README-ru.md @@ -18,69 +18,67 @@ ![curl -s 'https://raw.githubusercontent.com/jlevy/the-art-of-command-line/master/README.md' | egrep -o '`\w+`' | tr -d '`' | cowsay -W50](cowsay.png) -Продвинутому использованию командной строки зачастую не уделяют достаточного внимания, о терминале говорят, как о чём-то мистическом; на самом же деле это умение очевидно и неочевидно увеличивает Вашу продуктивность в работе. Данный документ является подборкой заметок и советов, которые я нашёл для себя полезными, работая с командной строкой в Linux. Некоторые из их них просты и очевидны, но некоторые довольно сложны и предназначены для решения конкретных задач. Это небольшая публикация, но если Вы знаете обо всём, что тут написано, и можете вспомнить, как это всё использовать, – Вы много знаете! +Продвинутому использованию командной строки зачастую не уделяют достаточного внимания, о терминале говорят, как о чём-то мистическом; на самом же деле — это умение прямо или косвенно увеличивает Вашу продуктивность в работе. Данный документ — это подборка заметок и советов, которые я нашёл для себя полезными, работая с командной строкой в Linux. Некоторые из них — простые и очевидные, но некоторые — довольно сложные и предназначены для решения конкретных задач. Это небольшая публикация, но если вы знаете обо всём, что тут написано, и можете вспомнить, как это всё использовать — вы много знаете! -Многое из того, что тут написано -[изначально](http://www.quora.com/What-are-some-lesser-known-but-useful-Unix-commands) +Многое из того, что тут написано, [изначально](http://www.quora.com/What-are-some-lesser-known-but-useful-Unix-commands) [появилось](http://www.quora.com/What-are-the-most-useful-Swiss-army-knife-one-liners-on-Unix) -на [Quora](http://www.quora.com/What-are-some-time-saving-tips-that-every-Linux-user-should-know), -начав идею там, похоже, что стоит развить ее на Github, где обитают люди, которые талантлевее меня и могут предлагать улучения данной подборки. Если Вы заметили ошибки (во всех вариантах перевода), пожалуйста оставьте тикет или киньте пулл-реквест (заранее изучив описание и посмотрев на уже созданнные тикеты и пулл-реквесты). +на [Quora](http://www.quora.com/What-are-some-time-saving-tips-that-every-Linux-user-should-know). +Начав идею там — похоже, что стоит развить её на Gihub, где обитают люди, талантливее меня, и могут предлагать улучшения данной подборки. Если вы заметили ошибки (во всех вариантах перевода), пожалуйста, оставьте тикет или киньте пулл-реквест (заранее изучив описание и посмотрев на уже созданнные тикеты и пулл-реквесты). ## Описание Основное: - Данная публикация предназначена как для новичков, так и для опытных людей. Цели: *объёмность* (собрать все важные аспекты использования командной строки), *практичность* (давать конкретные примеры для самых частых юзкейсов) и *краткость* (не стоит углубляться в неочевидные вещи, о которых можно почитать в другом месте). -- Этот документ написан для пользователей Linux, с единственным исключеним – секцией "[MacOS only](#macos-only)". Все остальное подходит и может быть установлено под все UNIX/MacOS системы (и даже Cygwin). -- Фокусируемся на интерактивном Баше, но многие вещи так же могут быть использованы с другими шеллами; и в общем приминимы к Баш-скриптингу -- Эта инструкция включает в себя стандартные Unix команды и те, для которых нужно устанавливать сторонние пакеты – они настолько полезны, что стоят того, чтобы их установили +- Этот документ написан для пользователей Linux, с единственным исключением – секцией "[MacOS only](#macos-only)". Всё остальное подходит и может быть установлено под все UNIX/MacOS системы (и даже Cygwin). +- Фокусируемся на интерактивном Баше, но многие вещи также могут быть использованы с другими шеллами; и в общем применимы к Баш-скирптингу. +- Эта инструкция включает в себя стандартные Unix-команды и те, для которых нужно устанавливать сторонние пакеты – они настолько полезны, что стоят того, чтобы их установили. Заметки: -- Для того, чтобы руководство оставалось одностраничным, вся информация вставлена прямо сюда. Вы достаточно умные для того, чтобы самостоятельно изучить вопрос более детально в другом месте. Используйте `apt-get`/`yum`/`dnf`/`pacman`/`pip`/`brew` (в зависимости от вашей системы управления пакетами) для установки новых програм. +- Для того, чтобы руководство оставалось одностраничным, вся информация вставлена прямо сюда. Вы достаточно умны для того, чтобы детальнее изучить вопрос в другом месте. Используйте `apt-get`/`yum`/`dnf`/`pacman`/`pip`/`brew` (в зависимости от вашей системы управления пакетами) для установки новых програм. -- На [Explainshell](http://explainshell.com/) можно найти простое и детальное объясение того, что такое команды, флаги, пайпы и т.д. +- На [Explainshell](http://explainshell.com/) можно найти простое и подробное объяснение того, что такое команды, флаги, пайпы и т.д. ## Основы -- Выучите основы Баша. Просто возьмите и напечатайте `man bash` в терминале и хотя бы просмотрите его; он довольно просто читается и он не очень большой. Другие шеллы тоже могут быть хороши, но Баш – мощная программа и Баш всегда под рукой (использование *исключительно* zsh, fish и т.д., которые наверняка круто выглядят на Вашем ноуте во многом Вас ограничивает, например Вы не сможете использовать возможности этих шеллов на уже существующем сервере). +- Выучите основы Баша. Просто возьмите и напечатайте `man bash` в терминале и хотя бы просмотрите его; он довольно просто читается и он не очень большой. Другие шеллы тоже могут быть хороши, но Баш – мощная программа, и Баш всегда под рукой (использование *исключительно* zsh, fish и т.д., которые наверняка круто выглядят на Вашем ноуте, во многом Вас ограничивает: например, вы не сможете использовать возможности этих шеллов на уже существующем сервере). -- Выучите хотя бы один консольный редактор текста. Идеально Vim (`vi`), ведь у него нет конкурентов, когда вам нужно быстренько что-то подправить (даже если Вы постоянно сидите на Emacs/какой-нибудь тяжелой IDE или на каком-нибудь модном хипстерском редакторе) +- Выучите хотя бы один консольный редактор текста. Идеально – Vim (`vi`), ведь у него нет конкурентов, когда вам нужно быстренько что-то подправить (даже если вы постоянно сидите на Emacs или какой-нибудь тяжёлой IDE, или на модном хипстерском редакторе). - Знайте как читать документацию через `man` (для любознательных – `man man`; `man` по углам документа в скобках добавляет номер, например 1 – для обычных команд, 5 – для файлов, конвенций, 8 – для административных команд). Ищите мануалы через `apropos`, и помните, что некоторые команды – не бинарники, а встроенные команды Баша, и помощь по ним можно получить через `help` и `help -d`. -- Узнайте о том, как перенаправлять ввод и вывод через `>` и `<` и пайпы `|`. Помните, что `>` – переписывает выходной файл, а `>>` добавляет к нему. Узнайте побольше про stdout and stderr. +- Узнайте о том, как перенаправлять ввод и вывод через `>` и `<` и пайпы `|`. Помните, что `>` – переписывает выходной файл, а `>>` добавляет к нему. Узнайте побольше про stdout и stderr. -- Узнайте побольше про file glob expansion with `*` (and perhaps `?` and `{`...`}`), кавычки а так же разницу между двойными `"` и одинарными `'` кавычками. (Больше о расширении переменных читайте ниже) +- Узнайте побольше про file glob expansion with `*` (и, возможно, `?` и `{`...`}`), кавычки, а также разницу между двойными `"` и одинарными `'` кавычками. (Больше о расширении переменных читайте ниже.) - Будьте знакомы с работой с процессами в Bash: `&`, **ctrl-z**, **ctrl-c**, `jobs`, `fg`, `bg`, `kill`, и т.д. -- Знайте `ssh`, и основы беспарольной аунтефикации через `ssh-agent`, `ssh-add`, и т.д. +- Знайте `ssh` и основы беспарольной аутентификации через `ssh-agent`, `ssh-add`, и т.д. -- Основы работы с файлами: `ls` и `ls -l` (в частности узнайте, что значит каждый столбец в `ls -l`), `less`, `head`, `tail` и `tail -f` (или даже лучше, `less +F`), `ln` и `ln -s` (узнайте разницу между символьными ссылками и жесткими ссылками и почему жёсткие ссылки лучше), `chown`, `chmod`, `du` (для быстрой сводки по использованию диска: `du -hk *`). Для менеджмента файловой системы, `df`, `mount`, `fdisk`, `mkfs`, `lsblk`. +- Основы работы с файлами: `ls` и `ls -l` (в частности, узнайте, что значит каждый столбец в `ls -l`), `less`, `head`, `tail` и `tail -f` (или даже лучше – `less +F`), `ln` и `ln -s` (узнайте разницу между символьными ссылками и жёсткими ссылками, и почему жёсткие ссылки лучше), `chown`, `chmod`, `du` (для быстрой сводки по использованию диска: `du -hk *`). Для менеджмента файловой системы, `df`, `mount`, `fdisk`, `mkfs`, `lsblk`. - Основы работы с сетью: `ip` или `ifconfig`, `dig`. -- Хорошо знайте регулярные выражения и разные флаги к `grep`/`egrep`. Такие флаги как `-i`, `-o`, `-A`, и `-B` стоит знать. - -- Обучитесь использованию системами управления пакетами `apt-get`, `yum`, `dnf` или `pacman` (в зависимости от дистрибутива). Знайте как искать и устанавливать пакеты и обязательно имейте установленым `pip` для установки командных утилит, написаных на Python (некоторые из тех, что вы найдете ниже легче всего установить через `pip`) +- Хорошо знайте регулярные выражения и разные флаги к `grep`/`egrep`. Такие флаги, как `-i`, `-o`, `-A`, и `-B` – стоит знать. +- Обучитесь использованию системами управления пакетами `apt-get`, `yum`, `dnf` или `pacman` (в зависимости от дистрибутива). Знайте, как искать и устанавливать пакеты и обязательно имейте установленым `pip` для установки командных утилит, написаных на Python (некоторые из тех, что вы найдёте ниже, легче всего установить через `pip`). ## Ежедневное использование -- Используйте таб в Баше для автокомплита аргументов к командам и **ctrl-r** для поиска по истории командной строки +- Используйте **tab** в Баше для автодополнения аргументов к командам и **ctrl-r** для поиска по истории командной строки -- Используйте **ctrl-w** в Баше для того, чтобы удалить последнее слово в команде; **ctrl-u** для того, что бы удалить команду полностью. Используйте **alt-b** и **alt-f** для того, чтобы бегать между словами команды, **ctrl-k** для того, чтобы прыгнуть к концу строки, **ctrl-l** для того, чтобы очистить экран. Гляньте на `man readline` чтобы узнать о всех шорткатах Баша. Их много! Например, **alt-.** бежит по предыдущим аргументам команды, а **alt-*** расширяет глоб.?? +- Используйте **ctrl-w** в Баше для того, чтобы удалить последнее слово в команде; **ctrl-u** – чтобы удалить команду полностью. Используйте **alt-b** и **alt-f** для того, чтобы бегать между словами команды, **ctrl-k** – чтобы удалить символы от курсора до конца строки, **ctrl-l** – чтобы очистить экран. Взгляните на `man readline`, чтобы узнать о всех клавиатурных сокращениях Баша. [Их много](http://ss64.com/bash/syntax-keyboard.html)! Например, **alt-.** вставляет последний аргумент предыдущей команды, а **ctrl-x *** [разворачивает глоб](http://superuser.com/questions/215950/how-to-expand-on-bash-command-line). -- Если Вам нравятся шорткаты Вима сделайте `set -o vi`. +- Если Вам нравятся шорткаты Вима, сделайте `set -o vi`. -- Для того, чтобы посмотреть историю введите `history`. Так же существует множество аббревиатур, например `!$` – последний аргумент, `!!` – последняя команда, хотя эти аббревиатуры часто заменяются шорткатами **ctrl-r** и **alt-.**. +- Чтобы посмотреть историю, введите `history`. Также, существует множество аббривиатур, например, `!$` – последний аргумент, `!!` – последняя команда, хотя эти аббривиатуры часто заменяются шорткатами **ctrl-r** и **alt-.**. -- Для того, чтобы прыгнуть к последней рабочей директории – `cd -` +- Перейти к последней рабочей директории – `cd -` -- Если Вы написали команду наполовину и вдруг передумали нажмите **alt-#** для того, чтобы добавить `#` к началу и отправьте команду как комментарий. Потом вы сможете вернуться к ней через историю. +- Если вы написали команду наполовину и вдруг передумали, нажмите **alt-#**, чтобы добавить `#` к началу, и отправьте команду как комментарий. Потом вы сможете вернуться к ней по истории. -- Не забывайте использовать `xargs` (или `parallel`). Это очень мощная штука. Обратите внимание, что Вы можете контролировать количество команд на каждую строку, а так же параллельность. Если Вы не уверены, что делаете что-то правильно, начните с `xargs echo`. Еще `-I{}` – полезная штука. Примеры: +- Не забывайте использовать `xargs` (или `parallel`). Это очень мощная штука. Обратите внимание, что вы можете контролировать количество команд на каждую строку и их параллельность. Если вы не уверены, что делаете всё правильно, начните с `xargs echo`. Ещё `-I{}` – полезная штука. Примеры: ```bash find . -name '*.py' | xargs grep some_function cat hosts | xargs -I{} ssh root@{} hostname @@ -88,45 +86,45 @@ - `pstree -p` – полезный тип вывода дерева процессов. -- Используйте `pgrep` или `pkill` для того чтобы находить/слать сигналы к процессам по имени (`-f` помогает). +- Используйте `pgrep` или `pkill`, чтобы находить/отсылать сигналы к процессам по имени (помогает `-f`). -- Знайте разные сигналы, которые можно слать процессам. Например, чтобы приостановить процесс используйте `kill -STOP [pid]`. Для полного списка посмотрите `man 7 signal`. +- Знайте разные сигналы, которые можно отсылать процессам. Например, чтобы приостановить процесс, используйте `kill -STOP [pid]`. Для полного списка посмотрите `man 7 signal`. -- Используйте `nohup` или `disown` для того, чтобы процесс в фоне выполнялся бесконечно. +- Используйте `nohup` или `disown`, чтобы процесс в фоне выполнялся бесконечно. -- Узнайте какие процессы слушают порты через `netstat -lntp` или `ss -plat` (для TCP; добавьте `-u` для UDP). +- Узнайте, какие процессы слушают порты через `netstat -lntp` или `ss -plat` (для TCP; добавьте `-u` для UDP). -- Так же `lsof` для того, чтобы посмотреть открытые сокеты и файлы. +- Также – `lsof` для того, чтобы посмотреть открытые сокеты и файлы. -- Используйте `alias` чтобы создать псевдонимы для часто используемых команд. Например, `alias ll='ls -latr'` создаст новый алиас `ll`. +- Используйте `alias`, чтобы поименовать частоиспользуемые команды. Например, `alias ll='ls -latr'` создаст новое сокращение `ll`. -- В Баш скритах используйте `set -x` для того, чтобы дебажить аутпут. Используйте строгие режимы везде, где возможно. Используйте `set -e` для того, чтобы прекращать выполнение при ошибках. Используйте `set -o pipefail` для того, чтобы строго относится к ошибкам (это немного глубокая тема). Для более сложных скриптов так же используйте `trap`. +- В Баш-скритах используйте `set -x`, чтобы отлаживать вывод. Используйте строгие режимы везде, где возможно. Используйте `set -e` для того, чтобы прекращать выполнение при ошибках. Используйте `set -o pipefail`, чтобы строго относиться к ошибкам (это немного более глубокая тема). Для более сложных скриптов выбирайте `trap`. -- В Баш скриптах, подоболочки (subshells) – удобный способ группировать команды. Один из самых распространенных примеров – временно передвинуться в другую рабочую директорию, вот так: +- В Баш-скриптах под-оболочки (subshells) – удобный способ группировать команды. Один из самых распространённых примеров – временно перейти в другой рабочий каталог: ```bash # do something in current dir (cd /some/other/dir && other-command) # continue in original dir ``` -- В Баше много типов пространства переменных. Проверить, существует ли переменная – `${name:?error message}`. Например, если Баш-скрипту нужен всего один аргумент просто напишите `input_file=${1:?usage: $0 input_file}`. Арифметическая область видимости: `i=$(( (i + 1) % 5 ))`. Последовательности: `{1..10}`. Обрезка строк: `${var%suffix}` и `${var#prefix}`. Например, если `var=foo.pdf` тогда `echo ${var%.pdf}.txt` выведет `foo.txt`. +- В Баше много типов пространств имён. Проверить, существует ли переменная – `${name:?error message}`. Например, если Баш-скрипту нужен всего один аргумент, просто напишите `input_file=${1:?usage: $0 input_file}`. Арифметическая область видимости: `i=$(( (i + 1) % 5 ))`. Последовательности: `{1..10}`. Обрезка строк: `${var%suffix}` и `${var#prefix}`. Например, если `var=foo.pdf`, тогда `echo ${var%.pdf}.txt` выведет `foo.txt`. -- Вывод любой команды можно обратить в файл через `<(some command)`. Например, сравнение локального файла `/etc/hosts с удаленным: +- Вывод любой команды можно сохранить в файлоподобный контекст по `<(some command)`. Например, сравнение локального файла `/etc/hosts с удалённым: ```sh diff /etc/hosts <(ssh somehost cat /etc/hosts) ``` -- Знайте про heredoc-синтаксис в Баше, работает он вот так `cat <logfile 2>&1`. Зачастую для того, чтобы убедится, что команда не оставит открытым файл, привязав его к открытому терминалу считается хорошей практикой добавлять `logfile 2>&1`. Зачастую, для того, чтобы убедиться, что команда не оставит открытым файл, привязав его к открытому терминалу, считается хорошей практикой добавлять `; ::Any-NFC; ' < input.txt > output.txt ``` -- Для того, чтобы разбить файл на куски используйте `split` (разбивает на куски по размеру), или `csplit` (по шаблону или регулярному выражению) +- Чтобы разбить файл на куски, используйте `split` (разбивает на куски по размеру), или `csplit` (по шаблону или регулярному выражению). -- Используйте `zless`, `zmore`, `zcat`, и `zgrep` для работы с сжатыми файлами. +- Используйте `zless`, `zmore`, `zcat`, и `zgrep` для работы со сжатыми файлами. ## Системный дебаггинг - Для веб-дебаггинга используйте `curl` и `curl -I`, или их альтернативу `wget`. Так же есть более современные альтернативы, типа [`httpie`](https://github.com/jakubroztocil/httpie). -- Чтобы получить информацию о диске/CPU/сети используйте `iostat`, `netstat`, `top` (или лучшую альтернатву `htop`) и особенно `dstat`. Хороший старт для того, чтобы понимать что происходит в системе. +- Чтобы получить информацию о диске/CPU/сети, используйте `iostat`, `netstat`, `top` (или лучшую альтернатву `htop`) и особенно `dstat`. Хороший старт для того, чтобы понимать что происходит в системе. -- Для более детальной информации используйте [`glances`](https://github.com/nicolargo/glances). Эта программа показывает сразу несколько разных статистик в одном окне терминале. Полезно, когда следите за сразу несколькими системами. +- Для более детальной информации используйте [`glances`](https://github.com/nicolargo/glances). Эта программа показывает сразу несколько разных статистик в одном окне терминала. Полезно, когда следите за сразу несколькими системами. -- Для того, чтобы следить за памятью научитесь понимать `free` и `vmstat`. В частности не забывайте, что кешированые значения ("cached" value) – это память, которую держит ядро и эти значения являются частью `free`. +- Для того, чтобы следить за памятью, научитесь понимать `free` и `vmstat`. В частности, не забывайте, что кешированые значения ("cached" value) – это память, которую держит ядро, и эти значения являются частью `free`. -- Дебаггинг Джавы – совсем другая рыбка, но некоторые манипуляции над виртуальной машиной Оракла или любой другой позволит вам использовать делать `kill -3 ` и трассировать сводки стека и хипа (включая детали работы сборщика мусора, которые бывают очень полезными), и их можно дампнуть в stderr или логи. +- Отладка Джавы – совсем другая рыбка, но некоторые манипуляции над Oracle VirtualBox или любой другой машиной позволит вам делать `kill -3 ` и трассировать сводки стека и кучи (включая детали работы сборщика мусора, которые бывают очень полезны), и их можно дампнуть в stderr или логи. - Используйте `mtr` для лучшей трассировки, чтобы находить проблемы сети. -- Для того, чтобы узнать почему диск полностью забит используйте `ncdu`, это сохраняет время по сравнению с тем же `du -sh *`. +- Для того, чтобы узнать почему диск полностью забит, используйте `ncdu`, это экономит время по сравнению с тем же `du -sh *`. -- Для того, чтобы узнать какой сокет или процесс использует интернет используйте `iftop` или `nethogs`. +- Чтобы узнать, какой сокет или процесс использует интернет, используйте `iftop` или `nethogs`. -- `ab`, которая поставляется вместе в Апачем полезна для быстрой нетщательной проверки производительности веб-сервера. Для более серьезного лоад-тестинга используйте `siege`. +- `ab`, которая поставляется вместе с Апачем, полезна для быстрой и нетщательной проверки производительности веб-сервера. Для более серьёзного лоад-тестинга используйте `siege`. -- Для более серьезного дебаггинга сетей используйте `wireshark`, `tshark`, и `ngrep`. +- Для более серьёзного дебаггинга сетей используйте `wireshark`, `tshark`, и `ngrep`. -- Знайте про `strace` и `ltrace`. Эти команды могут быть полезны, если программа падает или висит и вы не знаете почему, или если вы хотите протестировать производительность программы. Не забывайте про возможность дебаггинга (`-c`) и возможностью прицепиться к процессу (`-p`). +- Знайте про `strace` и `ltrace`. Эти команды могут быть полезны, если программа падает или висит и вы не знаете, почему, или если хотите протестировать производительность программы. Не забывайте про возможность отладки (`-c`) с возможностью подключиться к процессу (`-p`). - Не забывайте про `ldd` для проверки системных библиотек. -- Знайте как прицепиться к запущенному процессу через `gdb` и получить трассировку стека. +- Знайте, как прицепиться к запущенному процессу (через `gdb`) и получить трассировку стека. -- Используйте `/proc`. Иногда он невероятно полезен для дебага запущенных программ. Примеры: `/proc/cpuinfo`, `/proc/xxx/cwd`, `/proc/xxx/exe`, `/proc/xxx/fd/`, `/proc/xxx/smaps`. +- Используйте `/proc`. Иногда он невероятно полезен для отладки запущенных программ. Примеры: `/proc/cpuinfo`, `/proc/xxx/cwd`, `/proc/xxx/exe`, `/proc/xxx/fd/`, `/proc/xxx/smaps`. -- Когда дебажете что-то, что сломалось в прошлом используйте `sar` – бывает очень полезно. Показывает историю CPU, памяти, сети и т.д. +- Когда отлаживаете что-то, что сломалось в прошлом, используйте `sar` – бывает очень полезно. Показывает историю CPU, памяти, сети и т.д. -- Для анализа более глубоких систем и производительности посмотрите на `stap` ([SystemTap](https://sourceware.org/systemtap/wiki)), [`perf`](http://en.wikipedia.org/wiki/Perf_(Linux)), и [`sysdig`](https://github.com/draios/sysdig). +- Для более глубокого анализа систем и производительности посмотрите на `stap` ([SystemTap](https://sourceware.org/systemtap/wiki)), [`perf`](http://en.wikipedia.org/wiki/Perf_(Linux)) и [`sysdig`](https://github.com/draios/sysdig). -- Узнайте какая у вас операционка через `uname` or `uname -a` (основная Unix-информация/информация о ядре) или `lsb_release -a` (информация о дистрибутиве). +- Узнайте, какая у вас операционка, через `uname` или `uname -a` (основная Unix-информация/информация о ядре) или `lsb_release -a` (информация о дистрибутиве). -- Используйте `dmesg` когда что-то ведет себя совсем странно (например железо или драйвера). +- Используйте `dmesg`, когда что-то ведёт себя совсем странно (например, железо или драйвера). ## В одну строчку -Давайте соберем все вместе и напишем несколько команд: +Давайте соберём всё вместе и напишем несколько команд: -- Это довольно круто, что можно найти множественные пересечения файлов, соединить отсортированные файлы и посмотреть разницу в нескольких файлов через `sort`/`uniq`. Это быстрый подход и работает на файлах любого размера (включая многогигабайтные файлы). (Сортировка не ограничена памятью, но возможно вам придется добавить `-T` если `/tmp` находится на небольшом логическом диске). Еще посмотрите то что было сказано выше о `LC_ALL`. Флаг сорта `-u` option не используется ниже чтобы было понятнее: +- Это довольно круто, что можно найти множественные пересечения файлов, соединить отсортированные файлы и посмотреть разницу в нескольких файлов через `sort`/`uniq`. Это быстрый подход и работает на файлах любого размера (включая многогигабайтные файлы). (Сортировка не ограничена памятью, но, возможно, вам придётся добавить `-T` если `/tmp` находится на небольшом логическом диске). Ещё посмотрите то, что было сказано выше о `LC_ALL`. Флаг вида `-u option` не используется ниже, чтобы было понятнее: ```sh cat a b | sort | uniq > c # c is a union b cat a b | sort | uniq -d > c # c is a intersect b cat a b b | sort | uniq -u > c # c is set difference a - b ``` -- Используйте `grep . *` для того, чтобы посмотреть содержимое всех файлов в директории, особенно послезно когда у вас много конфигов типа `/sys`, `/proc`, `/etc`. +- Используйте `grep . *`, чтобы посмотреть содержимое всех файлов в директории, что особенно полезно, когда у вас много конфигов типа `/sys`, `/proc`, `/etc`. -- Получить сумму всех чисел, которые находятся в третьей колонки текстового файла. (Скорее всего, это раза в 3 быстрее и раза в 3 проще чем делать это в Питоне): +- Получить сумму всех чисел, которые находятся в третьей колонке текстового файла. (Скорее всего, это раза в 3 быстрее и раза в 3 проще, чем делать это на Питоне): ```sh awk '{ x += $3 } END { print x }' myfile ``` @@ -283,20 +281,14 @@ ```sh find . -type f -ls ``` -Это почти как рекурсивная `ls -l`, но более читабельно чем `ls -lR`: +Это почти как рекурсивная `ls -l`, но читабельнее чем `ls -lR`: -- Используйте `xargs` (или `parallel`). Это очень мощная штука. Обратите внимание, что Вы можете контролировать количество команд на каждую строку, а так же параллельность. Если Вы не уверены, что делаете что-то правильно, начните с `xargs echo`. Еще `-I{}` – полезная штука. Примеры: -```sh - find . -name '*.py' | xargs grep some_function - cat hosts | xargs -I{} ssh root@{} hostname -``` - -- Давайте представим, что у нас есть какой-то текстовый файл, например лог какого-то сервера и на каких-то строках появляется значение, строки с которой нам интересны, например `acct_id`. Давайте подсчитаем сколько таких запросов в нашем логе: +- Давайте представим, что у нас есть какой-то текстовый файл, например, лог сервера, и где-то появляется последовательность, например, `acct_id`, после которой строки нам интересны. Давайте подсчитаем, сколько таких запросов в нашем логе: ```sh cat access.log | egrep -o 'acct_id=[0-9]+' | cut -d= -f2 | sort | uniq -c | sort -rn ``` -- Запустите этот скрипт чтобы получить случайный совет из этой инструкции: +- Запустите этот скрипт, чтобы получить случайный совет из этой инструкции: ```sh function taocl() { curl -s https://raw.githubusercontent.com/jlevy/the-art-of-command-line/master/README.md | @@ -310,7 +302,7 @@ ## Сложно, но полезно -- `expr`: для выполнения арифметических и булевых операций, а так же регулярных выражений +- `expr`: для выполнения арифметических и булевых операций, а также регулярных выражений - `m4`: простенький макро-процессор @@ -320,7 +312,7 @@ - `env`: для того, чтобы выполнить команду (полезно в Bash-скриптах) -- `printenv`: print out environment variables (useful in debugging and scripts) +- `printenv`: показать переменные окружения (используется при отладке и в скриптах) - `look`: найти английские слова (или строки) в файле @@ -358,11 +350,11 @@ - `file`: узнать тип файла -- `tree`: показать директории и поддиректории в виде дерева; как `ls`, но рекурсивно +- `tree`: показать директории и поддиректории в виде дерева, как `ls`, но рекурсивно - `stat`: информация о файле -- `tac`: вывести файл наоборот (ласипан) +- `tac`: вывести файл посимвольно наоборот ("ласипан") - `shuf`: случайная выборка строк из файла @@ -370,7 +362,7 @@ - `pv`: мониторинг прогресса прохождения информации через пайп -- `hd` и `bvi`: дамп и редактирование бинарников +- `hd`, `hexdump`, `xxd`, `biew`: hex-дамп и редактирование бинарников - `strings`: найти текст в бинарниках @@ -380,7 +372,7 @@ - `split` и `csplit`: разбить файлы -- `sponge`: прочитать весь инпут перед тем, как его записать, полезно, когда читаешь из того же файла, куда записываешь, например вот так: `grep -v something some-file | sponge some-file` +- `sponge`: прочитать весь входной поток перед тем, как его записать; полезно, когда читаешь из того же файла, куда записываешь, например, так: `grep -v something some-file | sponge some-file` - `units`: конвертер, метры в километры, вёрсты в пяди (смотрите `/usr/share/units/definitions.units`) @@ -392,9 +384,9 @@ - `ab`: бенчмаркинг веб-серверов -- `strace`: дебаг системных вызовов +- `strace`: отладка системных вызовов -- `mtr`: лучшей трассировка для дебаггинга сети +- `mtr`: лучшая трассировка для дебаггинга сети - `cssh`: несколько терминалов в одном UI @@ -406,15 +398,15 @@ - `host` и `dig`: узнать DNS -- `lsof`: процессинг дискрипторов и информация о сокетах +- `lsof`: процессинг дескрипторов и информация о сокетах -- `dstat`: полезная статистика системы +- `dstat`: полезная статистика ОС -- [`glances`](https://github.com/nicolargo/glances): высокоуровневая, многосистемная статистика +- [`glances`](https://github.com/nicolargo/glances): высокоуровневая статистика по многим подсистемам -- `iostat`: статистика CPU и использования жёсткого диска +- `iostat`: статистика процессора и использования жёсткого диска -- `htop`: улучшенная версия top +- `htop`: улучшенная версия `top` - `last`: история логинов в систему @@ -428,31 +420,31 @@ - `ss`: статистика сокетов -- `dmesg`: ошибки бута и ошибки системы +- `dmesg`: ошибки загрузки системы и ошибки системы - `hdparm`: манипуляция с SATA/ATA - `lsb_release`: информация о дистрибутиве Linux -- `lsblk`: cписок блочных устройств компьютера: древо ваших дисков и логических дисков +- `lsblk`: cписок блочных устройств компьютера: дерево ваших дисков и логических дисков -- `lshw`, `lscpu`, `lspci`, `lsusb`, `dmidecode`: информация о железе включая, CPU, BIOS, RAID, графику, девайсы, и т.д. +- `lshw`, `lscpu`, `lspci`, `lsusb`, `dmidecode`: информация о железе, включая, CPU, BIOS, RAID, графику, девайсы, и т.д. -- `fortune`, `ddate`, и `sl`: хм, не знаю будут ли вам "полезны" веселые цитатки и поезда, пересекающие ваш терминал :) +- `fortune`, `ddate`, и `sl`: хм, не знаю, будут ли вам "полезны" весёлые цитатки и поезда, пересекающие ваш терминал :) -## MacOS only +## MacOS X only -Некоторые вещи релевантны *только* для Мака. +Некоторые вещи, подходящие *только* для Мака. -- Системы управлением пакетами – `brew` (Homebrew) и `port` (MacPorts). Они могут быть использованы для того, чтобы установить большинство програм, упомянутых в этом документе. +- Системы управлением пакетами — `brew` (Homebrew) и `port` (MacPorts). Они могут быть использованы для того, чтобы установить большинство програм, упомянутых в этом документе. -- Копируйте аутпут консольных программ в десктопные через `pbcopy`, и вставляйте инпут через `pbpaste`. +- Копируйте выдачу консольных программ в десктопные через `pbcopy` и вставляйте входные данные через `pbpaste`. -- Для того, чтобы открыть файл или десктопную программу типа Finder используйте `open`, вот так `open -a /Applications/Whatever.app`. +- Для того, чтобы открыть файл или десктопную программу типа Finder, используйте `open` вот так: `open -a /Applications/Whatever.app`. -- Spotlight: Ищите файлы в консоле через `mdfind` и смотрите метадату (например EXIF информацию фотографий) через `mdls`. +- Spotlight: Ищите файлы в консоли через `mdfind` и смотрите метаданные (например, EXIF – информацию из фотографий) через `mdls`. -- Не забывайте, что MacOS основан на BSD Unix и многие команды (например `ps`, `ls`, `tail`, `awk`, `sed`) имеют некоторые небольшие различия с линуксовыми. Это обусловлено влянием `UNIX System V` и `GNU Tools`. Разницу можно заметить увидив заголовок "BSD General Commands Manual." к манам програм. В некоторых случаях, на Мак можно поставить GNU-версии программ, например `gawk` и `gsed`. Когда пишите кроссплатформенные Bash-скрипты, старайтесь избегать команды, которые могут различаться (например, лучше используйте Python или `perl`), или тщательно все тестируйте. +- Не забывайте, что MacOS основан на BSD Unix, и многие команды (например, `ps`, `ls`, `tail`, `awk`, `sed`) имеют небольшие отличия от линуксовых. Это обусловлено влянием `UNIX System V` и `GNU Tools`. Разницу можно заметить, увидев заголовок "BSD General Commands Manual." к манам программ. В некоторых случаях, на Мак можно поставить GNU-версии программ, например `gawk` и `gsed`. Когда пишете кроссплатформенные Bash-скрипты, старайтесь избегать команды, которые могут отличаться (например, лучше используйте Python или `perl`), или тщательно всё тестируйте. ## Больше информации по теме @@ -462,9 +454,9 @@ ## Дисклеймер -За небольшим исключением, весь код написан так, что другие его смогут прочитать. +За небольшим исключением, весь код написан так, чтобы другие его смогли прочитать. -Кому много дано, с того много и спрашивается. Тот факт, что что-то может быть написано в Баше, вовсе не означает что оно должно быть там написано. ;) +Кому много дано, с того много и спрашивается. Тот факт, что что-то может быть написано в Баше, вовсе не означает, что оно должно быть на нём написано. ;) ## Лицензия diff --git a/README.md b/README.md index 314f01c..74ea8f5 100644 --- a/README.md +++ b/README.md @@ -73,7 +73,7 @@ Notes: - In Bash, use **Tab** to complete arguments and **ctrl-r** to search through command history. -- In Bash, use **ctrl-w** to delete the last word, and **ctrl-u** to delete all the way back to the start of the line. Use **alt-b** and **alt-f** to move by word, **ctrl-k** to kill to the end of the line, **ctrl-l** to clear the screen. See `man readline` for all the default keybindings in Bash. There are a lot. For example **alt-.** cycles through previous arguments, and **alt-*** expands a glob. +- In Bash, use **ctrl-w** to delete the last word, and **ctrl-u** to delete all the way back to the start of the line. Use **alt-b** and **alt-f** to move by word, **ctrl-k** to kill to the end of the line, **ctrl-l** to clear the screen. See `man readline` for all the default keybindings in Bash. [There are a lot](http://ss64.com/bash/syntax-keyboard.html). For example **alt-.** inserts last argument of previous command, and **ctrl-x *** [expands a glob](http://superuser.com/questions/215950/how-to-expand-on-bash-command-line). - Alternatively, if you love vi-style key-bindings, use `set -o vi`. @@ -287,12 +287,6 @@ A few examples of piecing together commands: find . -type f -ls ``` -- Use `xargs` or `parallel` whenever you can. Note you can control how many items execute per line (`-L`) as well as parallelism (`-P`). If you're not sure if it'll do the right thing, use xargs echo first. Also, `-I{}` is handy. Examples: -```sh - find . -name '*.py' | xargs grep some_function - cat hosts | xargs -I{} ssh root@{} hostname -``` - - Say you have a text file, like a web server log, and a certain value that appears on some lines, such as an `acct_id` parameter that is present in the URL. If you want a tally of how many requests for each `acct_id`: ```sh cat access.log | egrep -o 'acct_id=[0-9]+' | cut -d= -f2 | sort | uniq -c | sort -rn @@ -443,7 +437,7 @@ A few examples of piecing together commands: - `fortune`, `ddate`, and `sl`: um, well, it depends on whether you consider steam locomotives and Zippy quotations "useful" -## MacOS only +## MacOS X only These are items relevant *only* on MacOS.