mirror of
https://github.com/xmengnet/the-art-of-command-line.git
synced 2024-12-25 01:36:29 +08:00
commit
90acd0c689
1 changed files with 39 additions and 39 deletions
78
README-ru.md
78
README-ru.md
|
@ -21,7 +21,7 @@
|
||||||
|
|
||||||
![curl -s 'https://raw.githubusercontent.com/jlevy/the-art-of-command-line/master/README.md' | egrep -o '`\w+`' | tr -d '`' | cowsay -W50](cowsay.png)
|
![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. Некоторые из них – простые и очевидные, но некоторые - довольно сложные. И предназначены для решения конкретных задач. Это небольшая публикация, но если Вы уже знаете обо всем, что тут написано, и можете вспомнить, как это все использовать – вы много знаете!
|
||||||
|
|
||||||
Этот гайд является результатом работы [большого числа авторов и переводчиков](AUTHORS.md)
|
Этот гайд является результатом работы [большого числа авторов и переводчиков](AUTHORS.md)
|
||||||
Многое из того, что тут написано,
|
Многое из того, что тут написано,
|
||||||
|
@ -48,15 +48,15 @@
|
||||||
|
|
||||||
## Основы
|
## Основы
|
||||||
|
|
||||||
- Выучите основы Баша. Просто возьмите и напечатайте `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`. С помощью `type command` можно определить, чем является команда - исполняемым файлом, алиасом или встроенной командой шелла.
|
- Знайте как читать документацию через `man` (для любознательных – `man man`; `man` по углам документа в скобках добавляет номер, например: 1 – для обычных команд, 5 – для файлов, конвенций, 8 – для административных команд). Ищите мануалы через `apropos`, и помните, что некоторые команды – не бинарники, а встроенные команды Баша, и помощь по ним можно получить через `help` и `help -d`. С помощью `type command` можно определить, чем является команда - исполняемым файлом, алиасом или встроенной командой шелла.
|
||||||
|
|
||||||
- Узнайте о том, как перенаправлять ввод и вывод через `>` и `<` и пайпы `|`. Помните, что `>` – переписывает выходной файл, а `>>` дописывает в конец. Узнайте побольше про stdout и stderr.
|
- Узнайте о том, как перенаправлять ввод и вывод через `>` и `<` и пайпы `|`. Помните, что `>` переписывает выходной файл, а `>>` дописывает в конец. Узнайте побольше про stdout и stderr.
|
||||||
|
|
||||||
- Узнайте побольше про раскрытие file glob элементов `*` (а также `?` и `{`...`}`), кавычки, а также разницу между двойными `"` и одинарными `'` кавычками. (Больше о расширении переменных читайте ниже.)
|
- Узнайте побольше про раскрытие file glob элементов `*` (а также `?` и `{`...`}`), кавычки, а также разницу между двойными `"` и одинарными `'` кавычками (больше о расширении переменных читайте ниже).
|
||||||
|
|
||||||
- Будьте знакомы с работой с процессами в Bash: `&`, **ctrl-z**, **ctrl-c**, `jobs`, `fg`, `bg`, `kill` и т.д.
|
- Будьте знакомы с работой с процессами в Bash: `&`, **ctrl-z**, **ctrl-c**, `jobs`, `fg`, `bg`, `kill` и т.д.
|
||||||
|
|
||||||
|
@ -66,29 +66,29 @@
|
||||||
|
|
||||||
- Основы работы с сетью: `ip` или `ifconfig`, `dig`.
|
- Основы работы с сетью: `ip` или `ifconfig`, `dig`.
|
||||||
|
|
||||||
- Освойте работу с системой контроля версий, например, `git`
|
- Освойте работу с системой контроля версий, например, `git`.
|
||||||
|
|
||||||
- Хорошо знайте регулярные выражения и разные флаги к `grep`/`egrep`. Такие флаги как `-i`, `-o`, `-v`, `-A`, `-B` и `-C` стоит знать.
|
- Хорошо знайте регулярные выражения и разные флаги к `grep`/`egrep`. Такие флаги, как `-i`, `-o`, `-v`, `-A`, `-B` и `-C` стоит знать.
|
||||||
|
|
||||||
- Обучитесь использованию системами управления пакетами `apt-get`, `yum`, `dnf` или `pacman` (в зависимости от дистрибутива) чтобы искать и устанавливать пакеты и обязательно имейте установленым `pip` для установки командных утилит, написанных на Python (некоторые из тех, что вы найдёте ниже, легче всего установить через `pip`).
|
- Обучитесь использованию систем управления пакетами `apt-get`, `yum`, `dnf` или `pacman` (в зависимости от дистрибутива), чтобы искать и устанавливать пакеты и обязательно имейте установленым `pip` для установки командных утилит, написанных на Python (некоторые из тех, что вы найдёте ниже, легче всего установить через `pip`).
|
||||||
|
|
||||||
|
|
||||||
## Ежедневное использование
|
## Ежедневное использование
|
||||||
|
|
||||||
- Используйте таб в Баше для автодополнения аргументов к командам и **ctrl-r** для поиска по истории командной строки (после нажатия введите запрос, нажмите **ctrl-r** снова чтобы натйи следующее сопадение, нажмите **Enter** для выполнения текущей найденной команды или стрелку вправо чтобы отредактировать команду).
|
- Используйте таб в Баше для автодополнения аргументов к командам и **ctrl-r** для поиска по истории командной строки (после нажатия введите запрос, нажмите **ctrl-r** снова, чтобы найти следующее совпадение, нажмите **Enter** для выполнения текущей найденной команды или стрелку вправо, чтобы отредактировать команду).
|
||||||
|
|
||||||
- Используйте **ctrl-w** в Баше для того, чтобы удалить последнее слово в команде; **ctrl-u** для того, чтобы удалить команду полностью. Используйте **alt-b** и **alt-f** для того, чтобы бегать между словами команды, **ctrl-a** и **ctrl-e** для того, чтобы переместиться к началу и концу строки соответственно, **ctrl-k** для того, чтобы удалить часть команды от текущей позиции до конца строки, **ctrl-l** для того, чтобы очистить экран. Гляньте на `man readline` чтобы узнать о всех клавиатурных сочетаниях Баша. Их много! Например, **alt-.** бежит по предыдущим аргументам команды, а **alt-*** раскрывает глоб (globbing).
|
- Используйте **ctrl-w** в Баше для того, чтобы удалить последнее слово в команде; **ctrl-u** для того, чтобы удалить команду полностью. Используйте **alt-b** и **alt-f** для того, чтобы бегать между словами команды, **ctrl-a** и **ctrl-e** для того, чтобы переместиться к началу и концу строки соответственно, **ctrl-k** для того, чтобы удалить часть команды от текущей позиции до конца строки, **ctrl-l** для того, чтобы очистить экран. Гляньте на `man readline`, чтобы узнать о всех клавиатурных сочетаниях Баша. Их много! Например, **alt-.** бежит по предыдущим аргументам команды, а **alt-*** раскрывает глоб (globbing).
|
||||||
|
|
||||||
|
|
||||||
- Если Вам нравятся клавиатурные сочетания vim, сделайте `set -o vi` (и `set -o emacs` чтобы вернуться обратно).
|
- Если Вам нравятся клавиатурные сочетания vim, сделайте `set -o vi` (и `set -o emacs`, чтобы вернуться обратно).
|
||||||
|
|
||||||
- Для редактирования длинных команд после установки другого редактора (например `export EDITOR=vim`), нажатие **ctrl-x** **ctrl-e** откроет текущую команду в редакторе для многострочного редактирования. Или, как в vi, **escape-v**.
|
- Для редактирования длинных команд после установки другого редактора (например `export EDITOR=vim`), нажатие **ctrl-x** **ctrl-e** откроет текущую команду в редакторе для многострочного редактирования. Или, как в vi, **escape-v**.
|
||||||
|
|
||||||
- Для просмотра последних команд используйте `history`. Повторить команду: `!n` (где `n` - порядковый номер истории). Также есть много сокращений, например, `!$` (последний аргумент) и `!!` последняя команда (свертесь со страницей man "HISTORY EXPANSION"). Впрочем, их часто проще заменить с помощью **ctrl-r** и **alt-.**.
|
- Для просмотра последних команд используйте `history`. Повторить команду: `!n` (где `n` - порядковый номер истории). Также есть много сокращений, например, `!$` (последний аргумент) и `!!` (последняя команда) (сверьтесь со страницей man "HISTORY EXPANSION"). Впрочем, их часто проще заменить с помощью **ctrl-r** и **alt-.**.
|
||||||
|
|
||||||
- Перейти в домашнюю директорию можно с помощью `cd`. Для указания пути к файлам из домашней директории можно воспользоваться префиксом `~` (например, `~/.bashrc`). В `sh` скриптах для обращения к домашней директории можно использовать переменную `$HOME`
|
- Перейти в домашнюю директорию можно с помощью `cd`. Для указания пути к файлам из домашней директории можно воспользоваться префиксом `~` (например, `~/.bashrc`). В `sh` скриптах для обращения к домашней директории можно использовать переменную `$HOME`.
|
||||||
|
|
||||||
- Для того, чтобы перейти к предыдущей рабочей директории, используйте `cd -`
|
- Для того, чтобы перейти к предыдущей рабочей директории, используйте `cd -`.
|
||||||
|
|
||||||
- Если вы написали команду наполовину и вдруг передумали, нажмите **alt-#** для того, чтобы добавить `#` к началу, и отправьте команду как комментарий (или используйте **ctrl-a**, **#**, **enter**). Потом вы сможете вернуться к ней через историю.
|
- Если вы написали команду наполовину и вдруг передумали, нажмите **alt-#** для того, чтобы добавить `#` к началу, и отправьте команду как комментарий (или используйте **ctrl-a**, **#**, **enter**). Потом вы сможете вернуться к ней через историю.
|
||||||
|
|
||||||
|
@ -113,17 +113,17 @@
|
||||||
|
|
||||||
- Используйте `uptime` или `w` для того, чтобы узнать продолжительность работы системы.
|
- Используйте `uptime` или `w` для того, чтобы узнать продолжительность работы системы.
|
||||||
|
|
||||||
- Используйте `alias`, чтобы поименовать частоиспользуемые команды. Например, `alias ll='ls -latr'` создаст новое сокращение `ll`.
|
- Используйте `alias`, чтобы поименовать часто используемые команды. Например, `alias ll='ls -latr'` создаст новое сокращение `ll`.
|
||||||
|
|
||||||
- Сохраняйте псевдонимы (aliases), настройки оболочки и частоиспользуемые сокращения в `~/.bashrc`, и [организуйте их подгрузку](http://superuser.com/a/183980/7106). Это сделает ваши настройки доступными во всех сессиях оболочки.
|
- Сохраняйте псевдонимы (aliases), настройки оболочки и часто используемые сокращения в `~/.bashrc`, и [организуйте их подгрузку](http://superuser.com/a/183980/7106). Это сделает ваши настройки доступными во всех сессиях оболочки.
|
||||||
|
|
||||||
- Пропишите настройки переменных окружения и команды, которые должны быть выполнены при входе в систему в файл `~/.bash_profile`. Отдельная настройка будет необходима для оболочек, которые запускаются из GUI и `cron`.
|
- Пропишите настройки переменных окружения и команды, которые должны быть выполнены при входе в систему в файл `~/.bash_profile`. Отдельная настройка будет необходима для оболочек, которые запускаются из GUI и `cron`.
|
||||||
|
|
||||||
- Синхронизируйте ваши конфигурационные файлы (например, `.bashrc` и `.bash_profile`) между разными компьютерами с помощью Git.
|
- Синхронизируйте ваши конфигурационные файлы (например, `.bashrc` и `.bash_profile`) между разными компьютерами с помощью Git.
|
||||||
|
|
||||||
- Помните, что необходима осторожность при работе с переменными, которые содержат пробелы. Оберните свои переменные в кавычки, например `"$FOO"`. Предпочтительно использовать `-0` или `-print0` флаги чтобы использовать нулевой символ для разделения имен файлов, например: `locate -0 pattern | xargs -0 ls -al` или `find / -print0 -type d | xargs -0 ls -al`. Для циклов, которые используют имена файлов содержащие пробелы, установите IFS чтобы символом новой строки был только `\n`:`IFS=$'\n'`.
|
- Помните, что необходима осторожность при работе с переменными, которые содержат пробелы. Оберните свои переменные в кавычки, например `"$FOO"`. Предпочтительно использовать `-0` или `-print0` флаги, чтобы использовать нулевой символ для разделения имен файлов, например: `locate -0 pattern | xargs -0 ls -al` или `find / -print0 -type d | xargs -0 ls -al`. Для циклов, которые используют имена файлов, содержащие пробелы, установите IFS чтобы символом новой строки был только `\n`:`IFS=$'\n'`.
|
||||||
|
|
||||||
- В Баш-скриптах используйте `set -x` (или вариант `set -v`, который логгирует сырой ввод, включая нераскрытые переменные и комментарии) для того, чтобы отлаживать вывод (output). Используйте строгие режимы везде, где возможно. Используйте `set -e` для того, чтобы прекращать выполнение при ошибках (ненулевой код возврата). Используйте `set -u` чтобы определять использование неициализированных переменных. Используйте `set -o pipefail` для того, чтобы строго относиться к ошибкам (это немного глубокая тема). Для более сложных скриптов также используйте `trap` на EXIT или ERR. Полезная привычка - начинать скрипт примерно так (это поможет обнаружить ошибки и выведет предупреждение):
|
- В Баш-скриптах используйте `set -x` (или вариант `set -v`, который логгирует сырой ввод, включая нераскрытые переменные и комментарии) для того, чтобы отлаживать вывод (output). Используйте строгие режимы везде, где возможно. Используйте `set -e` для того, чтобы прекращать выполнение при ошибках (ненулевой код возврата). Используйте `set -u`, чтобы определять использование неинициализированных переменных. Используйте `set -o pipefail` для того, чтобы строго относиться к ошибкам (это немного глубокая тема). Для более сложных скриптов также используйте `trap` на EXIT или ERR. Полезная привычка - начинать скрипт примерно так (это поможет обнаружить ошибки и выведет предупреждение):
|
||||||
```bash
|
```bash
|
||||||
set -euo pipefail
|
set -euo pipefail
|
||||||
trap "echo 'error: Script failed: see failed command above'" ERR
|
trap "echo 'error: Script failed: see failed command above'" ERR
|
||||||
|
@ -138,7 +138,7 @@
|
||||||
|
|
||||||
- В Баше много типов пространства переменных. Проверить, существует ли переменная – `${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`.
|
||||||
|
|
||||||
- Использование скобок `{...}` может уменьшить необходиость повторно вводить схожий текст и автоматизирует комбинирование элементов. Это полезно например здесь: `mv foo.{txt,pdf} some-dir` (переместит оба файла), `cp somefile{,.bak}` (приведется к `cp somefile somefile.bak`) или `mkdir -p test-{a,b,c}/subtest-{1,2,3}` (раскроет все возможные комбинации и создаст дерево каталогов).
|
- Использование скобок `{...}` может уменьшить необходиость повторно вводить схожий текст и автоматизирует комбинирование элементов. Это полезно, например, здесь: `mv foo.{txt,pdf} some-dir` (переместит оба файла), `cp somefile{,.bak}` (приведется к `cp somefile somefile.bak`) или `mkdir -p test-{a,b,c}/subtest-{1,2,3}` (раскроет все возможные комбинации и создаст дерево каталогов).
|
||||||
|
|
||||||
- Вывод любой команды можно сохранить в файлоподобный контекст с помощью `<(some command)`. Например, сравнение локального файла `/etc/hosts с удалённым:
|
- Вывод любой команды можно сохранить в файлоподобный контекст с помощью `<(some command)`. Например, сравнение локального файла `/etc/hosts с удалённым:
|
||||||
```sh
|
```sh
|
||||||
|
@ -149,7 +149,7 @@
|
||||||
|
|
||||||
- В Баше перенаправляйте стандартный вывод, а также стандартные ошибки, вот так: `some-command >logfile 2>&1` или `some-command &>logfile`. Зачастую, для того, чтобы убедиться, что команда не оставит открытым файл, привязав его к открытому терминалу, считается хорошей практикой добавлять `</dev/null`.
|
- В Баше перенаправляйте стандартный вывод, а также стандартные ошибки, вот так: `some-command >logfile 2>&1` или `some-command &>logfile`. Зачастую, для того, чтобы убедиться, что команда не оставит открытым файл, привязав его к открытому терминалу, считается хорошей практикой добавлять `</dev/null`.
|
||||||
|
|
||||||
- Используйте `man ascii` для просмотра хорошей ASCII таблицы, с шестнадцатеричными и десятичными значениями. Для информации по основным кодировкам полезны: `man unicode`, `man utf-8` и `man latin1`.
|
- Используйте `man ascii` для просмотра хорошей ASCII таблицы с шестнадцатеричными и десятичными значениями. Для информации по основным кодировкам полезны `man unicode`, `man utf-8` и `man latin1`.
|
||||||
|
|
||||||
- Используйте `screen` или [`tmux`](https://tmux.github.io/) для того, чтобы иметь несколько экранов в одном терминале. Это особенно полезно, когда вы работаете с удаленным сервером по ssh, тогда вы можете подключаться/отключаться от сессий. `byobu` может улучшить использование `screen` или `tmux`, предоставляя больше информации и удобное управление. Более минималистичный подход для этого – использование [`dtach`](https://github.com/bogner/dtach).
|
- Используйте `screen` или [`tmux`](https://tmux.github.io/) для того, чтобы иметь несколько экранов в одном терминале. Это особенно полезно, когда вы работаете с удаленным сервером по ssh, тогда вы можете подключаться/отключаться от сессий. `byobu` может улучшить использование `screen` или `tmux`, предоставляя больше информации и удобное управление. Более минималистичный подход для этого – использование [`dtach`](https://github.com/bogner/dtach).
|
||||||
|
|
||||||
|
@ -166,7 +166,7 @@
|
||||||
ControlPersist yes
|
ControlPersist yes
|
||||||
```
|
```
|
||||||
|
|
||||||
- Некоторые другие настройки SSH могут сильно повлиять на безопасность и должны меняться осторожно, например, для конкретной подсети или конкретной машины или в доверенных сетях: `StrictHostKeyChecking=no`, `ForwardAgent=yes`
|
- Некоторые другие настройки SSH могут сильно повлиять на безопасность и должны меняться осторожно, например, для конкретной подсети или конкретной машины или в доверенных сетях: `StrictHostKeyChecking=no`, `ForwardAgent=yes`.
|
||||||
|
|
||||||
- Рассмотрите [`mosh`](https://mosh.mit.edu/) как альтернативу SSH, которая использует UDP и позволяет избежать разрывов соединений и добавляет удобства (требует настройки со стороны сервера).
|
- Рассмотрите [`mosh`](https://mosh.mit.edu/) как альтернативу SSH, которая использует UDP и позволяет избежать разрывов соединений и добавляет удобства (требует настройки со стороны сервера).
|
||||||
|
|
||||||
|
@ -179,12 +179,12 @@
|
||||||
|
|
||||||
- Для работы с файлами, список которых дала другая команда (например, `git`), используйте `fpp` ([PathPicker](https://github.com/facebook/PathPicker)).
|
- Для работы с файлами, список которых дала другая команда (например, `git`), используйте `fpp` ([PathPicker](https://github.com/facebook/PathPicker)).
|
||||||
|
|
||||||
- Чтобы быстро поднять веб-сервер в текущей директории (и поддерикториях), который доступен для всех в вашей сети, используйте:
|
- Чтобы быстро поднять веб-сервер в текущей директории (и поддиректориях), который доступен для всех в вашей сети, используйте:
|
||||||
`python -m SimpleHTTPServer 7777` (если у вас Python 2 и вы хотите открыть сервер на порту 7777) или `python -m http.server 7777` (для Python 3 и порта 7777).
|
`python -m SimpleHTTPServer 7777` (если у вас Python 2 и вы хотите открыть сервер на порту 7777) или `python -m http.server 7777` (для Python 3 и порта 7777).
|
||||||
|
|
||||||
- Чтобы выполнить определённую команду с привилегиями, используйте `sudo` (для рута) и `sudo -u` (для другого пользователя). Используйте `su` или `sudo bash`, чтобы запустить шелл от имени этого пользователя. Используйте `su -`, чтобы эмулировать свежий логин от рута или другого пользователя.
|
- Чтобы выполнить определённую команду с привилегиями, используйте `sudo` (для рута) и `sudo -u` (для другого пользователя). Используйте `su` или `sudo bash`, чтобы запустить шелл от имени этого пользователя. Используйте `su -`, чтобы эмулировать свежий логин от рута или другого пользователя.
|
||||||
|
|
||||||
- Знайте про [ограничение 128Кб](https://wiki.debian.org/CommonErrorMessages/ArgumentListTooLong) в командной строке. Ошибка "Argument list too long" часто бывает, когда маска по имени включает большое количество файлов. (В таких случаях помогают варианты с `find` или `xargs`.)
|
- Знайте про [ограничение 128Кб](https://wiki.debian.org/CommonErrorMessages/ArgumentListTooLong) в командной строке. Ошибка "Argument list too long" часто бывает, когда маска по имени включает большое количество файлов (в таких случаях помогают варианты с `find` или `xargs`).
|
||||||
|
|
||||||
- В качестве простого калькулятора (и, конечно, вообще для работы с Python) используйте интерпретатор `python`. Например,
|
- В качестве простого калькулятора (и, конечно, вообще для работы с Python) используйте интерпретатор `python`. Например,
|
||||||
```
|
```
|
||||||
|
@ -199,7 +199,7 @@
|
||||||
|
|
||||||
- Для основного поиска по содержимому файлов (более сложному, чем `grep -r`) используйте [`ag`](https://github.com/ggreer/the_silver_searcher).
|
- Для основного поиска по содержимому файлов (более сложному, чем `grep -r`) используйте [`ag`](https://github.com/ggreer/the_silver_searcher).
|
||||||
|
|
||||||
- Для конвертации HTML в текст: `lynx -dump -stdin`
|
- Для конвертации HTML в текст: `lynx -dump -stdin`.
|
||||||
|
|
||||||
- Для конвертации разных типов разметки (HTML, Markdown и др.) попробуйте [`pandoc`](http://pandoc.org/).
|
- Для конвертации разных типов разметки (HTML, Markdown и др.) попробуйте [`pandoc`](http://pandoc.org/).
|
||||||
|
|
||||||
|
@ -215,7 +215,7 @@
|
||||||
|
|
||||||
- Знайте про `sort` и `uniq`, включая флаги `-u` и `-d`, смотрите примеры ниже. Также попробуйте `comm`.
|
- Знайте про `sort` и `uniq`, включая флаги `-u` и `-d`, смотрите примеры ниже. Также попробуйте `comm`.
|
||||||
|
|
||||||
- Знайте про `cut`, `paste`, и `join` для работы с текстовыми файлами. Многие люди используют `cut`, забыв про `join`.
|
- Знайте про `cut`, `paste` и `join` для работы с текстовыми файлами. Многие люди используют `cut`, забыв про `join`.
|
||||||
|
|
||||||
- Знайте о `wc`: для подсчёта переводов строк (`-l`), для символов – (`-m`), для слов – words (`-w`), для байтового подсчёта – (`-c`).
|
- Знайте о `wc`: для подсчёта переводов строк (`-l`), для символов – (`-m`), для слов – words (`-w`), для байтового подсчёта – (`-c`).
|
||||||
|
|
||||||
|
@ -244,7 +244,7 @@
|
||||||
rename 's/\.bak$//' *.bak
|
rename 's/\.bak$//' *.bak
|
||||||
```
|
```
|
||||||
|
|
||||||
- Как говорит man, `rsync` на деле - быстрая, с множеством возможностей, утилита для копирования файлов. Но она хороша не только для синхронизацией между машинами, но и локально. Если есть доступ, `rsync` в отличие от `scp` позволяет возобновить процесс копирования, не начиная заново. Он также является [самым быстрым способом](https://web.archive.org/web/20130929001850/http://linuxnote.net/jianingy/en/linux/a-fast-way-to-remove-huge-number-of-files.html) удалить большое количество файлов:
|
- Как говорит man, `rsync` на деле - быстрая, с множеством возможностей, утилита для копирования файлов. Но она хороша не только для синхронизации между машинами, но и локально. Если есть доступ, то `rsync`, в отличие от `scp`, позволяет возобновить процесс копирования, не начиная заново. Он также является [самым быстрым способом](https://web.archive.org/web/20130929001850/http://linuxnote.net/jianingy/en/linux/a-fast-way-to-remove-huge-number-of-files.html) удалить большое количество файлов:
|
||||||
```sh
|
```sh
|
||||||
mkdir empty && rsync -r --delete empty/ some-dir && rmdir some-dir
|
mkdir empty && rsync -r --delete empty/ some-dir && rmdir some-dir
|
||||||
```
|
```
|
||||||
|
@ -272,9 +272,9 @@ mkdir empty && rsync -r --delete empty/ some-dir && rmdir some-dir
|
||||||
|
|
||||||
- Для операций с датами и временем используйте `dateadd`, `datediff`, `strptime` и т.д. из [`dateutils`](http://www.fresse.org/dateutils/).
|
- Для операций с датами и временем используйте `dateadd`, `datediff`, `strptime` и т.д. из [`dateutils`](http://www.fresse.org/dateutils/).
|
||||||
|
|
||||||
- Используйте `zless`, `zmore`, `zcat`, и `zgrep` для работы со сжатыми файлами.
|
- Используйте `zless`, `zmore`, `zcat` и `zgrep` для работы со сжатыми файлами.
|
||||||
|
|
||||||
- `chattr` устанавливает атрибуты файлов, которые также являются низкоуровневой альтернативой правам доступа. Например, от случайного удаления файла защитит атрибут неизменяемости: `sudo chattr +i /critical/directory/or/file`
|
- `chattr` устанавливает атрибуты файлов, которые также являются низкоуровневой альтернативой правам доступа. Например, от случайного удаления файла защитит атрибут неизменяемости: `sudo chattr +i /critical/directory/or/file`.
|
||||||
|
|
||||||
- Используйте `getfacl` и `setfacl` для сохранения и восстановления файловых прав доступа. Например:
|
- Используйте `getfacl` и `setfacl` для сохранения и восстановления файловых прав доступа. Например:
|
||||||
```sh
|
```sh
|
||||||
|
@ -286,11 +286,11 @@ mkdir empty && rsync -r --delete empty/ some-dir && rmdir some-dir
|
||||||
|
|
||||||
- Для веб-отладки используйте `curl` и `curl -I`, или их альтернативу - `wget`. Также есть более современные утилиты, например [`httpie`](https://github.com/jakubroztocil/httpie).
|
- Для веб-отладки используйте `curl` и `curl -I`, или их альтернативу - `wget`. Также есть более современные утилиты, например [`httpie`](https://github.com/jakubroztocil/httpie).
|
||||||
|
|
||||||
- Чтобы узнать текущее состояние процессора/диска можно использовать классический `top` (или улучшенную альтернативу `htop`) и `iostat`, `iotop`. Используйте `iostat -mxz 15` для получения базовой информации о процессоре и детализированной о каждом разделе жесткого диска.
|
- Чтобы узнать текущее состояние процессора/диска, можно использовать классический `top` (или улучшенную альтернативу `htop`) и `iostat`, `iotop`. Используйте `iostat -mxz 15` для получения базовой информации о процессоре и детализированной о каждом разделе жесткого диска.
|
||||||
|
|
||||||
- Для получения информации о сетевых соедиениях используйте `netstat` и `ss`.
|
- Для получения информации о сетевых соедиениях используйте `netstat` и `ss`.
|
||||||
|
|
||||||
- Для получения краткой информации о происходящем в системе используйте `dstat`, для более детальной информации: [`glances`](https://github.com/nicolargo/glances). Эта программа показывает сразу несколько разных статистик в одном окне терминала. Полезно, когда следите за сразу несколькими системами.
|
- Для получения краткой информации о происходящем в системе используйте `dstat`, для более детальной информации – [`glances`](https://github.com/nicolargo/glances). Эта программа показывает сразу несколько разных статистик в одном окне терминала. Полезно, когда следите за сразу несколькими системами.
|
||||||
|
|
||||||
- Для того, чтобы следить за памятью, научитесь понимать `free` и `vmstat`. В частности, не забывайте, что кешированые значения ("cached" value) – это память, которую держит ядро и эти значения являются частью `free`.
|
- Для того, чтобы следить за памятью, научитесь понимать `free` и `vmstat`. В частности, не забывайте, что кешированые значения ("cached" value) – это память, которую держит ядро и эти значения являются частью `free`.
|
||||||
|
|
||||||
|
@ -306,7 +306,7 @@ mkdir empty && rsync -r --delete empty/ some-dir && rmdir some-dir
|
||||||
|
|
||||||
- Для более серьёзной отладки сетей используйте [`wireshark`](https://wireshark.org/), [`tshark`](https://www.wireshark.org/docs/wsug_html_chunked/AppToolstshark.html) и [`ngrep`](http://ngrep.sourceforge.net/).
|
- Для более серьёзной отладки сетей используйте [`wireshark`](https://wireshark.org/), [`tshark`](https://www.wireshark.org/docs/wsug_html_chunked/AppToolstshark.html) и [`ngrep`](http://ngrep.sourceforge.net/).
|
||||||
|
|
||||||
- Знайте про `strace` и `ltrace`. Эти команды могут быть полезны, если программа падает или висит, и вы не знаете почему Или если вы хотите протестировать производительность программы. Не забывайте про возможность отладки (`-c`) и возможность прицепиться к процессу по pid (`-p`).
|
- Знайте про `strace` и `ltrace`. Эти команды могут быть полезны, если программа падает или висит, и вы не знаете почему. Или если вы хотите протестировать производительность программы. Не забывайте про возможность отладки (`-c`) и возможность прицепиться к процессу по pid (`-p`).
|
||||||
|
|
||||||
- Не забывайте про `ldd` для проверки используемых библиотек.
|
- Не забывайте про `ldd` для проверки используемых библиотек.
|
||||||
|
|
||||||
|
@ -323,14 +323,14 @@ mkdir empty && rsync -r --delete empty/ some-dir && rmdir some-dir
|
||||||
- Используйте `dmesg`, когда что-то ведет себя совсем странно (например, железо или драйвера).
|
- Используйте `dmesg`, когда что-то ведет себя совсем странно (например, железо или драйвера).
|
||||||
|
|
||||||
- Если вы удалили файл и это вопреки ожиданиям не освободило место на диске, как показывает `du`, проверьте, использует ли файл какой-нибудь процесс:
|
- Если вы удалили файл и это вопреки ожиданиям не освободило место на диске, как показывает `du`, проверьте, использует ли файл какой-нибудь процесс:
|
||||||
`lsof | grep deleted | grep "filename-of-my-big-file"`
|
`lsof | grep deleted | grep "filename-of-my-big-file"`.
|
||||||
|
|
||||||
|
|
||||||
## В одну строчку
|
## В одну строчку
|
||||||
|
|
||||||
Давайте соберем все вместе и напишем несколько команд:
|
Давайте соберем все вместе и напишем несколько команд:
|
||||||
|
|
||||||
- Это довольно круто, что можно найти множественные пересечения файлов, соединить отсортированные файлы и посмотреть разницу в нескольких файлов через `sort`/`uniq`. Это быстрый подход и работает на файлах любого размера (включая многогигабайтные файлы). (Сортировка не ограничена памятью, но возможно вам придется добавить `-T`, если `/tmp` находится на небольшом логическом диске). Еще посмотрите то, что было сказано выше о `LC_ALL`. Флаг сортировки `-u` не используется ниже, чтобы было понятнее:
|
- Это довольно круто, что можно найти множественные пересечения файлов, соединить отсортированные файлы и посмотреть разницу в нескольких файлах через `sort`/`uniq`. Это быстрый подход и работает на файлах любого размера, включая многогигабайтные файлы (сортировка не ограничена памятью, но, возможно, вам придется добавить `-T`, если `/tmp` находится на небольшом логическом диске). Еще посмотрите то, что было сказано выше о `LC_ALL`. Флаг сортировки `-u` не используется ниже, чтобы было понятнее:
|
||||||
```sh
|
```sh
|
||||||
cat a b | sort | uniq > c # c is a union b
|
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 | sort | uniq -d > c # c is a intersect b
|
||||||
|
@ -340,7 +340,7 @@ mkdir empty && rsync -r --delete empty/ some-dir && rmdir some-dir
|
||||||
- Используйте `grep . *` для того, чтобы посмотреть содержимое всех файлов в директории. Особенно полезно, когда у вас много конфигов типа `/sys`, `/proc`, `/etc`.
|
- Используйте `grep . *` для того, чтобы посмотреть содержимое всех файлов в директории. Особенно полезно, когда у вас много конфигов типа `/sys`, `/proc`, `/etc`.
|
||||||
|
|
||||||
|
|
||||||
- Получить сумму всех чисел, которые находятся в третьей колонке текстового файла. (Скорее всего, это раза в 3 быстрее и раза в 3 проще, чем делать это в Питоне):
|
- Получить сумму всех чисел, которые находятся в третьей колонке текстового файла (скорее всего, это раза в 3 быстрее и раза в 3 проще, чем делать это в Питоне):
|
||||||
```sh
|
```sh
|
||||||
awk '{ x += $3 } END { print x }' myfile
|
awk '{ x += $3 } END { print x }' myfile
|
||||||
```
|
```
|
||||||
|
@ -429,7 +429,7 @@ mkdir empty && rsync -r --delete empty/ some-dir && rmdir some-dir
|
||||||
|
|
||||||
- `lockfile`: создание семафорного файла, который может быть удален только с помощью `rm -f`
|
- `lockfile`: создание семафорного файла, который может быть удален только с помощью `rm -f`
|
||||||
|
|
||||||
- `logrotate`: ротация, сжатие и отправка логов по почте.
|
- `logrotate`: ротация, сжатие и отправка логов по почте
|
||||||
|
|
||||||
- `watch`: повторный запуск команды с выводом результата или подсветкой изменений
|
- `watch`: повторный запуск команды с выводом результата или подсветкой изменений
|
||||||
|
|
||||||
|
@ -515,7 +515,7 @@ mkdir empty && rsync -r --delete empty/ some-dir && rmdir some-dir
|
||||||
|
|
||||||
- `lshw`, `lscpu`, `lspci`, `lsusb`, `dmidecode`: информация о железе, включая CPU, BIOS, RAID, графику, девайсы, и т.д.
|
- `lshw`, `lscpu`, `lspci`, `lsusb`, `dmidecode`: информация о железе, включая CPU, BIOS, RAID, графику, девайсы, и т.д.
|
||||||
|
|
||||||
- `lsmod` и `modinfo`: информация о модулях ядра.
|
- `lsmod` и `modinfo`: информация о модулях ядра
|
||||||
|
|
||||||
- `fortune`, `ddate`, и `sl`: хм, не знаю, будут ли вам "полезны" веселые цитатки и поезда, пересекающие ваш терминал :)
|
- `fortune`, `ddate`, и `sl`: хм, не знаю, будут ли вам "полезны" веселые цитатки и поезда, пересекающие ваш терминал :)
|
||||||
|
|
||||||
|
@ -554,7 +554,7 @@ mkdir empty && rsync -r --delete empty/ some-dir && rmdir some-dir
|
||||||
|
|
||||||
- Имейте в виду, что виндовый диск `C:\` доступен в Cygwin по пути `/cygdrive/c`, и cygwin''ский `/` является папкой `C:\cygwin` в Windows. Конвертируйте файловые пути в виндовые и обратно с помощью `cygpath`. Это самый полезный скрипт, который запускает программы Windows.
|
- Имейте в виду, что виндовый диск `C:\` доступен в Cygwin по пути `/cygdrive/c`, и cygwin''ский `/` является папкой `C:\cygwin` в Windows. Конвертируйте файловые пути в виндовые и обратно с помощью `cygpath`. Это самый полезный скрипт, который запускает программы Windows.
|
||||||
|
|
||||||
- Вы можете запускать и автоматизировать большинство задач по администрированию Windows из командной строк, освоив `wmic`.
|
- Вы можете запускать и автоматизировать большинство задач по администрированию Windows из командной строки, освоив `wmic`.
|
||||||
|
|
||||||
## Больше информации по теме
|
## Больше информации по теме
|
||||||
|
|
||||||
|
@ -563,7 +563,7 @@ mkdir empty && rsync -r --delete empty/ some-dir && rmdir some-dir
|
||||||
- [Strict mode](http://redsymbol.net/articles/unofficial-bash-strict-mode/): Для того, чтобы писать шелл-скрипты лучше.
|
- [Strict mode](http://redsymbol.net/articles/unofficial-bash-strict-mode/): Для того, чтобы писать шелл-скрипты лучше.
|
||||||
- [shellcheck](https://github.com/koalaman/shellcheck): Статический анализатор скриптов.
|
- [shellcheck](https://github.com/koalaman/shellcheck): Статический анализатор скриптов.
|
||||||
- [Filenames and Pathnames in Shell](http://www.dwheeler.com/essays/filenames-in-shell.html): Сборник мелочей о правильной обработке имен файлов в скриптах.
|
- [Filenames and Pathnames in Shell](http://www.dwheeler.com/essays/filenames-in-shell.html): Сборник мелочей о правильной обработке имен файлов в скриптах.
|
||||||
- [Data Science at the Command Line](http://datascienceatthecommandline.com/#tools): Обзор команд и утилит, используемых для обработки данных, из одноименной книги
|
- [Data Science at the Command Line](http://datascienceatthecommandline.com/#tools): Обзор команд и утилит, используемых для обработки данных, из одноименной книги.
|
||||||
|
|
||||||
## Дисклеймер
|
## Дисклеймер
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue