diff --git a/README-es.md b/README-es.md index 3014e04..e6ec203 100644 --- a/README-es.md +++ b/README-es.md @@ -1,4 +1,4 @@ -[ Languages: [English](README.md), [Español](README-es.md), [Português](README-pt.md), [中文](README-zh.md) ] +[ Languages: [English](README.md), [Español](README-es.md), [Português](README-pt.md), [中文](README-zh.md), [Русский](README-ru.md) ] # El Arte del Terminal @@ -25,8 +25,8 @@ Gran parte esta [appeared](http://www.quora.com/What-are-the-most-useful-Swiss-army-knife-one-liners-on-Unix) en [Quora](http://www.quora.com/What-are-some-time-saving-tips-that-every-Linux-user-should-know), pero debido al interés mostrado ahí, parece que vale la pena usar Github, donde las personas con mayor talento que facílmente sugerir mejoras. Si yo vez un error o algo que podría ser mejor, por favor, cree un issue o PR! (Por supuesto revise la sección meta de PRs/issues primero.) - - + + ## Meta Alcance: @@ -34,7 +34,7 @@ Alcance: - Esta guía es para ambos el principiante y el experimentado. Los objetivos son *diversidad* (todo importa), *especificidad* (dar ejemplos concretos del caso más común), y *concisión* (evitar cosas que no son esenciales o insignificantes que puedas buscar facilmente en otro lugar). Cada consejo es esencial en alguna situación o significativamente ahorra tiempo comparada con otras alternativas. - Esta escrito para Linux, con excepción de la sección "[Solo para MacOS](#macos-only)". Muchos de los otros puntos aplican o pueden ser instalados en otros Unices o MacOS (o incluso Cygwin). - Se enficá en Bash interactivo, Aunque muchos de los consejos se aplican para otros shells y al Bash scripting por lo general. -- Esta incluye ambos comandos "estándar" Unix commands así como aquellos que requiren la instalación especial de in paquete -- siempre que sea suficientemente importante para ameritar su inclusión. +- Esta incluye ambos comandos "estándar" Unix commands así como aquellos que requiren la instalación especial de in paquete -- siempre que sea suficientemente importante para ameritar su inclusión. Notas: @@ -384,7 +384,7 @@ Algunos ejemplos de comandos reunidos: - `units`: unidades de conversión y calculaciones; convierte furlongs por fortnight para twips por blink (ver también `/usr/share/units/definitions.units`) -- `7z`: conpresión de archivos de alto nivel +- `7z`: conpresión de archivos de alto nivel - `ldd`: información de libreria dinamica @@ -469,6 +469,6 @@ Con excepción de pequeñas tareas, el código está escrito para que otros pued ## Licencia -[![Creative Commons License](https://i.creativecommons.org/l/by-sa/4.0/88x31.png)](http://creativecommons.org/licenses/by-sa/4.0/) +[![Creative Commons License](https://i.creativecommons.org/l/by-sa/4.0/88x31.png)](http://creativecommons.org/licenses/by-sa/4.0/) Este trabajo esta licenciado bajo [Creative Commons Attribution-ShareAlike 4.0 International License](http://creativecommons.org/licenses/by-sa/4.0/). diff --git a/README-pt.md b/README-pt.md index a85c14f..db5f8ea 100644 --- a/README-pt.md +++ b/README-pt.md @@ -1,7 +1,7 @@ -[ Languages: [English](README.md), [Español](README-es.md), [Português](README-pt.md), [中文](README-zh.md) ] +[ Languages: [English](README.md), [Español](README-es.md), [Português](README-pt.md), [中文](README-zh.md), [Русский](README-ru.md) ] -# A arte da linha de comando +# A arte da linha de comando - [Meta](#meta) - [Básico](#básico) @@ -30,15 +30,15 @@ Escopo: - Este guia é destinado tanto aos iniciantes quanto aos usuários mais experientes. Os objetivos são *abrangencia* (tudo que é importante), *especificidade* (dar exemplos concretos dos casos de usos mais comuns), e *brevidade* (evitar coisas que não são tão essenciais ou digressões que você pode facilmente encontrar pela internet). Todas as dicas são essenciais em alguma situação ou trazem uma economia notável de tempo em relação a outras alternativas. - Este guia é escrito para o Linux. Muitos, mas não todos os items, se aplicam igualmente para o MacOS (ou mesmo o Cygwin). - O foco está na interatividade com Bash, embora muitas dicas aqui sejam aplicáveis a outras `shells' e tambem a scripts em Bash, em geral. -- Incluimos tanto comandos no Unix "padrão", quanto comandos que requeiram instalação de pacotes adicionais -- desde que estes sejam importantes o suficiente para merecerem sua inclusão nessa lista. +- Incluimos tanto comandos no Unix "padrão", quanto comandos que requeiram instalação de pacotes adicionais -- desde que estes sejam importantes o suficiente para merecerem sua inclusão nessa lista. Notas: - Para manter este guia em uma única página, o conteúdo implícito será incluído por referência. Você é competente o suficiente para verificar mais detalhes em outros lugares, desde que você já tenha entendido a ideia ou saiba o que procurar no Google. Use `apt-get`/`yum`/`dnf`/`pacman`/`pip`/`brew` (quando adequado) para instalar novos programas. -- Use [Explainshell](http://explainshell.com/) para encontrar informações úteis sobre o que fazem os comandos, as opções, pipes e etc. +- Use [Explainshell](http://explainshell.com/) para encontrar informações úteis sobre o que fazem os comandos, as opções, pipes e etc. -## Básico +## Básico - Aprenda o básico sobre Bash. Na verdade, digite `man bash` e pelo menos entenda superficialmente o seu funcionamento; é bastante simples de ler e nem é tão grande assim. Shells alternativas podem ser legais, mas Bash é a mais poderosa e sempre está disponível (aprender *somente* zsh, fish, etc, é tentador quando você usa o seu próprio notebook, mas restringe você em muitas situações, por exemplo quando você quer usar servidores de outros). @@ -63,11 +63,11 @@ Notas: - Aprenda a usar `apt-get`, `yum`, `dnf` ou `pacman` (dependendo da distribuição) para procurar e instalar pacotes. E garanta que você possui o `pip` para instalar ferramentas baseadas em Python (algumas das abaixo são mais fáceis de instalar através do `pip`). -## Uso diário +## Uso diário - Usando Bash, use **Tab** para completar argumentos e **ctrl-r** para pesquisar através a história dos comandos. -- Em Bash, utilize **ctrl-w** para deletar a última palavra, e **ctrl-u** para deletar tudo e voltar para o início da linha. Use **alt-b** e **alt-f** para se mover por palavras, **ctrl-k** para apagar até o final da linha, **ctrl-l** para limpar a tela. Consulte `man readline` para todos os keybindings padrões do Bash. Existem muitos. Por exemplo **alt-.** circula através dos argumentos anteriores, e **alt-*** expande um glob. +- Em Bash, utilize **ctrl-w** para deletar a última palavra, e **ctrl-u** para deletar tudo e voltar para o início da linha. Use **alt-b** e **alt-f** para se mover por palavras, **ctrl-k** para apagar até o final da linha, **ctrl-l** para limpar a tela. Consulte `man readline` para todos os keybindings padrões do Bash. Existem muitos. Por exemplo **alt-.** circula através dos argumentos anteriores, e **alt-*** expande um glob. - Alternativamente, se você adora os keybinds do vi, use `set -o vi`. @@ -111,7 +111,7 @@ Notas: diff /etc/hosts <(ssh somehost cat /etc/hosts) ``` -- Saiba sobre "documentos aqui" no Bash, como em `cat <logfile 2> $1`. Muitas vezes, para garantir que um comando não deixa um arquivo aberto para manipular a entrada padrão, digitando isso no terminal que você está, é uma boa prática adicionar um `` e um completo rastreamento da pilha(stack trace) e resumo do heap (incluindo detalhes geracionais do garbage collector, os quais podem ser altamente informativos) serão vazados para stderr/logs. @@ -302,19 +302,19 @@ Alguns exemplos de como reunir os comandos. ``` -## Obscuros mas úteis +## Obscuros mas úteis -- `expr`: executa operações boleanas ou aritméticas ou avalia expressões regulares. +- `expr`: executa operações boleanas ou aritméticas ou avalia expressões regulares. -- `m4`: simples processador de macros. +- `m4`: simples processador de macros. -- `yes`: imprime uma string muitas vezes. +- `yes`: imprime uma string muitas vezes. -- `cal`: calendário legal. +- `cal`: calendário legal. - `env`: executa um comando (útil em scripts). -- `printenv`: imprime as variáveis de ambiente (útil em debug e scripts). +- `printenv`: imprime as variáveis de ambiente (útil em debug e scripts). - `look`: procura palavras inglesas (ou linhas em um arquivo) começando com uma string. @@ -328,69 +328,69 @@ Alguns exemplos de como reunir os comandos. - `column`: formata texto em colunas ou tabelas. -- `expand` e `unexpand`: converte entre tabs e espaços. +- `expand` e `unexpand`: converte entre tabs e espaços. -- `nl`: adiciona números as linhas. +- `nl`: adiciona números as linhas. -- `seq`: imprime números. +- `seq`: imprime números. -- `bc`: calculadora. +- `bc`: calculadora. -- `factor`: fatora inteiros. +- `factor`: fatora inteiros. -- `gpg`: criptografa e assina arquivos. +- `gpg`: criptografa e assina arquivos. -- `toe`: tabela de entradas dos tipos de terminais. +- `toe`: tabela de entradas dos tipos de terminais. -- `nc`: ferramenta de debug de rede e transferência de dados. +- `nc`: ferramenta de debug de rede e transferência de dados. - `socat`: socket relay e encaminhamento de portas tcp (similar ao `netcat`) -- `slurm`: visualização do tráfego da rede. +- `slurm`: visualização do tráfego da rede. - `dd`: move os dados entre arquivos ou dispositivos. -- `file`: identifica o tipo do arquivo. +- `file`: identifica o tipo do arquivo. -- `tree`: mostra os diretórios e subdiretórios como um árvore de dependências; como `ls` mas recursivo. +- `tree`: mostra os diretórios e subdiretórios como um árvore de dependências; como `ls` mas recursivo. -- `stat`: informações do arquivo. +- `stat`: informações do arquivo. -- `tac`: imprime arquivos na ordem reversa. +- `tac`: imprime arquivos na ordem reversa. - `shuf`: seleção random de linhas de um arquivo. -- `comm`: compara uma lista de arquivos ordenadas linha por linha. +- `comm`: compara uma lista de arquivos ordenadas linha por linha. -- `pv`: monitora o progresso dos dados através de um pipe. +- `pv`: monitora o progresso dos dados através de um pipe. - `hd` e `bvi`: dump ou edita arquivos binários. - `strings`: extrai texto de arquivos binários. -- `tr`: tradução e manipulação de caracteres. +- `tr`: tradução e manipulação de caracteres. - `iconv` ou `uconv`: conversor de codificações de texto. -- `split ` e `csplit`: divisão de arquivos. +- `split ` e `csplit`: divisão de arquivos. - `units`: conversor de unidades e cálculos; converte furlongs por quinzena para twips per blink (veja também `/usr/share/units/definitions.units`) - `7z`: Compressor de arquivos de alto desempenho. -- `ldd`: informações dinâmicas das bibliotecas. +- `ldd`: informações dinâmicas das bibliotecas. - `nm`: símbolos de arquivos objetos. - `ab`: benchmarking para web servers. -- `strace`: Debug para chamadas de sistema. +- `strace`: Debug para chamadas de sistema. - `mtr`: melhor traceroute para debugar a rede. - `cssh`: Visualização concorrente da shell. -- `rsync`: Sincroniza arquivos e pastas através do SSH. +- `rsync`: Sincroniza arquivos e pastas através do SSH. - `wireshark` e `tshark`: captura de pacotes e debug de rede. @@ -398,25 +398,25 @@ Alguns exemplos de como reunir os comandos. - `host` e `dig`: Consultas DNS. -- `lsof`: Arquivo de descritores dos processos e informações dos sockets. +- `lsof`: Arquivo de descritores dos processos e informações dos sockets. -- `dstat`: Estatísticas úteis do sistema. +- `dstat`: Estatísticas úteis do sistema. -- [`glances`](https://github.com/nicolargo/glances): Resumo de alto nível, de multi subsistemas. +- [`glances`](https://github.com/nicolargo/glances): Resumo de alto nível, de multi subsistemas. -- `iostat`: Estatísticas de uso do CPU e do disco. +- `iostat`: Estatísticas de uso do CPU e do disco. -- `htop`: Versão do top melhorada. +- `htop`: Versão do top melhorada. -- `last`: histórico de logins. +- `last`: histórico de logins. -- `w`: quem está logado. +- `w`: quem está logado. -- `id`: Informações sobre a identidade do user/group. +- `id`: Informações sobre a identidade do user/group. -- `sar`: histórico dos estados do sistema. +- `sar`: histórico dos estados do sistema. -- `iftop` ou `nethogs`: Utilização da rede por sockets ou processos. +- `iftop` ou `nethogs`: Utilização da rede por sockets ou processos. - `ss`: Estatísticas dos sockets. @@ -430,20 +430,20 @@ Alguns exemplos de como reunir os comandos. - `lshw` e `lspci`: informações do hardware, incluindo RAID, gráficos, etc. -- `fortune`, `ddate`, e `sl`: um, bem, isto depende de você considerar locomotivas a vapor e citações Zippy "úteis". +- `fortune`, `ddate`, e `sl`: um, bem, isto depende de você considerar locomotivas a vapor e citações Zippy "úteis". -## Mais conteúdo +## Mais conteúdo - [awesome-shell](https://github.com/alebcay/awesome-shell): Uma lista refinada de ferramentas da shell e outros recursos. -- [Strict mode](http://redsymbol.net/articles/unofficial-bash-strict-mode/) para escrever shell scripts melhores. +- [Strict mode](http://redsymbol.net/articles/unofficial-bash-strict-mode/) para escrever shell scripts melhores. -## Aviso +## Aviso Com a exceção de tarefas muito pequenas, código é normalmente escrito para que outros possam ler. Junto com o poder vem a responsabilidade. O fato de você *poder* fazer algo usando Bash não significa necessariamente que você deve! ;) -## Licença +## Licença -[![Creative Commons License](https://i.creativecommons.org/l/by-sa/4.0/88x31.png)](http://creativecommons.org/licenses/by-sa/4.0/) +[![Creative Commons License](https://i.creativecommons.org/l/by-sa/4.0/88x31.png)](http://creativecommons.org/licenses/by-sa/4.0/) Este trabalho está licenciado com uma [Creative Commons Attribution-ShareAlike 4.0 International License](http://creativecommons.org/licenses/by-sa/4.0/). diff --git a/README-ru.md b/README-ru.md new file mode 100644 index 0000000..ba32ef0 --- /dev/null +++ b/README-ru.md @@ -0,0 +1,474 @@ +[ На других языках: [English](README.md), [Español](README-es.md), [Português](README-pt.md), [中文](README-zh.md), [Русский](README-ru.md) ] + +# Искусство командной строки + +[![Вступайте в англоязычный чат проекта https://gitter.im/jlevy/the-art-of-command-line](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/jlevy/the-art-of-command-line?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) + +- [Описание](#Описание) +- [Основы](#Основы) +- [Ежедневное использование](#Ежедневное-использование) +- [Процессинг файлов и информации](#Процессинг-файлов-и-информации) +- [Системный дебаггинг](#Системный-дебаггинг) +- [В одну строчку](#В-одну-строчку) +- [Сложно, но полезно](#Сложно-но-полезно) +- [MacOS only](#Macos-only) +- [Больше информации по теме](#Больше-информации-по-теме) +- [Дисклеймер](#Дисклеймер) + + +![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. Некоторые из их них – простые и очевидные, но некоторые довольно сложные и предназначены для решения конкретных задач. Это небольшая публикация, но если Вы знаете обо всем, что тут написано, и можете вспомнить как это все использовать – вы много знаете! + +Многое из того, что тут написано +[изначально](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), +начав идею там, похоже, что стоит развить ее на Gihub, где обитают люди, которые талантлевее меня и могут предлагать улучения данной подборки. Если Вы заметили ошибки (во всех вариантах перевода), пожалуйста оставьте тикет или киньте пулл-реквест (заранее изучив описание и посмотрев на уже созданнные тикеты и пулл-реквесты). + +## Описание + +Основное: + +- Данная публикация предназначена как для новичков, так и для опытных людей. Цели: *объемность* (собрать все важные аспекты использования командной строки), *практичность* (давать конкретные примеры для самых частых юзкейсов) и *краткость* (не стоит углубляться в неочевидные вещи, о которых можно почитать в другом месте). +- Этот документ написан для пользователей Linux, с единственным исключеним – секцией "[MacOS only](#macos-only)". Все остальное подходит и может быть установлено под все UNIX/MacOS системы (и даже Cygwin). +- Фокусируемся на интерактивном Баше, но многие вещи так же могут быть использованы с другими шеллами; и в общем приминимы к Баш-скирптингу +- Эта инструкция включает в себя стандартные Unix комманды и те, для которых нужно устанавливать сторонние пакеты – они настолько полезны, что стоят того, чтобы их установили + +Заметки: + +- Для того, чтобы руководство оставалось одностраничным, вся информация вставлена прямо сюда. Вы достаточно умные для того, чтобы самостоятельно изучить вопрос более детально в другом месте. Используйте `apt-get`/`yum`/`dnf`/`pacman`/`pip`/`brew` (в зависимости от вашей системы управления пакетами) для установки новых програм. + +- На [Explainshell](http://explainshell.com/) можно найти простое и детальное объясение того, что такое команды, флаги, пайпы и т.д. + +## Основы + +- Выучите основы Баша. Просто возьмите и напечатайте `man bash` в терминале и хотя бы просмотрите его; он довольно просто читается и он не очень большой. Другие шеллы тоже могут быть хороши, но Баш – мощная программа и Баш всегда под рукой (использование *исключительно* zsh, fish и т.д., которые наверняка круто выглядят на Вашем ноуте во многом Вас ограничивает, например Вы не сможете использовать возможности этих шеллов на уже существующем сервере). + +- Выучите хотя бы один консольный редактор текста. Идеально Vim (`vi`), ведь у него нет конкурентов, когда вам нужно быстренько что-то подправить (даже если Вы постоянно сидите на Emacs/какой-нибудь тяжелой IDE или на каком-нибудь модном хипстерском редакторе) + +- Знайте как читать документацию через `man` (для любознательных – `man man`; `man` по углам документа в скобках добавляет номер, например 1 – для обычных команд, 5 – для файлов, конвенций, 8 – для администативных команд). Ищите мануалы через `apropos`, и помните, что некоторые команды – не бинарники, а встроенные команды Баша, и помощь по ним можно получить через `help` и `help -d`. + +- Узнайте о том, как перенаправлять ввод и вывод через `>` и `<` и пайпы `|`. Помните, что `>` – переписывает выходной файл, а `>>` добавляет к нему. Узнайте побольше про stdout and stderr. + +- Узнайте побольше про file glob expansion with `*` (and perhaps `?` and `{`...`}`), кавычки а так же разницу между двойными `"` и одинарными `'` кавычками. (Больше о расширении переменных читайте ниже) + +- Будьте знакомы с работой с процессами в Bash: `&`, **ctrl-z**, **ctrl-c**, `jobs`, `fg`, `bg`, `kill`, и т.д. + +- Знайте `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`. + +- Основы работы с сетью: `ip` или `ifconfig`, `dig`. + +- Хорошо знайте регулярные выражения и разные флаги к `grep`/`egrep`. Такие флаги как `-i`, `-o`, `-A`, и `-B` стоит знать. + +- Обучитесь использованию системами управления пакетами `apt-get`, `yum`, `dnf` или `pacman` (в зависимости от дистрибутива). Занйте как искать и устанавливать пакеты и обязательно имейте установленым `pip` для установки командных утилит, написаных на Python (некоторые из тех, что вы найдете ниже легче всего установить через `pip`) + + +## Ежедневное использование + +- Используйте таб в Баше для автокомплита аргументов к командам и **ctrl-r** для поиска по истории командной строки + +- Используйте **ctrl-w** в Баше для того, чтобы удалить последнее слово в команде; **ctrl-u** для того, что бы удалить команду полностью. Используйте **alt-b** и **alt-f** для того, чтобы бегать между словами команды, **ctrl-k** для того, чтобы прыгнуть к концу строки, **ctrl-l** для того, чтобы очистить экран. Гляньте на `man readline` чтобы узнать о всех шорткатах Баша. Их много! Например, **alt-.** бежит по предыдущим аргументам команды, а **alt-*** расширяет глоб.?? + +- Если Вам нравятся шорткаты Вима сделайте `set -o vi`. + +- Для того, чтобы посмотреть историю введите `history`. Так же существует множество аббривиатур, например `!$` – последний аргумент, `!!` – последняя команда, хотя эти аббривиатуры часто заменяются шорткатами **ctrl-r** и **alt-.**. + +- Для того, чтобы прыгнуть к последней рабочей директории – `cd -` + +- Если Вы написали команду наполовину и вдруг передумали нажмите **alt-#** для того, чтобы добавить `#` к началу и отправьте комманду как комментарий. Потом вы сможете вернуться к ней через историю. + +- Не забывайте использовать `xargs` (или `parallel`). Это очень мощная штука. Обратите внимание, что Вы можете контролировать количество команд на каждую строку, а так же параллельность. Если Вы не уверены, что делаете что-то правильно, начните с `xargs echo`. Еще `-I{}` – полезная штука. Примеры: +```bash + find . -name '*.py' | xargs grep some_function + cat hosts | xargs -I{} ssh root@{} hostname +``` + +- `pstree -p` – полезный тип вывода дерева процессов. + +- Используйте `pgrep` или `pkill` для того чтобы находить/слать сигналы к процессам по имени (`-f` помогает). + +- Знайте разные сигналы, которые можно слать процессам. Например, чтобы приостановить процесс используйте `kill -STOP [pid]`. Для полного списка посмотрите `man 7 signal`. + +- Используйте `nohup` или `disown` для того, чтобы процесс в фоне выполнялся бесконечно. + +- Узнайте какие процессы слушают порты через `netstat -lntp` или `ss -plat` (для TCP; добавьте `-u` для UDP). + +- Так же `lsof` для того, чтобы посмотреть открытые сокеты и файлы. + +- Используйте `alias` для того, чтобы алиасить часто используемые команды. Например, `alias ll='ls -latr'` создаст новый алиас `ll`. + +- В Баш скритах используйте `set -x` для того, чтобы дебажить аутпут. Используйте строгие режимы везде, где возможно. Используйте `set -e` для того, чтобы прекращать выполнение при ошибках. Используйте `set -o pipefail` для того, чтобы строго относится к ошибкам (это немного глубокая тема). Для более сложных скриптов так же используйте `trap`. + +- В Баш скриптах, подоболочки (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`. + +- Вывод любой команды можно обратить в файл через `<(some command)`. Например, сравнение локального файла `/etc/hosts с удаленным: +```sh + diff /etc/hosts <(ssh somehost cat /etc/hosts) +``` + +- Знайте про heredoc-синтаксис в Баше, работает он вот так `cat <logfile 2>&1`. Зачастую для того, чтобы убедится, что команда не оставит открытым файл, привязав его к открытому терминалу считается хорошей практикой добавлять `; ::Any-NFC; ' < input.txt > output.txt +``` + +- Для того, чтобы разбить файл на куски используйте `split` (разбивает на куски по размеру), или `csplit` (по шаблону или регулярному выражению) + +- Используйте `zless`, `zmore`, `zcat`, и `zgrep` для работы с сжатыми файлами. + +## Системный дебаггинг + +- Дле веб-дебаггинга используйте `curl` и `curl -I`, или их альтернативу `wget`. Так же есть более современные альтернативы, типа [`httpie`](https://github.com/jakubroztocil/httpie). + +- Чтобы получить информацию о диске/CPU/сети используйте `iostat`, `netstat`, `top` (или лучшую альтернатву `htop`) и особенно `dstat`. Хороший старт для того, чтобы понимать что происходит в системе. + +- Для более детальной информации используйте [`glances`](https://github.com/nicolargo/glances). Эта программа показывает сразу несколько разных статистик в одном окне терминале. Полезно, когда следите за сразу несколькими системами. + +- Для того, чтобы следить за памятью научитесь понимать `free` и `vmstat`. В частности не забывайте, что кешированые значения ("cached" value) – это память, которую держит ядро и эти значения являются частью `free`. + +- Дебаггинг Джавы – совсем другая рыбка, но некоторые манипуляции над виртуальной машиной Оракла или любой другой позволит вам использовать делать `kill -3 ` и трассировать сводки стека и хипа (включая детали работы сборщика мусора, которые бывают очень полезными), и их можно дампнуть в stderr или логи. + +- Используйте `mtr` для лучшей трассировки, чтобы находить проблемы сети. + +- Для того, чтобы узнать почему диск полностью забит используйте `ncdu`, это сохраняет время по сравнению с тем же `du -sh *`. + +- Для того, чтобы узнать какой сокет или процесс использует интернет используйте `iftop` или `nethogs`. + +- `ab`, которая поставляется вместе в Апачем полезна для быстрой нетщательной проверки производительности веб-сервера. Для более серьезного лоад-тестинга используйте `siege`. + +- Для более серьезного дебаггинга сетей используйте `wireshark`, `tshark`, и `ngrep`. + +- Знайте про `strace` и `ltrace`. Эти команды могут быть полезны, если программа падает или висит и вы не знаете почему, или если вы хотите протестировать производительность программы. Не забывайте про возможность дебаггинга (`-c`) и возможностью прицепиться к процессу (`-p`). + +- Не забывайте про `ldd` для проверки системных библиотек. + +- Знайте как прицепиться к бегущему процессу через `gdb` и получить трассировку стека. + +- Используйте `/proc`. Иногда он невероятно полезен для дебага запущенных программ. Примеры: `/proc/cpuinfo`, `/proc/xxx/cwd`, `/proc/xxx/exe`, `/proc/xxx/fd/`, `/proc/xxx/smaps`. + +- Когда дебажете что-то, что сломалось в прошлом используйте `sar` – бывает очень полезно. Показывает историю CPU, памяти, сети и т.д. + +- Для анализа более глубоких систем и производительности посмотрите на `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` (информация о дистрибутиве). + +- Используйте `dmesg` когда что-то ведет себя совсем странно (например железо или драйвера). + +## В одну строчку + +Давайте соберем все вместе и напишем несколько комманд: + +- Это довольно круто, что можно найти множественные пересечения файлов, соединить отсортированные файлы и посмотреть разницу в нескольких файлов через `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`. + + +- Получить сумму всех чисел, которые находятся в третьей колонки текстового файла. (Скорее всего, это раза в 3 быстрее и раза в 3 проще чем делать это в Питоне): +```sh + awk '{ x += $3 } END { print x }' myfile +``` + +- Если вам нужно посмотреть размеры и даты создания древа файлов используйте: +```sh + find . -type f -ls +``` +Это почти как рекурсивная `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`. Давайте подсчитаем сколько таких запросов в нашем логе: +```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 | + pandoc -f markdown -t html | + xmlstarlet fo --html --dropdtd | + xmlstarlet sel -t -v "(html/body/ul/li[count(p)>0])[$RANDOM mod last()+1]" | + xmlstarlet unesc | fmt -80 + } +``` + + +## Сложно, но полезно + +- `expr`: для выполнения арифметических и булевых операций, а так же регулярных выражений + +- `m4`: простенький макро-процессор + +- `yes`: вывод строки в бесконечном цикле + +- `cal`: классный календарь + +- `env`: для того, чтобы выполнить команду (полезно в Bash-скриптах) + +- `printenv`: print out environment variables (useful in debugging and scripts) + +- `look`: найти английские слова (или строки) в файле + +- `cut `, `paste` и `join`: манипуляция данными + +- `fmt`: форматировка параграфов в тексте + +- `pr`: отформатировать текст в страницы/колонки + +- `fold`: (обернуть) ограничить длину строк в файле + +- `column`: форматировать текст в колонки или таблицы + +- `expand` и `unexpand`: конвертация между табами и пробелами + +- `nl`: добавить номера строк + +- `seq`: вывести числа + +- `bc`: калькулятор + +- `factor`: возвести числа в степень + +- `gpg`: зашифровать и подписать файлы + +- `toe`: таблица терминалов terminfo с описанием + +- `nc`: дебаггинг сети и передачи данных + +- `socat`: переключатель сокетов и перенаправление tcp-портов (похоже на `netcat`) + +- `slurm`: визуализация трафика сети + +- `dd`: перенос информации между файлами и девайсами + +- `file`: узнать тип файла + +- `tree`: показать директории и сабдиректории в виде дерева; как `ls`, но рекурсивно + +- `stat`: информация о файле + +- `tac`: вывести файл наоборот (ласипан) + +- `shuf`: случайная выборка строк из файла + +- `comm`: построчно сравнить отсортированные файлы + +- `pv`: мониторинг прогресса прохождения информации через пайп + +- `hd` и `bvi`: дамп и редактирование бинарников + +- `strings`: найти текст в бинарникх + +- `tr`: манипуляция с char (символьным типом) + +- `iconv` и `uconv`: конвертация кодировок + +- `split` и `csplit`: разбить файлы + +- `sponge`: прочитать весь инпут перед тем, как его записать, полезно когда читаешь из того же файла, куда записываешь, например вот так: `grep -v something some-file | sponge some-file` + +- `units`: конвертер, метры в келометры, версты в пяди (смотрите `/usr/share/units/definitions.units`) + +- `7z`: архиватор с высокой степенью сжатия + +- `ldd`: показывает зависимости программы от системных библиотек + +- `nm`: получаем названия всех функций, которые определены в .o или .a + +- `ab`: бенчмаркинг веб-серверов + +- `strace`: дебаг системных вызовов + +- `mtr`: лучшей трассировка для дебаггинга сети + +- `cssh`: несколько терминалов в одном UI + +- `rsync`: синхронизация файлов и папок через SSH + +- `wireshark` и `tshark`: перехват пакетов и дебаг сети + +- `ngrep`: grep для слоя сети (network layer) + +- `host` и `dig`: узнать DNS + +- `lsof`: процессинг дискрипторов и информация о сокетах + +- `dstat`: полезная статистика системы + +- [`glances`](https://github.com/nicolargo/glances): высокоуровневая, многосистемная статистика + +- `iostat`: статистика CPU и использования жесткого диска + +- `htop`: улучшенная версия top + +- `last`: история логинов в систему + +- `w`: под каким пользователем вы сидите + +- `id`: информация о пользователе/группе + +- `sar`: история системной статистики + +- `iftop` или `nethogs`: использование сети конкретным сокетом или процессом + +- `ss`: статистика сокетов + +- `dmesg`: ошибки бута и ошибки системы + +- `hdparm`: манипуляция с SATA/ATA + +- `lsb_release`: информация о дистрибутиве Linux + +- `lsblk`: cписок блочных устройств компьютера: древо ваших дисков и логических дисков + +- `lshw`, `lscpu`, `lspci`, `lsusb`, `dmidecode`: информация о железе включая, CPU, BIOS, RAID, графику, девайсы, и т.д. + +- `fortune`, `ddate`, и `sl`: хм, не знаю будут ли вам "полезны" веселые цитатки и поезда, пересекающие ваш терминал :) + +## MacOS only + +Некоторые вещи релевантны *только* для Мака. + +- Системы управлением пакетами – `brew` (Homebrew) и `port` (MacPorts). Они могут быть использованы для того, чтобы установить большинство програм, упомянутых в этом документе. + +- Копируйте аутпут консольных программ в десктопные через `pbcopy`, и вставляйте инпут через `pbpaste`. + +- Для того, чтобы открыть файл или десктопную программу типа Finder используйте `open`, вот так `open -a /Applications/Whatever.app`. + +- Spotlight: Ищите файлы в консоле через `mdfind` и смотрите метадату (например EXIF информацию фотографий) через `mdls`. + +- Не забывайте, что MacOS основан на BSD Uni и многие команды (например `ps`, `ls`, `tail`, `awk`, `sed`) имеют некоторые небольшие различия с линуксовыми. Это обусловлено влянием `UNIX System V` и `GNU Tools`. Разницу можно заметить увидив заголовок "BSD General Commands Manual." к манам програм. В некоторых случаях, на Мак можно поставить GNU-версии программ, например `gawk` и `gsed`. Когда пишите кроссплатформенные Bash-скрипты, старайтесь избегать команды, которые могут различаться (например, лучше используйте Python или `perl`), или тщательно все тестируйте. + +## Больше информации по теме + +- [awesome-shell](https://github.com/alebcay/awesome-shell): Дополняемый список инструментов и ресурсов для командной строки. +- [Strict mode](http://redsymbol.net/articles/unofficial-bash-strict-mode/) Для того, чтобы писать шелл-скрипты лучше. + + +## Дисклеймер + +За небольшим исключением, весь код написан так, что другие его смогут прочитать. + +Кому много дано, с того много и спрашивается. Тот факт, что что-то может быть написано в Баше, вовсе не означает что оно должно быть там написано. ;) + + +## Лицензия + +[![Creative Commons License](https://i.creativecommons.org/l/by-sa/4.0/88x31.png)](http://creativecommons.org/licenses/by-sa/4.0/) + +Оригинальная работа и перевод на русский язык распространяется под лицензией [Creative Commons Attribution-ShareAlike 4.0 International License](http://creativecommons.org/licenses/by-sa/4.0/). diff --git a/README-zh.md b/README-zh.md index 41e4fb7..5e99d64 100644 --- a/README-zh.md +++ b/README-zh.md @@ -1,4 +1,4 @@ -[ Languages: [English](README.md), [Español](README-es.md), [Português](README-pt.md), [中文](README-zh.md) ] +[ Languages: [English](README.md), [Español](README-es.md), [Português](README-pt.md), [中文](README-zh.md), [Русский](README-ru.md) ] # 命令行的艺术 @@ -11,6 +11,7 @@ - [系统调试](#系统调试) - [一行代码](#一行代码) - [冷门但有用](#冷门但有用) +- [仅限 Mac 系统](#仅限-mac-系统) - [更多资源](#更多资源) - [免责声明](#免责声明) - [授权条款](#授权条款) @@ -18,7 +19,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) -熟练使用命令行是一种常常被忽视或被认为难以掌握的技能,但实际上,它可以提高你作为工程师的灵活性以及生产力。本文是一份我在 Linux 上工作时发现的一些关于命令行的使用的小技巧的摘要。这些小技巧有基础的、相当复杂的甚至晦涩难懂的。这篇文章并不长,但当你能够熟练掌握这里列出的所有技巧时,你就学会了很多关于命令行的东西了。 +熟练使用命令行是一种常常被忽视或被认为难以掌握的技能,但实际上,它可以提高你作为工程师的灵活性以及生产力。本文是一份我在 Linux 上工作时发现的一些关于命令行的使用的小技巧的摘要。有些小技巧是非常基础的,而另外一些则是相当复杂的甚至晦涩难懂的。这篇文章并不长,但当你能够熟练掌握这里列出的所有技巧时,你就学会了很多关于命令行的东西了。 这里的大部分内容 [首次](http://www.quora.com/What-are-some-lesser-known-but-useful-Unix-commands) @@ -31,7 +32,7 @@ 涵盖范围: - 这篇文章对刚接触命令行的新手以及具有命令行使用经验的人都有用处。本文致力于做到覆盖面广(尽量包括一切重要的内容),具体(给出最常见的具体的例子)以及简洁(避免一些不必要的东西以及一些偏题的可以在其他地方翻阅到文献的东西)。 每个小技巧在某个特定情境下都是基本的或能够显著地节约时间。 -- 本文为 Linux 所写,但很多内容(并非所有的)同样适用于 MacOS 甚至 Cygwin。 +- 本文为 Linux 所写,除了[仅限 Mac 系统](#仅限-mac-系统)节。其它节中的大部分内容都适用于其它 Unix 系统或 Mac 系统,甚至 Cygwin。 - 本文关注于交互式 Bash,尽管很多技巧适用于其他 shell 或 Bash 脚本。 - 本文包括了“标准的”Unix 命令和需要安装特定包的命令,只要它们足够重要。 @@ -49,7 +50,7 @@ - 学会如何使用 `man` 命令去阅读文档。学会使用 `apropos` 去查找文档。了解有些命令并不对应可执行文件,而是Bash内置的,可以使用 `help` 和 `help -d` 命令获取帮助信息。 -- 学会使用 `>` 和 `<` 来重定向输出和输入,学会使用 `|` 来重定向管道。了解标准输出 stdout 和标准错误 stderr。 +- 学会使用 `>` 和 `<` 来重定向输出和输入,学会使用 `|` 来重定向管道。明白 `>` 会覆盖了输出文件而 `>>` 是在文件未添加。了解标准输出 stdout 和标准错误 stderr。 - 学会使用通配符 `*` (或许再算上 `?` 和 `{`...`}`) 和引用以及引用中 `'` 和 `"` 的区别。 @@ -98,6 +99,8 @@ - 有关打开套接字和文件,请参阅 `lsof`。 +- 使用`alias`来创建常用命令的快捷形式。例如:`alias ll='ls -latr'`使你可以方便地执行`ls -latr`命令。 + - 在 Bash 脚本中,使用 `set -x` 去调试输出,尽可能的使用严格模式,使用 `set -e` 令脚本在发生错误时退出而不是继续运行,使用 `set -o pipefail` 严谨地对待错误(尽管问题可能很微妙)。当牵扯到很多脚本时,使用 `trap`。 - 在 Bash 脚本中,子 shell(使用括号`(...)`)是一种便捷的方式去组织参数。一个常见的例子是临时地移动工作路径,代码如下: @@ -142,13 +145,14 @@ stat -c '%A %a %n' /etc/timezone ``` -- 使用 [`percol`](https://github.com/mooz/percol) 可以交互式地从另一个命令输出中选取值。 +- 使用 [`percol`](https://github.com/mooz/percol) 或者 [`fzf`](https://github.com/junegunn/fzf) 可以交互式地从另一个命令输出中选取值。 - 使用 `fpp`([PathPicker](https://github.com/facebook/PathPicker))可以与基于另一个命令(例如 `git`)输出的文件交互。 - 将 web 服务器上当前目录下所有的文件(以及子目录)暴露给你所处网络的所有用户,使用: `python -m SimpleHTTPServer 7777` (使用端口 7777 和 Python 2)或`python -m http.server 7777` (使用端口 7777 和 Python 3)。 +- 以某种权限执行命令,使用`sudo`(root 权限)或`sudo -u`(其他用户)。使用`su`或者`sudo bash`来启动一个以对应用户权限运行的 shell。使用`su -`模拟其他用户的登录。 ## 文件及数据处理 @@ -195,7 +199,7 @@ - 使用 `shuf` 从一个文件中随机选取行。 -- 了解 `sort` 的参数。明白键的工作原理(`-t` 和 `-k`)。例如,注意到你需要 `-k1,1` 来仅按第一个域来排序,而 `-k1` 意味着按整行排序。稳定排序(`sort -s`)在某些情况下很有用。例如,以第二个域为主关键字,第一个域为次关键字进行排序,你可以使用 `sort -k1,1 | sort -s -k2,2`。处理可读性数字(例如 `du -h` 的输出)的时候使用 `sort -h` 。 +- 了解 `sort` 的参数。处理数字方面,使用 `-n` 或者 `-h` 来处理可读性数字(例如 `du -h` 的输出)。明白键的工作原理(`-t` 和 `-k`)。例如,注意到你需要 `-k1,1` 来仅按第一个域来排序,而 `-k1` 意味着按整行排序。稳定排序(`sort -s`)在某些情况下很有用。例如,以第二个域为主关键字,第一个域为次关键字进行排序,你可以使用 `sort -k1,1 | sort -s -k2,2`。 - 如果你想在 Bash 命令行中写 tab 制表符,按下 **ctrl-v** **[Tab]** 或键入 `$'\t'` (后者可能更好,因为你可以复制粘贴它)。 @@ -251,9 +255,9 @@ - 关于更深层次的系统分析以及性能分析,看看 `stap`([SystemTap](https://sourceware.org/systemtap/wiki)),[`perf`](http://en.wikipedia.org/wiki/Perf_(Linux)),以及[`sysdig`](https://github.com/draios/sysdig)。 -- 查看你当前使用的 Linux 发行版(大部分发行版有效):`lsb_release -a` +- 查看你当前使用的系统,使用 `uname` 或者 `uname -a` (Unix/kernel 信息) or `lsb_release -a` (Linux 发行版信息)。 -- 无论什么东西工作得很欢乐时试试 `dmesg` (可能是硬件或驱动问题)。 +- 无论什么东西工作得很欢乐时试试 `dmesg`(可能是硬件或驱动问题)。 ## 一行代码 @@ -432,6 +436,20 @@ - `fortune`,`ddate` 和 `sl`: 额,这主要取决于你是否认为蒸汽火车和莫名其妙的名人名言是否“有用” +## 仅限 Mac 系统 + +以下是*仅限于* Mac 系统的技巧 + +- 用 `brew` (Homebrew)或者 `port` (MacPorts)进行包管理。这些可以用来在 Mac 系统上安装以上的大多数命令。 + +- 用 `pbcopy` 复制任何命令的输出到桌面应用,用 `pbpaste` 粘贴输入。 + +- 用 `open` 或者 `open -a /Applications/Whatever.app` 使用桌面应用打开文件。 + +- Spotlight: 用 `mdfind` 搜索文件,用 `mdls` 列出元数据(例如照片的 EXIF 信息)。 + +- 注意 Mac 系统是基于 BSD UNIX 的,许多命令(例如 `ps`, `ls`, `tail`, `awk`,`sed`)都和 Linux 中有些微的不同,这些极大的被 System V-style Unix 和 GNU 工具影响。你可以通过标题为 "BSD General Commands Manual" 的 man 页面发现这些不同。在有些情况下 GNU 版本的命令也可能被安装(例如 `gawk` 和 `gsed` 对应 GNU 中的 awk 和 sed )。如果要写跨平台的 Bash 脚本,避免使用这些命令(例如,考虑 Python 或者 `perl` )或者经过仔细的测试。 + ## 更多资源 diff --git a/README.md b/README.md index 13f8e6b..327bdf6 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -[ Languages: [English](README.md), [Español](README-es.md), [Português](README-pt.md), [中文](README-zh.md) ] +[ [English](README.md), [Español](README-es.md), [Português](README-pt.md), [中文](README-zh.md), [Русский](README-ru.md) ] @@ -36,7 +36,7 @@ Scope: - This guide is both for beginners and the experienced. The goals are *breadth* (everything important), *specificity* (give concrete examples of the most common case), and *brevity* (avoid things that aren't essential or digressions you can easily look up elsewhere). Every tip is essential in some situation or significantly saves time over alternatives. - This is written for Linux, with the exception of the "[MacOS only](#macos-only)" section. Many of the other items apply or can be installed on other Unices or MacOS (or even Cygwin). - The focus is on interactive Bash, though many tips apply to other shells and to general Bash scripting. -- It includes both "standard" Unix commands as well as ones that require special package installs -- so long as they are important enough to merit inclusion. +- It includes both "standard" Unix commands as well as ones that require special package installs -- so long as they are important enough to merit inclusion. Notes: @@ -471,6 +471,6 @@ With the exception of very small tasks, code is written so others can read it. W ## License -[![Creative Commons License](https://i.creativecommons.org/l/by-sa/4.0/88x31.png)](http://creativecommons.org/licenses/by-sa/4.0/) +[![Creative Commons License](https://i.creativecommons.org/l/by-sa/4.0/88x31.png)](http://creativecommons.org/licenses/by-sa/4.0/) This work is licensed under a [Creative Commons Attribution-ShareAlike 4.0 International License](http://creativecommons.org/licenses/by-sa/4.0/).