22 KiB
[ Languages: English, Español, 日本語, 한국어, Português, Русский, Slovenščina, 中文, Українська ]
Мистецтво командного рядка
- Опис
- Основи
- Щоденне використання
- Обробка файлів та інформації
- Дебаггінг
- Одним рядком
- Складно але корисно
- MacOS only
- Інші джерела
- Декламація
Використанню командного рядка часто не приділяють достатньої уваги. Про термінал говорять, як про щось містичне. Насправді, ці навики явно (і не явно) збільшує Вашу продуктивність в роботі. Даний документ є підбіркою заміток і порад, які я знайшов для себе корисними, працюючи з командним рядком в Linux. Деякі з них - прості й очевидні, але деякі - досить складні та призначені для вирішення конкретних завдань. Це невелика публікація, але якщо Ви вже все це знаєте, що тут написано, і можете згадати як це все використовувати - Ви знаєте багато!
Ця робота є результатом багатьох авторів і перекладачів. Багато з цього спочатку появилось на Quora, почавши там, схоже, що варто розмістити і на Github, де знаходяться дуже талановиті люди і можуть допомогти. Якщо Ви замітили помилки (у всіх варіантах перекладу), будь ласка залиште опис issue або зробіть Pull requests (Звичайно перевіривши уже існуючі)
Опис
Основне:
- Дана публікація призначена як для недосвідчених, так і для досвідчених користувачів. Цілі: об'ємість (зібрати всі важливі аспекти використання командного рядка), практичність (надати конкретні приклади для найчастіших задач) та стислість (не варто вдаватись у неочевидні речі, про які можна почитати в інших місцях).
- Цей документ написаний для користувачів Linux, із єдиним винятком - розділ "MacOS only". Все інше підходить для всі UNIX/MacOS системи (і навіть для Cygwin).
- Сфокусована на інтерактивному Bash, але багато речей також можуть бути використані в інших Шелах; і в застосовні до Bash-скриптів.
- Ця інструкція включає в себе стандартні Unix команди і ті, для яких потрібно встановлювати сторонні пакети. Вони настільки корисні, що варті того, щоб їх встановили.
Нотатки:
- Що б все вміщалось на одній сторінці, вся інформація вставлена прямо тут. Ви досить розумні для того, щоб самостійно вивчити питання більш детально в іншому місці. Використовуйте
apt-get
/yum
/dnf
/pacman
/pip
/brew
(залежно від вашої системи управління пакетами) для установки нових програм. - На Explainshell можна знайти просте і докладне пояснення того, що таке команди, їх опції, пайпи(pipes(|)) і т.д.
##Основи
- Вивчіть основи Bash. Просто візьміть і наберіть у командному рядку
man bash
в терміналі і хоча б перегляньте; він досить просто читається і він не дуже великий. Інші шелли теж можуть бути хороші, але Bash - потужна програма, і Bash завжди під рукою (використання виключно zsh, fish і т.д., які напевно круто виглядають на Вашому лептопі і ні в чому Вас не обмежують, наприклад Ви не зможете використовувати ці можливості Шеллу на вже існуючому сервері). - Вивчіть як використовувати хоча б один консольний редактор тексту. Найкраще Vim (
vi
), адже у нього немає конкурентів, коли вам потрібно швиденько щось підправити (навіть якщо Ви постійно сидите у Emacs чи, якомусь важкому IDE або на модному хіпстерському редакторі. - Знайте, як читати документацію через
man
(man man
;man
у кутах документа в дужках додає номер, наприклад 1 - для звичайних команд, 5 - для файлів, 8 - для адміністративних команд). Шукайте інформацію черезapropos
, і пам'ятайте, що деякі команди - не виконувані(executables), а вбудовані команди Bash, і допомогу по них можна отримати через командуhelp
іhelp -d
. - Можна перенаправляти введення та виведення через
>
і<
і пайпи|
. Пам'ятайте, що>
- переписує вихідний файл, а>>
додає до нього. Дізнайтеся побільше про stdout і stderr. - Дізнайтеся побільше про
*
(а також?
і[
...]
), кавички, а також різницю між подвійними"
і одинарними'
кавичками. - Знайте як працювати із процесами в 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
).
##Щоденне-використання
- Використовуйте клавішу таб в Bash для автодоповнення аргументів до командам та ctrl-r для пошуку по історії командного рядка.
- Використовуйте ctrl-w в Bash для того, щоб видалити останнє слово в команді; ctrl-u для того, щоб видалити команду повністю. Використовуйте alt-b і alt-f для того, щоб переміщатись між словами у команді, ctrl-k для того, щоб перейти в кінця рядка, ctrl-l для того, щоб очистити екран. Гляньте на
man readline
щоб дізнатися про всі шорткати Bash. Їх багато! Наприклад, alt-. переміщається між попередніми аргументам команди, а alt-* максимально розширює аргументи. - Якщо Вам подобаються шорткати vim, виконайте
set -o vi
(set -o emacs
що б повернути налаштування). - Для редагування довгих команд після налаштування вашого консольного редактора (наприклад
export EDITOR=vim
), ctrl-x ctrl-e відкриє поточну команду в редакторі для багаторядкового редагування команди. Або у vi стилі, escape-v. - Для того, щоб переглянути історію, введіть
history
. Також існує безліч абревіатур, наприклад! $
- Останній аргумент,!!
- остання команда, хоча ці абревіатури часто заміняються шорткати ctrl-r та alt-.. - Для того, щоб стрибнути до останньої робочої директорії, використовуйте
cd -
- Якщо Ви написали команду наполовину і раптом передумали, натисніть alt-# для того, щоб додати
#
на початок команди, та відправте команду як коментар. Потім ви зможете повернутися до неї через історію команд. - Використовуйти
xargs
(абоparallel
). Це дуже корисно. Зверніть увагу, що Ви можете контролювати кількість команд на кожен рядок (-L
) також паралельність (-P
). Якщо Ви не впевнені, що робите щось правильно, почніть зxargs echo
. Також-I{}
- корисно. Приклади:
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
щоб подивитися відкриті сокети і файли. - Команда
uptime
orw
показує як довго працює система. - Використовуйте
alias
, щоб створити скорочення для часто використовуємих команд. Наприклад,alias ll='ls -latr'
створить нове скорочення(alias)ll
. - У Bash скриптах використовуйте
set -x
(абоset -v
) щоб дебажити вивід. Використовуйте строгий(strict) режим скрізь, де це можливо. Використовуйтеset -e
для того, щоб припиняти виконання при помилках (не нульовий вихідний код). Використовуйтеset -u
що б визначити невстановленні змінні. Використовуйтеset -o pipefail
щоб при помилках невикористовувати пайпи(вертикальна риска). Для більш складних скриптів також використовуйтеtrap
на EXIT or ERR. Корисний звичка почати використовувати настипний скрипт, який допоможе виявити і перервати на загальних помилоках і вивести повідомлення:
set -euo pipefail
trap "echo 'error: Script failed: see failed command above'" ERR
- У Bash-скриптах підоболочки(subshells) - зручний спосіб групувати команди. Один із найпоширеніших прикладів - тимчасово пересунутися в іншу робочу директорію:
# Do something in current dir
(cd / some / other / dir && other-command)
# Continue in original dir
- У Bash багато типів простору змінних. Перевірити, чи існує змінна -
${name:? Error message}
. Наприклад, якщо Bash-скрипту потрібен всього один аргумент, просто напишіть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}
(яка розширює всі можливі комбінації і створює дерево деректорій). - Вивід будь-якої команди можна обробити як файл наступним чином
<(some command)
. Наприклад, порівняння локального файлу `/etc/hosts з віддаленим:
diff /etc/hosts <(ssh somehost cat /etc/hosts)
- Знайте про heredoc -сінтаксис в Bash:
cat << EOF ...
. - У Bash перенаправляйте стандартні потоки виводу(output) та помилок, ось так:
some-command >logfile 2>&1
. Найчастіше, для того, щоб переконається, що команда не залишить відкритим файл, прив'язавши його до відкритого терміналу, вважається хорошою практикою додавати</dev/null
. - Використовуйте
man ascii
щоб отримати таблицю ASCII символів із шіснадцядковими і десятковими значеннями. Для інших основних кодувань користуйтесь:man unicode
,man utf-8
іman latin1
. - Використовуйте
screen
абоtmux
для того, щоб мати кілька екранів в одному терміналі. Це особливо корисно в ssh сесії що б приєднатись чи відєднатись до сесії.byobu
розширити функціонал screen або tmux надавши більше інформації і полегшити керування. Більш мінімалістичною альтернативою для цього -dtach
. - У SSH корисно знати як зробити port tunnel з опціями
-L
і-D
(іноді-R
) це корисно наприклад для того, щоб отримати доступ до сайту із віддаленого сервера. - Ще може бути корисно зробити декілька оптимізацій у конфігурації вашого SSH, наприклад у файлі
~/.ssh/config
містить налаштування, які допомагають уникати втрачених підключень в деяких мережевих оточеннях, використати стиснення (яке корисне при використанні scp при повільному підключенні) і збільште кількість каналів до одного сервера через цей конфіг, ось так:
TCPKeepAlive=yes
ServerAliveInterval=15
ServerAliveCountMax=6
Compression=yes
ControlMaster auto
ControlPath /tmp/%r@%h:%p
ControlPersist yes
- Деякі із інших налаштування SSH можуть сильно вплинути на безпеку і повинні мінятися обережно, наприклад, для конкретної підмережі або конкретної машини або в домашніх мережах:
StrictHostKeyChecking=no
,ForwardAgent=yes
- Розглянемо
mosh
як альтернатива ssh який використовує UDP, уникаючи розривів підключеня (вимагає установки на стороні сервера). - Щоб отримати права доступу до файлу в вісімковому вигляді, що є корисно для конфігурації систем але не можна отримати з допомогою команди
ls
, можна використовувати щось схоже на це:
stat -c '%A %a %n' /etc/timezone
- Для інтерактивного виділення результатів інших команд використовуйте
percol
абоfzf
. - Для роботи з файлами, список яких дала інша команда (наприклад
git
), використовуйтеfpp
(PathPicker). - Щоб швидко підняти веб-сервер в поточній директорії (і піддерикторіях), який доступний для всіх у вашій мережі, використовуйте:
python -m SimpleHTTPServer 7777
(на прту 7777 і для Python 2) абоpython -m http.server 7777
(на прту 7777 і для Python 3). - Щоб виконати команду з привілеями, використовуйте
sudo
(для root) іsudo -u
(для іншого користувача). Використовуйтеsu
абоsudo bash
, щоб запустити шелл від імені цього користувача. Використовуйтеsu -
, щоб симулювати свіжий вхід під root або gsl іншим користувачем.
##Обробка-файлів-та-інформації
##Дебаггінг
##Одним-рядком
##Складно-але-корисно
##Macos-only
##Інші-джерела
##Декламація