Compare commits

...

8 Commits

Author SHA1 Message Date
Angelo II 9736ee38e5
Merge 1f2da3d907 into 6b50745d2e 2024-03-30 17:15:01 +02:00
Angelo II 1f2da3d907
Merge branch 'jlevy:master' into master 2024-03-30 17:13:38 +02:00
Angelo II 7581e8f9eb
fix heading links 2023-02-01 20:25:54 +02:00
Angelo II f6012acae3
Update README-bg.md 2023-01-29 20:28:16 +02:00
Angelo II b6e4bfab8f
Update README-bg.md 2023-01-29 20:25:28 +02:00
Angelo II ff2c195165
Update README-bg.md 2023-01-29 20:04:58 +02:00
Angelo II 6dd910e4b4
Update README-bg.md 2023-01-29 20:04:32 +02:00
Angelo II 9d3460dda6
Create README-bg.md
Didn't check ⚠️
2023-01-29 01:29:34 +02:00
1 changed files with 632 additions and 0 deletions

632
README-bg.md Normal file
View File

@ -0,0 +1,632 @@
🌍
_[Български](README-bg.md) ∙ [Č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)_
# Изкуството на командния ред
- [Мета](#мета)
- [Основи](#основи)
- [Ежедневна употреба](#ежедневна-употреба)
- [Обработка на файлове и данни](#обработка-на-файлове-и-данни)
- [Отстраняване на грешки в системата](#отстраняване-на-грешки-в-системата)
- [Еднолинейни](#еднолинейни)
- [Неясно, но полезно](#неясно-но-полезно)
- [Само за macOS](#само-за-macos)
- [Само Windows](#само-windows)
- [Повече ресурси](#повече-ресурси)
- [Опровержение](#опровержение)
![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 и т.н., макар да е изкушаващо на вашия собствен лаптоп, ви ограничава в много ситуации, като например използването на съществуващи сървъри).
- Научете добре поне един текстов редактор. The `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.
- Научете за разширението на файловия глобус с `*` (и може би `?` и `[`...`]`) и цитиране и разликата между двойно `"` и единични `'` кавички. (Вижте повече за разширяването на променливи по-долу.)
- Запознайте се с управлението на задачи в 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`. The `-i`, `-o`, `-v`, `-A`, `-B`, и `-C` опциите си струва да знаете.
- Научете се да използвате `apt-get`, `yum`, `dnf` или `pacman` (в зависимост от дистрибуцията), за да намерите и инсталирате пакети. И се уверете, че имате `pip` за инсталиране на базирани на Python инструменти за команден ред (няколко по-долу са най-лесни за инсталиране чрез `pip`).
## Ежедневна употреба
- В Bash използвайте **Раздел** за попълване на аргументи или изброяване на всички налични команди и **ctrl-r** за търсене в историята на командите (след натискане въведете за търсене, натиснете **ctrl-r** многократно, за да преминете през още съвпадения, натиснете **Въведете** за да изпълните намерената команда или натиснете стрелката надясно, за да поставите резултата в текущия ред, за да позволите редактиране).
- В Bash използвайте **ctrl-w** за да изтриете последната дума и **ctrl-u** за да изтриете съдържанието от текущия курсор обратно до началото на реда. Използвайте **alt-b** и **alt-f** да се движи с дума, **ctrl-a** за да преместите курсора в началото на реда, **ctrl-e** за да преместите курсора до края на реда, **ctrl-k** да убиеш до края на линията, **ctrl-l** за да изчистите екрана. Вижте `man readline` за всички клавишни комбинации по подразбиране в Bash. Има много. Например **alt-.** преминава през предишни аргументи и **alt-\*** разширява глобус.
- Като алтернатива, ако обичате клавишни връзки в стил vi, използвайте `set -o vi``set -o emacs` да го върна обратно).
- За редактиране на дълги команди, след настройка на вашия редактор (напр `export EDITOR=vim`), **ctrl-x** **ctrl-e** ще отвори текущата команда в редактор за многоредово редактиране. Или във vi стил, **бягство-v**.
- За да видите последните команди, използвайте `history`. Следвайте с `!n` (където `n` е номерът на командата), за да изпълните отново. Има и много съкращения, които можете да използвате, вероятно най-полезното е `!$` за последен аргумент и `!!` за последната команда (вижте "РАЗШИРЯВАНЕ НА ИСТОРИЯТА" в страницата на ръководството). Те обаче често се заменят лесно с **ctrl-r** и **alt-.**.
- Отидете в началната си директория с `cd`. Достъп до файлове, свързани с вашата домашна директория с `~` префикс (напр. `~/.bashrc`). в `sh` скриптовете се отнасят до началната директория като `$HOME`.
- За да се върнете към предишната работна директория: `cd -`.
- Ако сте наполовина въвели команда, но промените решението си, натиснете **alt-#** да добавите a `#` в началото и го въведете като коментар (или използвайте **ctrl-a**, **#**, **влизам**). След това можете да се върнете към него по-късно чрез хронология на командите.
- Използвайте `xargs` (или `parallel`). Много е мощен. Имайте предвид, че можете да контролирате колко елемента се изпълняват на ред (`-L`), както и паралелизъм (`-P`). Ако не сте сигурни дали ще направи правилното нещо, използвайте `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 -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` опции за разрешаване на нулеви знаци за разделяне на имена на файлове, напр. `locate -0 pattern | 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. Полезен навик е да стартирате скрипт като този, който ще го накара да открие и да прекрати често срещани грешки и да отпечата съобщение:
```bash
set -euo pipefail
trap "echo 'error: Script failed: see failed command above'" ERR
```
- В Bash скриптовете подобвивките (изписани със скоби) са удобни начини за групиране на команди. Често срещан пример е временно преместване в друга работна директория, напр.
```bash
# 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}`. Използване на стойност по подразбиране, ако променливата е празна: `${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`.)
- Резултатът от команда може да се третира като файл чрез `<(some command)` (известен като заместване на процеса). Например, сравнете местните `/etc/hosts` с дистанционно:
```sh
diff /etc/hosts <(ssh somehost cat /etc/hosts)
```
- Когато пишете скриптове, може да искате да поставите целия си код във фигурни скоби. Ако затварящата фигурна скоба липсва, вашият скрипт ще бъде предотвратен от изпълнение поради синтактична грешка. Това има смисъл, когато вашият скрипт ще бъде изтеглен от мрежата, тъй като предотвратява изпълнението на частично изтеглени скриптове:
```bash
{
# Your code here
}
```
- „Документ тук“ позволява [пренасочване на множество входни редове](https://www.tldp.org/LDP/abs/html/here-docs.html) като от файл:
<!---->
cat <<EOF
input
on multiple lines
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=yes
ServerAliveInterval=15
ServerAliveCountMax=6
Compression=yes
ControlMaster auto
ControlPath /tmp/%r@%h:%p
ControlPersist yes
- Няколко други опции, свързани с ssh, са чувствителни към сигурността и трябва да се активират внимателно, напр. на подмрежа или хост или в надеждни мрежи: `StrictHostKeyChecking=no`, `ForwardAgent=yes`
- Обмисли [`mosh`](https://mosh.mit.edu/) алтернатива на ssh, която използва UDP, като избягва прекъснати връзки и добавя удобство по пътя (изисква настройка от страна на сървъра).
- За да получите разрешенията за файл в осмична форма, което е полезно за системна конфигурация, но не е налично в `ls` и лесен за бъркане, използвайте нещо подобно
```sh
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 username` или `su - username`. Последното с "-" получава среда, сякаш друг потребител току-що е влязъл. Пропускането на потребителското име по подразбиране е root. Ще бъдете попитани за паролата а потребителя, към който превключвате_.
- Знайте за [Ограничение от 128K](https://wiki.debian.org/CommonErrorMessages/ArgumentListTooLong) на командните редове. Тази грешка „Списъкът с аргументи е твърде дълъг“ е често срещана, когато заместващият знак съответства на голям брой файлове. (Когато това се случи, алтернативи като `find` и `xargs` може да помогне.)
- За основен калкулатор (и разбира се достъп до Python като цяло) използвайте `python` преводач. Например,
<!---->
>>> 2+3
5
## Обработка на файлове и данни
- За да намерите файл по име в текущата директория, `find . -iname '*something*'` (или подобни). За да намерите файл навсякъде по име, използвайте `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) е по-бърз. на Amazon [`aws`](https://github.com/aws/aws-cli) и подобреното [`saws`](https://github.com/donnemartin/saws) са от съществено значение за други задачи, свързани с AWS.
- Знам за `sort` и `uniq`, включително уникални `-u` и `-d` опции -- вижте едноредовите по-долу. Вижте също `comm`.
- Знам за `cut`, `paste`, и `join` за манипулиране на текстови файлове. Много хора използват `cut` но забравете за `join`.
- Знам за `wc` за броене на нови редове (`-l`), символи (`-m`), думи (`-w`) и байтове (`-c`).
- Знам за `tee` за копиране от stdin във файл, а също и в stdout, както в `ls -al | tee file.txt`.
- За по-сложни изчисления, включително групиране, обръщане на полета и статистически изчисления, помислете [`datamash`](https://www.gnu.org/software/datamash/).
- Знайте, че локалът засяга много инструменти на командния ред по фини начини, включително ред на сортиране (съпоставяне) и производителност. Повечето инсталации на Linux ще се зададат `LANG` или други локални променливи към локална настройка като американски английски. Но имайте предвид, че сортирането ще се промени, ако промените локала. И знайте, че рутинните процедури на i18n могат да накарат сортиране или други команди да се изпълняват _много пъти_ по-бавно. В някои ситуации (като операциите за набор или операциите за уникалност по-долу) можете безопасно да игнорирате изцяло бавните i18n процедури и да използвате традиционния ред на сортиране, базиран на байтове, като използвате `export LC_ALL=C`.
- Можете да зададете среда на конкретна команда, като префиксирате нейното извикване с настройките на променливата на средата, както в `TZ=Pacific/Fiji date`.
- Знайте основни `awk` и `sed` за просто събиране на данни. Вижте [Еднолинейни](#one-liners) например.
- За да замените всички срещания на низ на място, в един или повече файлове:
```sh
perl -pi.bak -e 's/old-string/new-string/g' my-files-*.txt
```
- За да преименувате множество файлове и/или да търсите и заменяте във файлове, опитайте [`repren`](https://github.com/jlevy/repren). (В някои случаи, `rename` командата също така позволява множество преименувания, но внимавайте, тъй като нейната функционалност не е една и съща във всички Linux дистрибуции.)
```sh
# Full rename of filenames, directories, and contents foo -> bar:
repren --full --preserve-case --from foo --to bar .
# Recover backup files whatever.bak -> whatever:
repren --renames --from '(.*)\.bak' --to '\1' *.bak
# Same as above, using rename, if available:
rename 's/\.bak$//' *.bak
```
- Както се казва в man страницата, `rsync` наистина е бърз и изключително гъвкав инструмент за копиране на файлове. Той е известен със синхронизирането между машини, но е също толкова полезен локално. Когато ограниченията за сигурност позволяват, използвайте `rsync` вместо `scp` позволява възстановяване на трансфер без рестартиране от нулата. Също така е сред [най-бързите начини](https://web.archive.org/web/20130929001850/http://linuxnote.net/jianingy/en/linux/a-fast-way-to-remove-huge-number-of-files.html) за изтриване на голям брой файлове:
```sh
mkdir empty && rsync -r --delete empty/ some-dir && rmdir some-dir
```
- За наблюдение на напредъка при обработка на файлове използвайте [`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` за разбъркване или избиране на произволни редове от файл.
- Зная `sort`опциите на. За числа използвайте `-n`, или `-h` за работа с четими от човека числа (напр. от `du -h`). Знайте как работят ключовете (`-t` и `-k`). По-специално, внимавайте, че трябва да пишете `-k1,1` да сортирате само по първото поле; `-k1` означава сортиране според целия ред. Стабилно сортиране (`sort -s`) могат да бъдат полезни. Например, за да сортирате първо по поле 2, след това вторично по поле 1, можете да използвате `sort -k1,1 | sort -s -k2,2`.
- Ако някога ви се наложи да напишете разделителен литерал в команден ред в Bash (напр. за аргумента -t за сортиране), натиснете **ctrl-v** **\[Раздел]** или пишете `$'\t'` (последното е по-добро, тъй като можете да го копирате/поставите).
- Стандартните инструменти за корекция на изходния код са `diff` и `patch`. Вижте също `diffstat` за обобщена статистика на разл `sdiff` за разл. Забележка `diff -r` работи за цели директории. Използвайте `diff -r tree1 tree2 | diffstat` за обобщение на промените. Използвайте `vimdiff` за сравняване и редактиране на файлове.
- За двоични файлове използвайте `hd`, `hexdump` или `xxd` за прости шестнадесетични дъмпове и `bvi`, `hexedit` или `biew` за двоично редактиране.
- Също така за двоични файлове, `strings` (плюс `grep`и т.н.) ви позволява да намирате части от текст.
- За двоични разлики (делта компресия) използвайте `xdelta3`.
- За да конвертирате текстови кодировки, опитайте `iconv`. Или `uconv` за по-напреднала употреба; поддържа някои усъвършенствани Unicode неща. Например:
```sh
# Displays hex codes or actual names of characters (useful for debugging):
uconv -f utf-8 -t utf-8 -x '::Any-Hex;' < input.txt
uconv -f utf-8 -t utf-8 -x '::Any-Name;' < input.txt
# Lowercase and removes all accents (by expanding and dropping them):
uconv -f utf-8 -t utf-8 -x '::Any-Lower; ::Any-NFD; [:Nonspacing Mark:] >; ::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-option) [проблемно](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` за запазване и възстановяване на разрешения за файлове. Например:
```sh
getfacl -R /some/path > permissions.txt
setfacl --restore=permissions.txt
```
- За бързо създаване на празни файлове използвайте `truncate` (създава [разреден файл](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. JDK `jps`, `jstat`, `jstack`, `jmap` са полезни. [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).
- The `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 deleted | grep "filename-of-my-big-file"`
## Еднолинейни
Няколко примера за сглобяване на команди:
- Понякога е изключително полезно, че можете да правите пресичане, обединение и разлика на текстови файлове чрез `sort`/`uniq`. Да предположим `a` и `b` са текстови файлове, които вече са уникални. Това е бързо и работи с файлове с произволен размер, до много гигабайта. (Сортирането не е ограничено от паметта, въпреки че може да се наложи да използвате `-T` опция ако `/tmp` е на малък root дял.) Вижте също бележката относно `LC_ALL` над и `sort`'с `-u` опция (оставена за яснота по-долу).
```sh
sort a b | uniq > c # c is a union b
sort a b | uniq -d > c # c is a intersect b
sort a b b | uniq -u > c # c is set difference a - b
```
- Красиво отпечатайте два JSON файла, като нормализирате синтаксиса им, след което оцветете и пагинирайте резултата:
<!---->
diff <(jq --sort-keys . < file1.json) <(jq --sort-keys . < file2.json) | colordiff | less -R
- Използвайте `grep . *` за бързо изследване на съдържанието на всички файлове в директория (така че всеки ред е съчетан с името на файла), или `head -100 *` (така че всеки файл има заглавие). Това може да бъде полезно за директории, пълни с конфигурационни настройки като тези в `/sys`, `/proc`, `/etc`.
- Сумиране на всички числа в третата колона на текстов файл (това вероятно е 3 пъти по-бързо и 3 пъти по-малко код от еквивалентен Python):
```sh
awk '{ x += $3 } END { print x }' myfile
```
- За да видите размери/дати на дърво от файлове, това е като рекурсивно `ls -l` но се чете по-лесно от `ls -lR`:
```sh
find . -type f -ls
```
- Да кажем, че имате текстов файл, като регистър на уеб сървър, и определена стойност, която се появява на някои редове, като например `acct_id` параметър, който присъства в URL адреса. Ако искате преброяване на колко заявки за всяка `acct_id`:
```sh
egrep -o 'acct_id=[0-9]+' access.log | cut -d= -f2 | sort | uniq -c | sort -rn
```
- За да наблюдавате непрекъснато промените, използвайте `watch`, напр. проверка на промените във файловете в директория с `watch -d -n 2 'ls -rtlh | tail'` или към мрежовите настройки, докато отстранявате неизправности с вашите wifi настройки `watch -d -n 2 ifconfig`.
- Стартирайте тази функция, за да получите случаен съвет от този документ (разбира Markdown и извлича елемент):
```sh
function taocl() {
curl -s https://raw.githubusercontent.com/jlevy/the-art-of-command-line/master/README.md |
sed '/cowsay[.]png/d' |
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 | iconv -t US
}
```
## Неясно, но полезно
- `expr`: изпълнява аритметични или булеви операции или оценява регулярни изрази
- `m4`: прост макро процесор
- `yes`: отпечатайте низ много
- `cal`: хубав календар
- `env`: изпълнете команда (полезно в скриптове)
- `printenv`: отпечатване на променливи на средата (полезно при отстраняване на грешки и скриптове)
- `look`: намира английски думи (или редове във файл), започващи с низ
- `cut`, `paste` и `join`: манипулиране на данни
- `fmt`: форматиране на текстови параграфи
- `pr`: форматирайте текста в страници/колони
- `fold`: обвиване на редове от текст
- `column`: форматирайте текстовите полета в подравнени колони или таблици с фиксирана ширина
- `expand` и `unexpand`: конвертиране между раздели и интервали
- `nl`: добавете номера на редове
- `seq`: печат на числа
- `bc`: калкулатор
- `factor`: множител на цели числа
- [`gpg`](https://gnupg.org/): криптиране и подписване на файлове
- `toe`: таблица с терминофони
- `nc`: отстраняване на грешки в мрежата и пренос на данни
- `socat`: реле за гнездо и пренасочване на tcp порт (подобно на `netcat`)
- [`slurm`](https://github.com/mattthias/slurm): визуализация на мрежовия трафик
- `dd`: преместване на данни между файлове или устройства
- `file`: идентифицирайте типа на файла
- `tree`: показва директории и поддиректории като вложено дърво; като `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 something some-file | sponge some-file`
- `units`: преобразуване на единици и изчисления; преобразува стадии на две седмици в туипове на мигане (вижте също `/usr/share/units/definitions.units`)
- `apg`: генерира произволни пароли
- `xz`: високо съотношение на компресиране на файлове
- `ldd`: информация за динамична библиотека
- `nm`: символи от обектни файлове
- `ab` или [`wrk`](https://github.com/wg/wrk): сравнителен анализ на уеб сървъри
- `strace`: отстраняване на грешки в системно повикване
- [`mtr`](http://www.bitwizard.nl/mtr/): по-добър traceroute за отстраняване на грешки в мрежата
- `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`: подобрена версия на топ
- `last`: история на влизане
- `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`.
- Spotlight: Търсене на файлове с `mdfind` и списък с метаданни (като EXIF ​​информация за снимка) с `mdls`.
- Имайте предвид, че macOS е базиран на BSD Unix и много команди (напр `ps`, `ls`, `tail`, `awk`, `sed`) имат много фини вариации от Linux, което до голяма степен е повлияно от Unix и GNU инструменти в стил System V. Често можете да разберете разликата, като забележите, че страницата на ръководството има заглавие "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 е [Пари в брой](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`.
- Имайте предвид, че a `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.
- [Strict mode](http://redsymbol.net/articles/unofficial-bash-strict-mode/) за писане на по-добри шел скриптове.
- [shellcheck](https://github.com/koalaman/shellcheck): Инструмент за статичен анализ на shell скрипт. По същество мъх за bash/sh/zsh.
- [Filenames and Pathnames in Shell](http://www.dwheeler.com/essays/filenames-in-shell.html): Тъжно сложните подробности за това как да се обработват правилно имената на файловете в скриптове на обвивката.
- [Data Science at the Command Line](http://datascienceatthecommandline.com/#tools): Още команди и инструменти, полезни за правене на наука за данни, от книгата със същото име
## Опровержение
С изключение на много малки задачи, кодът се пише, така че другите да могат да го четат. С властта идва и отговорността. Фактът вие ожете_ да направите нещо в Bash не означава непременно, че трябва! ;)
## Разрешително
[![Creative Commons License](https://i.creativecommons.org/l/by-sa/4.0/88x31.png)](http://creativecommons.org/licenses/by-sa/4.0/)
Тази работа е лицензирана под a [Creative Commons Attribution-ShareAlike 4.0 Международен лиценз](http://creativecommons.org/licenses/by-sa/4.0/).