Create README-bg.md

Didn't check ⚠️
This commit is contained in:
Angelo II 2023-01-29 01:29:34 +02:00 committed by GitHub
parent 4d9f5b90bc
commit 9d3460dda6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 624 additions and 0 deletions

624
README-bg.md Normal file
View File

@ -0,0 +1,624 @@
🌍
*[Čeština](README-cs.md) ∙ [Deutsch](README-de.md) ∙ [Ελληνικά](README-el.md) ∙ [English](README.md) ∙ [Español](README-es.md) ∙ [Français](README-fr.md) ∙ [Indonesia](README-id.md) ∙ [Italiano](README-it.md) ∙ [日本語](README-ja.md) ∙ [한국어](README-ko.md) ∙ [polski](README-pl.md) ∙ [Português](README-pt.md) ∙ [Română](README-ro.md) ∙ [Русский](README-ru.md) ∙ [Slovenščina](README-sl.md) ∙ [Українська](README-uk.md) ∙ [简体中文](README-zh.md) ∙ [繁體中文](README-zh-Hant.md)*
# Изкуството на командния ред
*Забележка: Планирам да преработя това и търся нов съавтор, който да помогне с разширяването на това в по-изчерпателно ръководство. Въпреки че е много популярен, той може да бъде по-широк и малко по-дълбок. Ако обичате да пишете и сте почти експерт по този материал и желаете да обмислите да помогнете, моля, пуснете ми бележка на josh (0x40) holloway.com. [jlevy](https://github.com/jlevy), [Holloway](https://www.holloway.com). Благодаря ти!*
- [Мета](#meta)
- [Основи](#основи)
- [Ежедневна употреба](#everyday-use)
- [Обработка на файлове и данни](#processing-files-and-data)
- [Отстраняване на грешки в системата] (#system-debugging)
- [Едноредов](#едноредов)
- [Неясно, но полезно](#неясно-но-полезно)
- [само за macOS](#macos-only)
- [Само за Windows] (#windows-only)
- [Още ресурси](#more-resources)
- [Отказ от отговорност](#отказ от отговорност)
![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. Някои съвети са елементарни, а други са доста специфични, сложни или неясни. Тази страница не е дълга, но ако можете да използвате и да си припомните всички елементи тук, знаете много.
Тази работа е резултат от [много автори и преводачи](AUTHORS.md).
Част от това
[първоначално](http://www.quora.com/What-are-some-lesser-known-but-useful-Unix-commands)
[появи се](http://www.quora.com/What-are-the-most-useful-Swiss-army-knife-one-liners-on-Unix)
на [Quora](http://www.quora.com/What-are-some-time-saving-tips-that-every-Linux-user-should-know),
но оттогава се премести в GitHub, където хора, по-талантливи от оригиналния автор, направиха многобройни подобрения.
[**Моля, изпратете въпрос**](https://airtable.com/shrzMhx00YiIVAWJg), ако имате въпрос, свързан с командния ред. [**Моля, допринесете**](/CONTRIBUTING.md), ако видите грешка или нещо, което може да бъде по-добро!
## Мета
Обхват:
- Това ръководство е както за начинаещи, така и за опитни потребители. Целите са *широчина* (всичко важно), *конкретност* (дайте конкретни примери за най-често срещания случай) и *краткост* (избягвайте неща, които не са съществени, или отклонения, които лесно можете да потърсите другаде). Всеки съвет е важен в дадена ситуация или значително спестява време пред алтернативи.
Това е написано за Linux, с изключение на секциите „[само за macOS](#macos-only)“ и „[само за Windows](#windows-only)“. Много от другите елементи се прилагат или могат да бъдат инсталирани на други Unices или macOS (или дори Cygwin).
- Фокусът е върху интерактивния Bash, въпреки че много съвети се отнасят за други обвивки и за общи Bash скриптове.
- Включва както "стандартни" Unix команди, така и такива, които изискват инсталиране на специални пакети - стига да са достатъчно важни, за да заслужават включване.
Бележки:
- За да запазите това на една страница, съдържанието е имплицитно включено чрез препратка. Вие сте достатъчно умен, за да потърсите повече подробности другаде, след като знаете идеята или командата на Google. Използвайте `apt`, `yum`, `dnf`, `pacman`, `pip` или `brew` (според случая), за да инсталирате нови програми.
- Използвайте [Explainshell](http://explainshell.com/), за да получите полезна разбивка на това какво правят командите, опциите, каналите и т.н.
## Основи
- Научете основния Bash. Всъщност напишете `man bash` и поне прегледайте всичко; доста е лесно за следване и не е толкова дълго. Алтернативните обвивки могат да бъдат добри, но Bash е мощен и винаги достъпен (ученето *само* на zsh, fish и т.н., макар и изкушаващо на собствения ви лаптоп, ви ограничава в много ситуации, като например използването на съществуващи сървъри).
- Научете добре поне един текстов редактор. `nano` редакторът е един от най-простите за основно редактиране (отваряне, редактиране, запис, търсене). За опитния потребител на текстов терминал обаче няма заместител на Vim (`vi`), трудния за научаване, но уважаван, бърз и пълнофункционален редактор. Много хора също използват класическия Emacs, особено за по-големи задачи за редактиране. (Разбира се, всеки съвременен софтуерен разработчик, работещ върху обширен проект, е малко вероятно да използва само чисто текстов редактор и трябва да е запознат и със съвременните графични IDE и инструменти.)
- Намиране на документация:
- Знаете как да четете официална документация с `man` (за любознателните, `man man` изброява номерата на секциите, напр. 1 са "обикновени" команди, 5 са файлове/конвенции и 8 са за администрация). Намерете man страници с `apropos`.
- Знайте, че някои команди не са изпълними, а вградени Bash и че можете да получите помощ за тях с `help` и `help -d`. Можете да разберете дали дадена команда е изпълним файл, вградена обвивка или псевдоним, като използвате `type command`.
- `curl cheat.sh/command` ще даде кратък "cheat sheet" с често срещани примери за това как да използвате команда на shell.
- Научете за пренасочването на изхода и входа с помощта на `>` и `<` и канали с помощта на `|`. Знайте, че `>` презаписва изходния файл и `>>` добавя. Научете за stdout и stderr.
- Научете за разширяването на globus файл с `*` (и може би `?` и `[`...`]`) и кавички и разликата между двойни `"` и единични ``` кавички. (Вижте повече за разширяването на променливи По-долу.)
- Запознайте се с управлението на задачи в 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 -hs *`). За управление на файлова система, `df`, `mount`, `fdisk`, `mkfs`, `lsblk`. Научете какво е inode (`ls -i` или `df -i`).
- Основно управление на мрежата: `ip` или `ifconfig`, `dig`, `traceroute`, `route`.
- Научете и използвайте система за управление на контрола на версиите, като `git`.
- Познавайте добре регулярните изрази и различните флагове за `grep`/`egrep`. Струва си да знаете опциите „-i“, „-o“, „-v“, „-A“, „-B“ и „-C“.
- Научете се да използвате `apt-get`, `yum`, `dnf` или `pacman` (в зависимост от дистрибуцията), за да намерите и инсталирате пакети. И се уверете, че имате `pip`, за да инсталирате базирани на Python инструменти за команден ред (няколко по-долу са най-лесни за инсталиране чрез `pip`).
## Ежедневна употреба
- В Bash използвайте **Tab** за попълване на аргументи или изброяване на всички налични команди и **ctrl-r** за търсене в хронологията на командите (след натискане въведете за търсене, натиснете **ctrl-r** многократно за цикъл през още съвпадения, натиснете **Enter**, за да изпълните намерената команда, или натиснете стрелката надясно, за да поставите резултата в текущия ред, за да позволите редактиране).
- В Bash използвайте **ctrl-w**, за да изтриете последната дума, и **ctrl-u**, за да изтриете съдържанието от текущия курсор обратно до началото на реда. Използвайте **alt-b** и **alt-f** за придвижване по дума, **ctrl-a** за преместване на курсора в началото на реда, **ctrl-e** за преместване на курсора в края на реда , **ctrl-k** за убиване до края на реда, **ctrl-l** за изчистване на екрана. Вижте `man readline` за всички клавишни връзки по подразбиране в Bash. Има много. Например **alt-.** преминава през предишни аргументи, а **alt-*** разширява глобус.
- Като алтернатива, ако обичате vi-style key-bindings, използвайте `set -o vi``set -o emacs`, за да го върнете обратно).
- За редактиране на дълги команди, след настройка на вашия редактор (например `export EDITOR=vim`), **ctrl-x** **ctrl-e** ще отвори текущата команда в редактор за многоредово редактиране. Или в стил vi, **escape-v**.
- За да видите последните команди, използвайте `history`. Следвайте `!n` (където `n` е номерът на командата), за да изпълните отново. Има и много съкращения, които можете да използвате, като най-полезното вероятно е `!$` за последен аргумент и `!!` за последна команда (вижте "РАЗШИРЯВАНЕ НА ИСТОРИЯТА" в страницата с ръководство). Те обаче често се заменят лесно с **ctrl-r** и **alt-.**.
- Отидете в началната си директория с `cd`. Достъп до файлове, свързани с вашата домашна директория с префикса `~` (напр. `~/.bashrc`). В `sh` скриптовете се отнасят към началната директория като `$HOME`.
- За да се върнете към предишната работна директория: `cd -`.
- Ако сте по средата на въвеждането на команда, но промените решението си, натиснете **alt-#**, за да добавите `#` в началото и го въведете като коментар (или използвайте **ctrl-a**, ** #**, **въведете**). След това можете да се върнете към него по-късно чрез хронология на командите.
- Използвайте `xargs` (или `parallel`). Много е мощен. Имайте предвид, че можете да контролирате колко елемента се изпълняват на ред (`-L`), както и паралелизма (`-P`). Ако не сте сигурни дали ще направи правилното нещо, първо използвайте `xargs echo`. Също така, `-I{}` е удобно. Примери:
``` баш
намирам . -име '*.py' | xargs grep някакваункция
домакини на котки | xargs -I{} ssh root@{} име на хост
```
- `pstree -p` е полезен дисплей на дървото на процеса.
- Използвайте `pgrep` и `pkill`, за да намерите или сигнализирате процеси по име (`-f` е полезно).
- Познайте различните сигнали, които можете да изпращате на процеси. Например, за да спрете процес, използвайте `kill -STOP [pid]`. За пълния списък вижте `man 7 signal`
- Използвайте `nohup` или `disown`, ако искате фонов процес да продължи да работи вечно.
- Проверете какви процеси слушат чрез `netstat -lntp` или `ss -plat` (за TCP; добавете `-u` за UDP) или `lsof -iTCP -sTCP:LISTEN -P -n` (което също работи на macOS ).
- Вижте също `lsof` и `fuser` за отворени сокети и файлове.
- Вижте `uptime` или `w`, за да разберете колко време системата работи.
- Използвайте `alias`, за да създадете преки пътища за често използвани команди. Например, `alias ll='ls -latr'` създава нов псевдоним `ll`.
- Запазете псевдонимите, настройките на обвивката и функциите, които обикновено използвате в `~/.bashrc`, и [подредете обвивките за влизане, за да го източат](http://superuser.com/a/183980/7106). Това ще направи вашата настройка достъпна във всичките ви сесии на обвивката.
- Поставете настройките на променливите на средата, както и командите, които трябва да се изпълняват, когато влезете в `~/.bash_profile`. Ще е необходима отделна конфигурация за обвивки, които стартирате от влизания в графична среда и задания `cron`.
- Синхронизирайте конфигурационните си файлове (напр. `.bashrc` и `.bash_profile`) между различни компютри с Git.
- Разберете, че е необходимо внимание, когато променливите и имената на файловете включват интервал. Оградете вашите Bash променливи с кавички, напр. `"$FOO"`. Предпочитайте опциите „-0“ или „-print0“, за да разрешите нулеви знаци за разделяне на имената на файлове, напр. `намиране -0 модел | xargs -0 ls -al` или `find / -print0 -type d | xargs -0 ls -al`. За да итерирате имена на файлове, съдържащи интервали в for цикъл, задайте вашия IFS да бъде само нов ред, като използвате `IFS=$'\n'`.
- В Bash скриптовете използвайте `set -x` (или варианта `set -v`, който регистрира необработен вход, включително неразширени променливи и коментари) за изход за отстраняване на грешки. Използвайте стриктни режими, освен ако нямате основателна причина да не го правите: Използвайте `set -e` за прекъсване при грешки (ненулев изходен код). Използвайте `set -u`, за да откриете употребата на ненастроени променливи. Помислете за `set -o pipefail` също, за прекъсване при грешки в тръбите (въпреки че прочетете повече за това, ако го направите, тъй като тази тема е малко тънка). За по-ангажирани скриптове използвайте също `trap` при EXIT или ERR. Полезен навик е да стартирате скрипт като този, който ще го накара да открие и да прекрати често срещани грешки и да отпечата съобщение:
``` баш
set -euo pipefail
trap "ехо 'грешка: Скриптът е неуспешен: вижте неуспешната команда по-горе'" ГРЕШКА
```
- В Bash скриптовете, подобвивките (изписани със скоби) са удобни начини за групиране на команди. Често срещан пример е временно преместване в друга работна директория, напр.
``` баш
# направи нещо в текущата директория
(cd /some/other/dir && other-command)
# продължете в оригиналната реж
```
- Имайте предвид, че в Bash има много видове разширяване на променливи. Проверява се съществуването на променлива: `${name:?error message}`. Например, ако Bash скрипт изисква един аргумент, просто напишете `input_file=${1:?usage: $0 input_file}`. Използване на стойност по подразбиране, ако променливата е празна: `${name:-default}`. Ако искате да добавите допълнителен (незадължителен) параметър към предишния пример, можете да използвате нещо като `output_file=${2:-logfile}`. Ако `$2` е пропуснато и следователно празно, `output_file` ще бъде зададено на `logfile`. Аритметично разширение: `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}` (което разширява всички възможни комбинации и създава дърво на директория). Разширяването на скоби се извършва преди всяко друго разширение.
- Редът на разширенията е: разширяване на скоби; разширяване на тилда, разширяване на параметри и променливи, аритметично разширяване и заместване на команда (направено отляво надясно); разделяне на думи; и разширение на името на файла. (Например, диапазон като `{1..20}` не може да бъде изразен с променливи, използващи `{$a..$b}`. Използвайте вместо това `seq` или `for` цикъл, напр. `seq $a $b` или `for((i=a; i<=b; i++)); do ... ; done`.)
- Резултатът от команда може да се третира като файл чрез „<(някаква команда)“ (известно като заместване на процес). Например, сравнете локален `/etc/hosts` с отдалечен:
```ш
diff /etc/hosts <(ssh somehost cat /etc/hosts)
```
- Когато пишете скриптове, може да искате да поставите целия си код във фигурни скоби. Ако затварящата фигурна скоба липсва, вашият скрипт ще бъде предотвратен от изпълнение поради синтактична грешка. Това има смисъл, когато вашият скрипт ще бъде изтеглен от мрежата, тъй като предотвратява изпълнението на частично изтеглени скриптове:
``` баш
{
# Вашият код тук
}
```
- „Документ тук“ позволява [пренасочване на множество редове за въвеждане](https://www.tldp.org/LDP/abs/html/here-docs.html) като от файл:
```
котка <<EOF
вход
на няколко реда
EOF
```
- В Bash пренасочете стандартния изход и стандартната грешка чрез: `some-command >logfile 2>&1` или `some-command &>logfile`. Често, за да се гарантира, че дадена команда не оставя манипулатор на отворен файл към стандартния вход, свързвайки го с терминала, в който се намирате, също е добра практика да добавите `</dev/null`.
- Използвайте `man ascii` за добра ASCII таблица, с шестнадесетични и десетични стойности. За обща информация за кодиране са полезни `man unicode`, `man utf-8` и `man latin1`.
- Използвайте `screen` или [`tmux`](https://tmux.github.io/) за мултиплексиране на екрана, особено полезно при отдалечени ssh сесии и за отделяне и повторно свързване към сесия. `byobu` може да подобри екрана или tmux чрез предоставяне на повече информация и по-лесно управление. По-минимална алтернатива само за постоянство на сесията е [`dtach`](https://github.com/bogner/dtach).
- В ssh е полезно да знаете как да пренасяте тунел с `-L` или `-D` (и понякога `-R`), напр. за достъп до уеб сайтове от отдалечен сървър.
- Може да бъде полезно да направите няколко оптимизации на вашата ssh конфигурация; например този `~/.ssh/config` съдържа настройки за избягване на прекъснати връзки в определени мрежови среди, използва компресия (което е полезно при scp при връзки с ниска честотна лента) и мултиплексни канали към същия сървър с локален контролен файл :
```
TCPKeepAlive=да
ServerAliveInterval=15
ServerAliveCountMax=6
Компресия=да
ControlMaster авто
ControlPath /tmp/%r@%h:%p
ControlPersist да
```
- Няколко други опции, свързани с ssh, са чувствителни към сигурността и трябва да се активират внимателно, напр. за подмрежа или хост или в надеждни мрежи: `StrictHostKeyChecking=no`, `ForwardAgent=yes`
- Помислете за [`mosh`](https://mosh.mit.edu/) като алтернатива на ssh, която използва UDP, избягвайки прекъснати връзки и добавяйки удобство по време на път (изисква настройка от страна на сървъра).
- За да получите разрешенията за файл в осмична форма, която е полезна за системна конфигурация, но не е налична в `ls` и е лесна за грешки, използвайте нещо като
```ш
stat -c '%A %a %n' /etc/timezone
```
- За интерактивен избор на стойности от изхода на друга команда използвайте [`percol`](https://github.com/mooz/percol) или [`fzf`](https://github.com/junegunn/fzf ).
- За взаимодействие с файлове въз основа на изхода на друга команда (като `git`), използвайте `fpp` ([PathPicker](https://github.com/facebook/PathPicker)).
- За прост уеб сървър за всички файлове в текущата директория (и поддиректории), достъпен за всеки във вашата мрежа, използвайте:
„python -m SimpleHTTPServer 7777“ (за порт 7777 и Python 2) и „python -m http.server 7777“ (за порт 7777 и Python 3).
- За изпълнение на команда като друг потребител, използвайте `sudo`. По подразбиране се изпълнява като root; използвайте „-u“, за да посочите друг потребител. Използвайте `-i`, за да влезете като този потребител (ще бъдете помолени за ашата_ парола).
- За превключване на обвивката към друг потребител използвайте `su потребителско име` или `su - потребителско име`. Последното с "-" получава среда, сякаш друг потребител току-що е влязъл. Пропускането на потребителското име по подразбиране е root. Ще бъдете попитани за паролата а потребителя, към който превключвате_.
- Запознайте се с [ограничението от 128K](https://wiki.debian.org/CommonErrorMessages/ArgumentListTooLong) на командните редове. Тази грешка „Списъкът с аргументи е твърде дълъг“ е често срещана, когато заместващият знак съответства на голям брой файлове. (Когато това се случи, алтернативи като `find` и `xargs` може да помогнат.)
- За основен калкулатор (и разбира се достъп до Python като цяло) използвайте интерпретатора `python`. Например,
```
>>> 2+3
5
```
## Обработка на файлове и данни
- За да намерите файл по име в текущата директория, `намери . -iname '*нещо*'` (или подобно). За да намерите файл навсякъде по име, използвайте „locate something“ (но имайте предвид, че „updatedb“ може да не е индексирал наскоро създадени файлове).
- За общо търсене в изходни файлове или файлове с данни има няколко опции, по-разширени или по-бързи от `grep -r`, включително (в груб ред от по-стари към по-нови) [`ack`](https://github.com/beyondgrep /ack2), [`ag`](https://github.com/ggreer/the_silver_searcher) ("търсачът на сребро") и [`rg`](https://github.com/BurntSushi/ripgrep) ( ripgrep).
- За да конвертирате HTML в текст: `lynx -dump -stdin`
- За Markdown, HTML и всички видове конвертиране на документи опитайте [`pandoc`](http://pandoc.org/). Например, за да конвертирате Markdown документ във формат на Word: `pandoc README.md --from markdown --to docx -o temp.docx`
- Ако трябва да работите с XML, `xmlstarlet` е стар, но добър.
- За JSON използвайте [`jq`](http://stedolan.github.io/jq/). За интерактивна употреба вижте също [`jid`](https://github.com/simeji/jid) и [`jiq`](https://github.com/fiatjaf/jiq).
- За YAML използвайте [`shyaml`](https://github.com/0k/shyaml).
- За Excel или CSV файлове [csvkit](https://github.com/onyxfish/csvkit) осигурява `in2csv`, `csvcut`, `csvjoin`, `csvgrep` и др.
- За Amazon S3 [`s3cmd`](https://github.com/s3tools/s3cmd) е удобно и [`s4cmd`](https://github.com/bloomreach/s4cmd) е по-бързо. [`aws`](https://github.com/aws/aws-cli) на Amazon и подобрените [`saws`](https://github.com/donnemartin/saws) са от съществено значение за други задачи, свързани с AWS .
- Запознайте се с `sort` и `uniq`, включително опциите `-u` и `-d` на uniq - вижте едноредовия текст по-долу. Вижте също `comm`.
- Научете за „изрязване“, „поставяне“ и „съединяване“, за да манипулирате текстови файлове. Много хора използват `cut`, но забравят за `join`.
- Знайте за `wc` за преброяване на нови редове (`-l`), знаци (`-m`), думи (`-w`) и байтове (`-c`).
- Знайте за `tee` за копиране от stdin във файл, а също и в stdout, както в `ls -al | tee file.txt`.
- За по-сложни изчисления, включително групиране, обръщане на полета и статистически изчисления, помислете за [`datamash](https://www.gnu.org/software/datamash/).
- Знайте, че локалът засяга много инструменти на командния ред по фини начини, включително ред на сортиране (съпоставяне) и производителност. Повечето инсталации на Linux ще зададат `LANG` или други локални променливи на локална настройка като US English. Но имайте предвид, че сортирането ще се промени, ако промените локала. И знайте, че рутинните процедури на i18n могат да накарат сортирането или други команди да се изпълняват *много пъти* по-бавно. В някои ситуации (като операциите за набор или операциите за уникалност по-долу) можете безопасно да игнорирате изцяло бавните i18n процедури и да използвате традиционния ред на сортиране, базиран на байтове, като използвате `export LC_ALL=C`.
- Можете да зададете обкръжението на конкретна команда, като поставите префикс за нейното извикване с настройките на променливата на обкръжението, като в `TZ=Pacific/Fiji date`.
- Познаване на основните `awk` и `sed` за лесно прехвърляне на данни. Вижте [One-liners](#one-liners) за примери.
- За да замените всички срещания на низ на място, в един или повече файлове:
```ш
perl -pi.bak -e 's/old-string/new-string/g' my-files-*.txt
```
- За да преименувате множество файлове и/или да търсите и заменяте във файлове, опитайте [`repren`](https://github.com/jlevy/repren). (В някои случаи командата `rename` също позволява множество преименувания, но бъдете внимателни, тъй като нейната функционалност не е еднаква във всички дистрибуции на Linux.)
```ш
# Пълно преименуване на имена на файлове, директории и съдържание foo -> bar:
repren --full --preserve-case --from foo --to bar.
# Възстановяване на архивни файлове whatever.bak -> whatever:
repren --преименува --from '(.*)\.bak' --to '\1' *.bak
# Същото като по-горе, използвайки преименуване, ако е налично:
преименуване на 's/\.bak$//' *.bak
```
- Както се казва в страницата с ръководството, `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), за да изтриете голям брой файлове:
```ш
mkdir празен && rsync -r --изтриване празен/ някои-директории && rmdir някои-директории
```
- За наблюдение на напредъка при обработка на файлове използвайте [`pv`](http://www.ivarch.com/programs/pv.shtml), [`pycp`](https://github.com/dmerejkowsky/pycp) , [`pmonitor`](https://github.com/dspinellis/pmonitor), [`progress`](https://github.com/Xfennec/progress), `rsync --progress` или, за блок копиране на ниво, `dd status=progress`.
- Използвайте `shuf`, за да разбъркате или изберете произволни редове от файл.
- Познайте опциите за сортиране. За числа използвайте `-n` или `-h` за обработка на четими от човека числа (напр. от `du -h`). Научете как работят ключовете (`-t` и `-k`). По-специално, внимавайте, че трябва да напишете `-k1,1`, за да сортирате само по първото поле; „-k1“ означава сортиране според целия ред. Стабилното сортиране (`sort -s`) може да бъде полезно. Например, за да сортирате първо по поле 2, след това вторично по поле 1, можете да използвате `sort -k1,1 | сортиране -s -k2,2`.
- Ако някога ви се наложи да напишете разделителен литерал в команден ред в Bash (напр. за аргумента -t за сортиране), натиснете **ctrl-v** **[Tab]** или напишете `$'\t' ` (последното е по-добро, тъй като можете да го копирате/поставите).
- Стандартните инструменти за корекция на изходния код са `diff` и `patch`. Вижте също `diffstat` за обобщена статистика на разлика и `sdiff` за разлика една до друга. Забележка `diff -r` работи за цели директории. Използвайте `diff -r дърво1 дърво2 | diffstat` за обобщение на промените. Използвайте `vimdiff` за сравняване и редактиране на файлове.
- За бинарни файлове използвайте `hd`, `hexdump` или `xxd` за прости шестнадесетични дъмпове и `bvi`, `hexedit` или `biew` за двоично редактиране.
- Също така за двоични файлове, `strings` (плюс `grep` и т.н.) ви позволява да намерите битове текст.
- За двоични разлики (делта компресия), използвайте `xdelta3`.
- За да конвертирате текстови кодировки, опитайте `iconv`. Или `uconv` за по-разширена употреба; поддържа някои усъвършенствани Unicode неща. Например:
```ш
# Показва шестнадесетични кодове или действителни имена на знаци (полезно за отстраняване на грешки):
uconv -f utf-8 -t utf-8 -x '::Any-Hex;' < input.txt
uconv -f utf-8 -t utf-8 -x '::Any-Name;' < input.txt
# Малки букви и премахва всички ударения (чрез разширяване и изпускане):
uconv -f utf-8 -t utf-8 -x '::Any-Lower; ::Всички-NFD; [:Без интервал:] >; ::Any-NFC;' < input.txt > output.txt
```
- За да разделите файлове на части, вижте `split` (за разделяне по размер) и `csplit` (за разделяне по модел).
- Дата и час: За да получите текущата дата и час в полезния формат [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601), използвайте `date -u +"%Y-%m-% dT%H:%M:%SZ"` (други опции [са](https://stackoverflow.com/questions/7216358/date-command-on-os-x-doesnt-have-iso-8601-i- опция) [проблематична](https://unix.stackexchange.com/questions/164826/date-command-iso-8601-option)). За да манипулирате изрази за дата и час, използвайте `dateadd`, `datediff`, `strptime` и т.н. от [`dateutils`](http://www.fresse.org/dateutils/).
- Използвайте `zless`, `zmore`, `zcat` и `zgrep` за работа с компресирани файлове.
- Файловете атрибути могат да се задават чрез `chattr` и предлагат алтернатива от по-ниско ниво на разрешенията за файлове. Например, за защита срещу случайно изтриване на файл, неизменният флаг: `sudo chattr +i /critical/directory/or/file`
- Използвайте `getfacl` и `setfacl` за запазване и възстановяване на разрешения за файлове. Например:
```ш
getfacl -R /някои/път > permissions.txt
setfacl --restore=permissions.txt
```
- За бързо създаване на празни файлове използвайте `truncate` (създава [sparse файл](https://en.wikipedia.org/wiki/Sparse_file)), `fallocate` (ext4, xfs, btrfs и ocfs2 файлови системи), `xfs_mkfile ` (почти всяка файлова система, идва в пакет xfsprogs), `mkfile` (за Unix-подобни системи като Solaris, Mac OS).
## Отстраняване на грешки в системата
- За уеб отстраняване на грешки са удобни `curl` и `curl -I` или техните еквиваленти `wget`, или по-модерното [`httpie`](https://github.com/jkbrzt/httpie).
- За да знаете текущото състояние на процесора/диска, класическите инструменти са `top` (или по-добре `htop`), `iostat` и `iotop`. Използвайте `iostat -mxz 15` за основен CPU и подробна статистика за дял на диска и информация за производителността.
- За подробности за мрежовата връзка използвайте `netstat` и `ss`.
- За бърз преглед на това, което се случва в системата, `dstat` е особено полезен. За най-широк преглед с подробности използвайте [`glances`](https://github.com/nicolargo/glances).
- За да знаете състоянието на паметта, стартирайте и разберете изхода на `free` и `vmstat`. По-специално, имайте предвид, че „кешираната“ стойност е паметта, съхранявана от ядрото на Linux като файлов кеш, така че ефективно се брои към „свободната“ стойност.
- Отстраняването на грешки в системата на Java е различен котел за риба, но прост трик на Oracle и някои други JVM е, че можете да стартирате `kill -3 <pid>` и пълно проследяване на стека и обобщение на купчината (включително подробности за събирането на боклука за поколенията, които може да бъде много информативен) ще бъдат изхвърлени в stderr/logs. `jps`, `jstat`, `jstack`, `jmap` на JDK са полезни. [SJK инструментите](https://github.com/aragozin/jvm-tools) са по-усъвършенствани.
- Използвайте [`mtr`](http://www.bitwizard.nl/mtr/) като по-добър маршрут за проследяване, за да идентифицирате мрежови проблеми.
- За да разберете защо даден диск е пълен, [`ncdu`](https://dev.yorhel.nl/ncdu) спестява време в сравнение с обичайните команди като `du -sh *`.
- За да намерите кой сокет или процес използва честотна лента, опитайте [`iftop`](http://www.ex-parrot.com/~pdw/iftop/) или [`nethogs`](https://github.com /raboof/nethogs).
- Инструментът `ab` (доставя се с Apache) е полезен за бърза и мръсна проверка на производителността на уеб сървъра. За по-сложни тестове за натоварване, опитайте `siege`.
- За по-сериозно отстраняване на грешки в мрежата, [`wireshark`](https://wireshark.org/), [`tshark`](https://www.wireshark.org/docs/wsug_html_chunked/AppToolstshark.html) или [ `ngrep`](http://ngrep.sourceforge.net/).
- Познайте за `strace` и `ltrace`. Те могат да бъдат полезни, ако дадена програма се проваля, виси или се срива и вие не знаете защо, или ако искате да получите обща представа за производителността. Обърнете внимание на опцията за профилиране (`-c`) и възможността за прикачване към работещ процес (`-p`). Използвайте опцията за проследяване на дете (`-f`), за да избегнете пропускане на важни повиквания.
- Знайте за `ldd`, за да проверявате споделени библиотеки и т.н. — но [никога не го стартирайте на ненадеждни файлове](http://www.catonmat.net/blog/ldd-arbitrary-code-execution/).
- Знаете как да се свържете с работещ процес с `gdb` и да получите следите на неговия стек.
- Използвайте `/proc`. Понякога е удивително полезно при отстраняване на грешки на живо. Примери: `/proc/cpuinfo`, `/proc/meminfo`, `/proc/cmdline`, `/proc/xxx/cwd`, `/proc/xxx/exe`, `/proc/xxx/fd/` , `/proc/xxx/smaps` (където `xxx` е идентификаторът на процеса или pid).
- При отстраняване на грешки защо нещо се е объркало в миналото, [`sar`](http://sebastien.godard.pagesperso-orange.fr/) може да бъде много полезно. Той показва исторически статистики за процесора, паметта, мрежата и т.н.
- За по-задълбочени анализи на системите и ефективността вижте `stap` ([SystemTap](https://sourceware.org/systemtap/wiki)), [`perf`](https://en.wikipedia.org/wiki/ Perf_%28Linux%29) и [`sysdig`](https://github.com/draios/sysdig).
- Проверете на каква операционна система сте с `uname` или `uname -a` (обща информация за Unix/ядрото) или `lsb_release -a` (информация за дистрибуцията на Linux).
- Използвайте `dmesg`, когато нещо се държи наистина смешно (може да са проблеми с хардуера или драйвера).
- Ако изтриете файл и той не освободи очакваното дисково пространство, както се съобщава от `du`, проверете дали файлът се използва от процес:
`lsof | grep изтрит | grep "името-на-моят-голям-файл"`
## Едноредови
Няколко примера за сглобяване на команди:
- Понякога е изключително полезно, че можете да правите пресичане, обединение и разлика на текстови файлове чрез `sort`/`uniq`. Да предположим, че `a` и `b` са текстови файлове, които вече са уникални. Това е бързо и работи с файлове с произволен размер, до много гигабайта. (Сортирането не е ограничено от паметта, въпреки че може да се наложи да използвате опцията `-T`, ако `/tmp` е на малък основен дял.) Вижте също бележката за `LC_ALL` по-горе и `sort`'s `- u` опция (оставена за яснота по-долу).
```ш
сортиране a b | uniq > c # c е обединение b
сортиране a b | uniq -d > c # c е пресичане b
сортиране a b b | uniq -u > c # c се задава разлеренция a - b
```
- Красиво отпечатайте два JSON файла, нормализирайки техния синтаксис, след което оцветете и пагинирайте резултата:
```
diff <(jq --sort-keys. < file1.json) <(jq --sort-keys. < file2.json) | colordiff | по-малко -R
```
- Използвайте `grep . *` за бързо разглеждане на съдържанието на всички файлове в директория (така че всеки ред е съчетан с името на файла), или `head -100 *` (така че всеки файл има заглавие). Това може да бъде полезно за директории, пълни с конфигурационни настройки като тези в `/sys`, `/proc`, `/etc`.
- Сумиране на всички числа в третата колона на текстов файл (това вероятно е 3 пъти по-бързо и 3 пъти по-малко код от еквивалентен Python):
```ш
awk '{ x += $3 } END { print x }' myfile
```
- За да видите размерите/датите на дърво от файлове, това е като рекурсивен `ls -l`, но е по-лесен за четене от `ls -lR`:
```ш
намирам . -тип f -ls
```
Да приемем, че имате текстов файл, като регистър на уеб сървър, и определена стойност, която се появява на някои редове, като параметър „acct_id“, който присъства в URL адреса. Ако искате да видите колко заявки за всеки `acct_id`:
```ш
egrep -o 'acct_id=[0-9]+' access.log | изрежете -d= -f2 | сортиране | уникален -c | сортиране -rn
```
- За непрекъснато наблюдение на промените, използвайте `watch`, напр. проверете промените във файловете в директория с `watch -d -n 2 'ls -rtlh | tail'' или към мрежовите настройки, докато отстранявате неизправности в настройките на wifi с `watch -d -n 2 ifconfig`.
- Стартирайте тази функция, за да получите случаен съвет от този документ (разбира Markdown и извлича елемент):
```ш
функция taocl() {
curl -s https://raw.githubusercontent.com/jlevy/the-art-of-command-line/master/README.md |
sed '/cowsay[.]png/d' |
pandoc -f маркдаун -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 | iconv -t САЩ
}
```
## Неясно, но полезно
- `expr`: извършва аритметични или булеви операции или оценява регулярни изрази
- `m4`: прост макро процесор
- `yes`: отпечата низ много
- `cal`: хубав календар
- `env`: изпълнете команда (полезно в скриптове)
- `printenv`: отпечатване на променливи на средата (полезно при отстраняване на грешки и скриптове)
- `look`: намира английски думи (или редове във файл), започващи с низ
- `изрязване`, `поставяне` и `съединяване`: манипулиране на данни
- `fmt`: форматиране на текстови параграфи
- `pr`: форматиране на текст в страници/колони
- `fold`: обвиване на редове от текст
- `колона`: форматирайте текстовите полета в подравнени колони или таблици с фиксирана ширина
- `expand` и `unexpand`: конвертиране между раздели и интервали
- `nl`: добавете номера на редове
- `seq`: отпечатване на числа
- `bc`: калкулатор
- `фактор`: множител цели числа
- [`gpg`](https://gnupg.org/): криптиране и подписване на файлове
- `toe`: таблица със записи на terminfo
- `nc`: мрежово отстраняване на грешки и пренос на данни
- `socat`: реле на сокет и пренасочване на tcp порт (подобно на `netcat`)
- [`slurm`](https://github.com/mattthias/slurm): визуализация на мрежовия трафик
- `dd`: преместване на данни между файлове или устройства
- `файл`: идентифицира типа на файла
- `дърво`: показване на директории и поддиректории като вложено дърво; като `ls`, но рекурсивно
- `stat`: информация за файла
- `time`: изпълнение и време на команда
- `timeout`: изпълнете команда за определено време и спрете процеса, когато определеното време приключи.
- `lockfile`: създава семафорен файл, който може да бъде премахнат само чрез `rm -f`
- `logrotate`: завъртане, компресиране и изпращане по пощата.
- `watch`: изпълнява команда многократно, показвайки резултати и/или маркирайки промените
- [`when-changed`](https://github.com/joh/when-changed): изпълнява всяка команда, която посочите, когато види файл променен. Вижте също и `inotifywait` и `entr`.
- `tac`: печат на файлове в обратен ред
- `comm`: сравнява сортирани файлове ред по ред
- `strings`: извлича текст от двоични файлове
- `tr`: превод или манипулиране на знаци
- `iconv` или `uconv`: конвертиране за текстови кодировки
- `split` и `csplit`: разделяне на файлове
- `sponge`: чете целия вход, преди да го запише, полезно за четене от след това за запис в същия файл, напр., `grep -v нещо някои-файл | гъба някаква пила`
- `units`: преобразуване на единици и изчисления; преобразува стадии на две седмици в twips на мигане (вижте също `/usr/share/units/definitions.units`)
- `apg`: генерира произволни пароли
- `xz`: високо съотношение на компресиране на файлове
- `ldd`: информация за динамична библиотека
- `nm`: символи от обектни файлове
- `ab` или [`wrk`](https://github.com/wg/wrk): сравнителен анализ на уеб сървъри
- `strace`: отстраняване на грешки в системно повикване
- [`mtr`](http://www.bitwizard.nl/mtr/): по-добро трасиране за мрежово отстраняване на грешки
- `cssh`: визуална едновременна обвивка
- `rsync`: синхронизиране на файлове и папки през SSH или в локална файлова система
- [`wireshark`](https://wireshark.org/) и [`tshark`](https://www.wireshark.org/docs/wsug_html_chunked/AppToolstshark.html): улавяне на пакети и отстраняване на грешки в мрежата
- [`ngrep`](http://ngrep.sourceforge.net/): grep за мрежовия слой
- `host` и `dig`: DNS търсения
- `lsof`: процес на файлов дескриптор и информация за сокет
- `dstat`: полезна системна статистика
- [`glances`](https://github.com/nicolargo/glances): преглед на високо ниво, мулти-подсистема
- `iostat`: Статистика за използване на диска
- `mpstat`: статистика за използване на процесора
- `vmstat`: Статистика за използване на паметта
- `htop`: подобрена версия на top
- `последно`: хронология на влизанията
- `w`: кой е влязъл
- `id`: информация за идентичността на потребител/група
- [`sar`](http://sebastien.godard.pagesperso-orange.fr/): исторически системни статистики
- [`iftop`](http://www.ex-parrot.com/~pdw/iftop/) или [`nethogs`](https://github.com/raboof/nethogs): използване на мрежата от сокет или процес
- `ss`: статистика на сокета
- `dmesg`: съобщения за грешки при зареждане и системни грешки
- `sysctl`: преглед и конфигуриране на параметрите на ядрото на Linux по време на изпълнение
- `hdparm`: SATA/ATA дискова манипулация/производителност
- `lsblk`: списък с блокови устройства: дървовиден изглед на вашите дискове и дискови дялове
- `lshw`, `lscpu`, `lspci`, `lsusb`, `dmidecode`: информация за хардуера, включително CPU, BIOS, RAID, графики, устройства и др.
- `lsmod` и `modinfo`: Списък и показване на подробности за модулите на ядрото.
- `fortune`, `ddate` и `sl`: хм, добре, зависи дали смятате парните локомотиви и цитатите на Zippy за "полезни"
## само за macOS
Това са елементи, подходящи *само* за macOS.
- Управление на пакети с `brew` (Homebrew) и/или `port` (MacPorts). Те могат да се използват за инсталиране на macOS на много от горните команди.
- Копирайте изхода на всяка команда в настолно приложение с `pbcopy` и поставете вход от едно с `pbpaste`.
- За да активирате клавиша Option в macOS Terminal като клавиш alt (като използван в командите по-горе като **alt-b**, **alt-f** и т.н.), отворете Предпочитания -> Профили -> Клавиатура и изберете „Използване на опция като мета ключ“.
- За да отворите файл с настолно приложение, използвайте `open` или `open -a /Applications/Whatever.app`.
- Прожектор: Търсете файлове с `mdfind` и изброявайте метаданни (като EXIF информация за снимка) с `mdls`.
- Имайте предвид, че macOS е базиран на BSD Unix и много команди (например `ps`, `ls`, `tail`, `awk`, `sed`) имат много фини вариации от Linux, което до голяма степен е повлияно от System V Unix и GNU инструменти в стил. Често можете да разберете разликата, като забележите, че страницата на ръководството има заглавие "BSD General Commands Manual." В някои случаи могат да бъдат инсталирани и GNU версии (като `gawk` и `gsed` за GNU awk и sed). Ако пишете крос-платформени Bash скриптове, избягвайте такива команди (например помислете за Python или `perl`) или тествайте внимателно.
- За да получите информация за версията на macOS, използвайте `sw_vers`.
## Само за Windows
Тези елементи са подходящи *само* за Windows.
### Начини за получаване на Unix инструменти под Windows
- Достъп до силата на обвивката на Unix под Microsoft Windows, като инсталирате [Cygwin](https://cygwin.com/). Повечето неща, описани в този документ, ще работят веднага.
- В Windows 10 можете да използвате [Подсистема на Windows за Linux (WSL)](https://msdn.microsoft.com/commandline/wsl/about), която предоставя позната Bash среда с помощни програми за командния ред на Unix.
- Ако искате да използвате основно инструменти за разработчици на GNU (като GCC) в Windows, помислете за [MinGW](http://www.mingw.org/) и неговия [MSYS](http://www.mingw.org/ wiki/msys), който предоставя помощни програми като bash, gawk, make и grep. MSYS няма всички функции в сравнение с Cygwin. MinGW е особено полезен за създаване на собствени Windows портове на Unix инструменти.
- Друг вариант за придобиване на Unix външен вид и усещане под Windows е [Cash](https://github.com/dthree/cash). Обърнете внимание, че само много малко Unix команди и опции на командния ред са налични в тази среда.
### Полезни инструменти от командния ред на Windows
- Можете да изпълнявате и скриптирате повечето задачи за системно администриране на Windows от командния ред, като научите и използвате `wmic`.
- Вградените мрежови инструменти на Windows за команден ред, които може да намерите за полезни, включват `ping`, `ipconfig`, `tracert` и `netstat`.
- Можете да изпълнявате [много полезни задачи на Windows](http://www.thewindowsclub.com/rundll32-shortcut-commands-windows), като извикате командата `Rundll32`.
### Съвети и трикове на Cygwin
- Инсталирайте допълнителни Unix програми с мениджъра на пакети на Cygwin.
- Използвайте `mintty` като прозорец на командния ред.
- Достъп до клипборда на Windows чрез `/dev/clipboard`.
- Стартирайте `cygstart`, за да отворите произволен файл чрез регистрираното приложение.
- Достъп до системния регистър на Windows с `regtool`.
- Обърнете внимание, че пътят на устройство `C:\` на Windows става `/cygdrive/c` под Cygwin и че `/` на Cygwin се появява под `C:\cygwin` на Windows. Конвертирайте между Cygwin и файлови пътища в стил Windows с `cygpath`. Това е най-полезно в скриптове, които извикват Windows програми.
## Повече ресурси
- [awesome-shell](https://github.com/alebcay/awesome-shell): Подбран списък с инструменти и ресурси на shell.
- [awesome-osx-command-line](https://github.com/herrbischoff/awesome-osx-command-line): По-задълбочено ръководство за командния ред на macOS.
- [Строг режим](http://redsymbol.net/articles/unofficial-bash-strict-mode/) за писане на по-добри шел скриптове.
- [shellcheck](https://github.com/koalaman/shellcheck): инструмент за статичен анализ на shell скрипт. По същество мъх за bash/sh/zsh.
- [Имена на файлове и пътища в Shell](http://www.dwheeler.com/essays/filenames-in-shell.html): Тъжно сложните детайли за това как да се обработват правилно имената на файловете в скриптовете на обвивката.
- [Наука за данни в командния ред](http://datascienceatthecommandline.com/#tools): Още команди и инструменти, полезни за правене на наука за данни, от книгата със същото име
## Опровержение
С изключение на много малки задачи, кодът се пише, така че другите да могат да го четат. С властта идва и отговорността. Фактът, че *можете* да направите нещо в Bash, не означава непременно, че трябва! ;)
## Разрешително
[![Лиценз на Creative Commons](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](http://creativecommons.org/licenses/by-sa/4.0/).