🌍 Čeština ∙ Deutsch ∙ Ελληνικά ∙ English ∙ Español ∙ Français ∙ Indonesia ∙ Italiano ∙ 日本語 ∙ 한국어 ∙ Português ∙ Română ∙ Русский ∙ Slovenščina ∙ Українська ∙ 简体中文 ∙ 繁體中文
- Опис
- Основи
- Щоденне використання
- Обробка файлів та інформації
- Відладка
- Одним рядком
- Складно але корисно
- Тільки для OS X
- Тільки для Windows
- Інші джерела
- Відмова від відповідальності
Використанню командного рядка часто не приділяють достатньої уваги. Про термінал говорять, як про щось містичне. Насправді, ці навики явно (і не явно) збільшують вашу продуктивність у роботі. Даний документ є підбіркою на наш погляд корисних при роботі з командним рядком в Linux заміток і порад. Деякі з них - прості та очевидні, але інші - або призначені для вирішення конкретних завдань, або досить складні чи широко невідомі. Це невелика публікація, але якщо ви вже все знаєте, що тут написано, і можете згадати як це все використовувати - ви знаєте багато!
Це -- результат роботи багатьох авторів і перекладачів. Дещо з цього спочатку з'явилось на Quora, але потім переїхало на Github, де багато людей талановитіших за початкового автора, внесли багато удосконалень. Задайте питання якщо у вас є питання стосовно командного рядка. Будь-ласка, зробіть свій внесок якщо ви знайшли помилку або можете щось покращити!
Охоплення:
- Дана публікація призначена як для початківців, так і для досвідчених користувачів. Цілі: наповнення (зібрати всі важливі аспекти використання командного рядка), практичність (надати конкретні приклади для найпоширеніших ситуацій) та стислість (не варто вдаватись у несуттєві деталі, про які можна прочитати деінде).
- Цей документ написаний для користувачів Linux, за винятком розділів "Тільки для OS X" та "[Тільки для Windows(#Тільки-для-Windows)]". Все інше підходить для всіх UNIX чи OS X систем (і навіть для 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
пояснює номери розділів документації, наприклад 1 - для звичайних команд, 5 - для файлів, 8 - для адміністративних команд). Шукайте інформацію черезapropos
, і пам'ятайте, що деякі команди - не виконувані (executables), а внутрішні команди Bash, і допомогу по них можна отримати через командуhelp
іhelp -d
. Ви можете з'ясувати чи є Ваша команда виконуваним файлом чи вбудована в shell чи є псевдонім, використовуючи командуtype команда
. -
Можна перенаправляти ввід та вивід користуючися
>
,<
та каналами|
. Пам'ятайте, що>
- переписує вихідний файл, а>>
додає до нього. Дізнайтеся побільше про 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
. Дізнайтеся, що таке inode (ls -i
чиdf -i
). -
Основи роботи з мережею:
ip
,ifconfig
,dig
,traceroute
абоroute
. -
Вивчіть і використовуйте систему управління версіями, наприклад таку, як
git
. -
Навчіться писати регулярні вирази і вивчіть різні опції для
grep
/egrep
. Такі опції як-i
,-o
,-A
, та-B
варто знати. -
Навчіться використовувати системами управління пакетами
apt-get
,yum
,dnf
таpacman
(залежно від дистрибутива). Знайте як шукати і встановлювати пакети. Обов'язково майте встановленимpip
для встановки модулів та програм, написаних на Python (деякі з тих команд, що ви знайдете нижче, найлегше встановити черезpip
).
-
Використовуйте клавішу табуляції (Tab) в 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
. Щоб вказати шлях до файлів із домашньої директорії можна скористатися префіксом~
(наприклад:~/.bashrc
). Уsh
скриптах для звернення до домашньої директорії можна використовувати змінну$HOME
. -
Для того, щоб стрибнути до останньої робочої директорії, використовуйте
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
- допоможе побачити дерево процесів.- Grep the output of
ps aux
to know the pid of a process, likeps aux | grep postgresql
- Використовуйте
pgrep
іpkill
для того, щоб знаходити або слати сигнали до процесів по імені (-f
корисна опція). - Знайте різні сигнали, які можна слати процесам. Наприклад, щоб призупинити процес, використовуйте
kill -STOP [pid]
. Для повного списку подивітьсяman 7 signal
. - Використовуйте
nohup
абоdisown
, якщо ви хочете запустити фоновий процес що б він постійно виконувався у фоні. - Дізнайтеся, які процеси слухають порти через
netstat -lntp
абоss -plat
(для TCP; додайте-u
для UDP). - Зверніть увагу на команду
lsof
іfuser
. Вони допоможуть Вам подивитися відкриті сокети і файли. - Команда
uptime
orw
показує як довго працює система. - Використовуйте
alias
, щоб створити скорочення для часто використовуємих команд. Наприклад,alias ll='ls -latr'
створить нове скорочення(alias)ll
. - Збережіть свої синоніми (aliases), налаштування і фунції які ви часто використовуєте у
~/.bashrc
, більш детально тут. Це зробить їх доступними в усіх ваших сесіях shell. - Синхронізуйте ваші конфігураційні файли (наприклад
.bashrc
та.bash_profile
) між різними комп'ютерами за допомогою Git. - Вставте настройки змінних середовища і команди, які повинні бути виконані при вході у систему в файл
~/.bash_profile
. Окремі налаштування будуть потрібні для оболонок, які запускаються із під графічного інтерфейсу та з підcron
задач. - Необхідно розуміти, що потрібна обережність коли змінні та імена файлів включають пробіли. Окружіть ваші Bash змінні в подвійні лапки:
"$FOO"
. Використовуйте-0
або-print0
опції щоб дозволити розмежувати імена файлів за допомогою нульових(null) символів. Наприклад:locate -0 pattern | xargs -0 ls -al
абоfind / -print0 -type d | xargs -0 ls -al
. Щоб перебрати імена файлів які містять пробільні символи для циклу встановіть ваш IFS(API файлової системи) використовувати тільки '\n' для цього використовуйте -IFS=$'\n'
. - У 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 або під іншим користувачем.
- Для того, щоб знайти файл в поточній директорії, виконайте
find. -iname '*something*'
. Для того, щоб шукати файл по всій системі, використовуйтеlocate something
(але не забувайте, щоupdatedb
міг ще не проіндексувати нещодавно створені файли). - Для пошуку по вмісту або фалах (більш детально зробити пошук допоможе
grep -r
) використовуйтеag
. - Для конвертації HTML в текст:
lynx -dump -stdin
- Для конвертації різних типів розмітки (HTML, Markdown та ін.) спроробуйте утиліту
pandoc
. - Якщо нуобхідно працювати з XML, є стара, але хороша утиліта -
xmlstarlet
. - Для роботи з JSON використовуйте
jq
. - Для YAML використовуйте
shyaml
. - Для Excel і CSV файлів csvkit надає
in2csv
,csvcut
,csvjoin
,csvgrep
і т.д. - Для Amazon S3
s3cmd
є зручним іs4cmd
є швидшим. Для решти сервісів Амазону використовуйте стандартнийaws
і удосконаленийsaws
. - Знайте про
sort
іuniq
, включаючи опції-u
і-d
, дивіться приклади нижче. Ще спробуйтеcomm
. - Знайте про
cut
,paste
, іjoin
для роботи з текстовими файлами. Багато людей використовуютьcut
, забувши проjoin
. - Знайте про
wc
: для підрахунку нових рядків (-l
), символів (-m
), слів (-w
) і для байтового підрахунку (-c
). - Знайте про
tee
для копіювання в файл з stdin і stdout, щось типуls -al | tee file.txt
. - Не забувайте, що ваші налаштування консолі та мовні/регіональні налаштування (локаль) впливають на багато команд, включаючи порядок сортування, порівняння і продуктивність. Багато дистрибутиви Linux автоматично виставляють
LANG
або будь-яку іншу змінну в підходящу для вашого регіону. Через це результати функцій сортування можуть працювати непередбачувано. Знайте щоi18n
можуть значно знизити продуктивність сортувань. У деяких випадках можна повністю цього уникати (за винятком рідкісних випадків), сортуючи традиційно побайтово, використовуйтеexport LC_ALL = C
. - Ви можете встановити спецефічне середовище для команди за допомогогю префікса, а саме:
TZ=Pacific/Fiji date
. - Знайте основи
awk
іsed
для простих маніпуляцій з даними. Наприклад, щоб отримати суму всіх чисел, які знаходяться в третій колонці текстового файлу, можна використатиawk '{ x += $3 } END { print x }'
. Швидше за все, це вийде в рази 3 швидше і рази в 3 простіше, ніж робити це в Пітоні. - Щоб замінити всі входження підрядка в одному або декількох файлах:
perl -pi.bak -e 's/old-string/new-string/g' my-files-*.txt
- Щоб перейменувати відразу багато файлів за шаблоном, використовуйте
rename
. Для складних перейменувань може допомогтиrepren
:
# Recover backup files foo.bak -> foo:
rename 's/\.bak$//' *.bak
# Full rename of filenames, directories, and contents foo -> bar:
repren --full --preserve-case --from foo --to bar .
- Як говорить man сторінка,
rsync
дійсно є швидким і універсальним інструментом копіювання файлів, для синхронізації між машинами, але в рівній мірі корисні на локальному рівні. Також швидке рішення що б видалити велику кількість файлів:
mkdir empty && rsync -r --delete empty/ some-dir && rmdir some-dir
- Використовуйте
shuf
, щоб перемішати або вибрати випадкові рядки з файлу. - Знайте опції для команди
sort
. Для чисел використовуйте-n
або-h
, для роботи з числами (наприкладdu -h
). Знайте як працюють ключі (-t
і-k
). Зокрема, не забувайте, що вам потрібно писати-k1,1
для того, щоб впорядкувати тільки перше поле;-k1
- це означає сортування враховуючи цілий рядок. Може бути корисною (sort -s
). Наприклад для того, щоб відсортувати найважливіше по другому полю, а другорядне по першому, можна використовуватиsort -k1,1 | sort -s -k2,2
. - Якщо вам коли-небудь доведеться написати код символу табуляції в терміналі, наприклад, для сортування за табуляції з прапором -t, використовуйте скорочення ctrl-v [Tab] або напишіть
$'\t'
. Останнє краще, тому що його можна скопіювати/вставити. - Стандартні інструменти для виправлення вихідного коду це
diff
іpatch
. Також зверніть увагу наdiffstat
для перегляду статистики diff іsdiff
для крок за кроком diff. Запамятайтеdiff -r
працює рекурсивно по всій директорії. Використовуйтеdiff -r tree1 tree2 | diffstat
для повного зведення змін. Використовуйтеvimdiff
порівняти і редагувати файли. - Для бінарних файлів використовуйте
hd
,hexdump
абоxxd
для простих hex-дампом, іbvi
, hexedit абоbiew
для зміни бінарників. - Також для бінарних файлів,
strings
(плюсgrep
, і т.п.) дозволить вам знайти біти тексту. - Щоб подивитися різницю в бінарниках (дельта-кодування):
xdelta3
. - Для конвертування кодувань використовуйте
iconv
. Для більш складних завдань -uconv
, він підтримує деякі складні фічі Юникода. Наприклад, ця команда переводить рядки з файлу в нижній регістр і прибирає наголоси (наприклад в іспанській мові)
uconv -f utf-8 -t utf-8 -x '::Any-Lower; ::Any-NFD; [:Nonspacing Mark:] >; ::Any-NFC; ' < input.txt > output.txt
- Для того, щоб розбити файл на шматки, використовуйте
split
(розбиває на шматки за розміром), абоcsplit
(за шаблоном або по регулярному виразу). - Для дати і часу використовуйте
dateadd
,datediff
,strptime
ще можете знайти наdateutils
. - Використовуйте
zless
,zmore
,zcat
, іzgrep
для роботи зі стиснутими файлами.