From 9d3460dda62eecdbc323cbbdd5865ef65b39bd7d Mon Sep 17 00:00:00 2001 From: Angelo II <62988428+AngeloCore@users.noreply.github.com> Date: Sun, 29 Jan 2023 01:29:34 +0200 Subject: [PATCH 1/6] Create README-bg.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Didn't check ⚠️ --- README-bg.md | 624 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 624 insertions(+) create mode 100644 README-bg.md diff --git a/README-bg.md b/README-bg.md new file mode 100644 index 0000000..d3c0c4f --- /dev/null +++ b/README-bg.md @@ -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) като от файл: +``` +котка <logfile 2>&1` или `some-command &>logfile`. Често, за да се гарантира, че дадена команда не оставя манипулатор на отворен файл към стандартния вход, свързвайки го с терминала, в който се намирате, също е добра практика да добавите `>> 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 ` и пълно проследяване на стека и обобщение на купчината (включително подробности за събирането на боклука за поколенията, които може да бъде много информативен) ще бъдат изхвърлени в 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/). From 6dd910e4b4f74af72e26c50ce9145722edc8f1ae Mon Sep 17 00:00:00 2001 From: Angelo II <62988428+AngeloCore@users.noreply.github.com> Date: Sun, 29 Jan 2023 20:04:32 +0200 Subject: [PATCH 2/6] Update README-bg.md --- README-bg.md | 563 ++++++++++++++++++++++++++------------------------- 1 file changed, 287 insertions(+), 276 deletions(-) diff --git a/README-bg.md b/README-bg.md index d3c0c4f..0889abf 100644 --- a/README-bg.md +++ b/README-bg.md @@ -4,411 +4,424 @@ # Изкуството на командния ред -*Забележка: Планирам да преработя това и търся нов съавтор, който да помогне с разширяването на това в по-изчерпателно ръководство. Въпреки че е много популярен, той може да бъде по-широк и малко по-дълбок. Ако обичате да пишете и сте почти експерт по този материал и желаете да обмислите да помогнете, моля, пуснете ми бележка на josh (0x40) holloway.com. –[jlevy](https://github.com/jlevy), [Holloway](https://www.holloway.com). Благодаря ти!* +_Забележка: Планирам да преработя това и търся нов съавтор, който да ми помогне с разширяването на това в по-изчерпателно ръководство. Въпреки че е много популярен, той може да бъде по-широк и малко по-дълбок. Ако обичате да пишете и сте почти експерт по този материал и желаете да обмислите да помогнете, моля, пуснете ми бележка на josh (0x40) holloway.com. –[jlevy](https://github.com/jlevy), [Холоуей](https://www.holloway.com). Благодаря ти!_ - [Мета](#meta) -- [Основи](#основи) +- [Основи](#basics) - [Ежедневна употреба](#everyday-use) - [Обработка на файлове и данни](#processing-files-and-data) -- [Отстраняване на грешки в системата] (#system-debugging) -- [Едноредов](#едноредов) -- [Неясно, но полезно](#неясно-но-полезно) +- [Отстраняване на грешки в системата](#system-debugging) +- [Еднолинейни](#one-liners) +- [Неясно, но полезно](#obscure-but-useful) - [само за macOS](#macos-only) -- [Само за Windows] (#windows-only) -- [Още ресурси](#more-resources) -- [Отказ от отговорност](#отказ от отговорност) +- [Само Windows](#windows-only) +- [Повече ресурси](#more-resources) +- [Опровержение](#disclaimer) +![curl -s 'https://raw.githubusercontent.com/jlevy/the-art-of-command-line/master/README.md' | egrep -o '\w+' | tr -d '`' | cowsay -W50](cowsay.png) -![curl -s 'https://raw.githubusercontent.com/jlevy/the-art-of-command-line/master/README.md' | egrep -o '`\w+`' | tr -d ''`' | cowsay -W50](cowsay.png) - -Плавното владеене на командния ред е умение, което често се пренебрегва или смята за тайнствено, но подобрява вашата гъвкавост и продуктивност като инженер както по очевидни, така и по фини начини. Това е селекция от бележки и съвети относно използването на командния ред, които намерихме за полезни при работа с Linux. Някои съвети са елементарни, а други са доста специфични, сложни или неясни. Тази страница не е дълга, но ако можете да използвате и да си припомните всички елементи тук, знаете много. +Владеенето на командния ред е умение, което често се пренебрегва или смята за тайнствено, но подобрява вашата гъвкавост и производителност като инженер както по очевидни, така и по фини начини. Това е селекция от бележки и съвети относно използването на командния ред, които намерихме за полезни при работа с Linux. Някои съвети са елементарни, а други са доста специфични, сложни или неясни. Тази страница не е дълга, но ако можете да използвате и да си припомните всички елементи тук, знаете много. Тази работа е резултат от [много автори и преводачи](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), +[се появи](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), ако видите грешка или нещо, което може да бъде по-добро! +[**Моля, изпратете въпрос**](https://airtable.com/shrzMhx00YiIVAWJg) ако имате въпрос, свързан с командния ред. [**Моля, допринесете**](/CONTRIBUTING.md) ако видите грешка или нещо, което може да бъде по-добро! ## Мета Обхват: -- Това ръководство е както за начинаещи, така и за опитни потребители. Целите са *широчина* (всичко важно), *конкретност* (дайте конкретни примери за най-често срещания случай) и *краткост* (избягвайте неща, които не са съществени, или отклонения, които лесно можете да потърсите другаде). Всеки съвет е важен в дадена ситуация или значително спестява време пред алтернативи. -– Това е написано за Linux, с изключение на секциите „[само за macOS](#macos-only)“ и „[само за Windows](#windows-only)“. Много от другите елементи се прилагат или могат да бъдат инсталирани на други Unices или macOS (или дори Cygwin). -- Фокусът е върху интерактивния Bash, въпреки че много съвети се отнасят за други обвивки и за общи Bash скриптове. -- Включва както "стандартни" Unix команди, така и такива, които изискват инсталиране на специални пакети - стига да са достатъчно важни, за да заслужават включване. +- Това ръководство е както за начинаещи, така и за опитни потребители. Целите са _широчина_ (всичко важно), _специфичност_ (дайте конкретни примери за най-често срещания случай) и _краткост_ (избягвайте неща, които не са от съществено значение, или отклонения, които лесно можете да потърсите другаде). Всеки съвет е важен в дадена ситуация или значително спестява време пред алтернативи. +- Това е написано за Linux, с изключение на "[само за macOS](#macos-only)" и "[Само Windows](#windows-only)" секции. Много от другите елементи се прилагат или могат да бъдат инсталирани на други Unices или macOS (или дори Cygwin). +- Фокусът е върху интерактивния Bash, въпреки че много съвети се отнасят и за други черупки и за общото писане на Bash. +- Той включва както "стандартни" Unix команди, така и такива, които изискват инсталиране на специални пакети - стига да са достатъчно важни, за да заслужават включване. Бележки: - За да запазите това на една страница, съдържанието е имплицитно включено чрез препратка. Вие сте достатъчно умен, за да потърсите повече подробности другаде, след като знаете идеята или командата на Google. Използвайте `apt`, `yum`, `dnf`, `pacman`, `pip` или `brew` (според случая), за да инсталирате нови програми. -- Използвайте [Explainshell](http://explainshell.com/), за да получите полезна разбивка на това какво правят командите, опциите, каналите и т.н. - +- Използвайте [Explainshell](http://explainshell.com/) за да получите полезна разбивка на това какво правят командите, опциите, тръбите и т.н. ## Основи -- Научете основния Bash. Всъщност напишете `man bash` и поне прегледайте всичко; доста е лесно за следване и не е толкова дълго. Алтернативните обвивки могат да бъдат добри, но Bash е мощен и винаги достъпен (ученето *само* на zsh, fish и т.н., макар и изкушаващо на собствения ви лаптоп, ви ограничава в много ситуации, като например използването на съществуващи сървъри). +- Научете основния Bash. Всъщност, тип `man bash` и поне обезмаслете всичко; доста е лесно за следване и не е толкова дълго. Алтернативните обвивки могат да бъдат добри, но Bash е мощен и винаги достъпен (обучение _само_ zsh, fish и т.н., макар да е изкушаващо на вашия собствен лаптоп, ви ограничава в много ситуации, като например използването на съществуващи сървъри). -- Научете добре поне един текстов редактор. `nano` редакторът е един от най-простите за основно редактиране (отваряне, редактиране, запис, търсене). За опитния потребител на текстов терминал обаче няма заместител на Vim (`vi`), трудния за научаване, но уважаван, бърз и пълнофункционален редактор. Много хора също използват класическия Emacs, особено за по-големи задачи за редактиране. (Разбира се, всеки съвременен софтуерен разработчик, работещ върху обширен проект, е малко вероятно да използва само чисто текстов редактор и трябва да е запознат и със съвременните графични IDE и инструменти.) +- Научете добре поне един текстов редактор. 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. + - Знаете как да четете официална документация с `man` (за любознателните, `man man` изброява номерата на секциите, напр. 1 са "обикновени" команди, 5 са ​​файлове/конвенции и 8 са за администриране). Намерете man страници с `apropos`. + - Знайте, че някои команди не са изпълними, а вградени Bash и че можете да получите помощ за тях с `help` и `help -d`. Можете да разберете дали дадена команда е изпълним файл, вградена обвивка или псевдоним, като използвате `type command`. + - `curl cheat.sh/command` ще даде кратък "cheat sheet" с често срещани примери за това как да използвате команда на shell. -- Научете за разширяването на globus файл с `*` (и може би `?` и `[`...`]`) и кавички и разликата между двойни `"` и единични ``` кавички. (Вижте повече за разширяването на променливи По-долу.) +- Научете за пренасочването на изхода и въвеждането чрез `>` и `<` и използване на тръби `|`. Зная `>` презаписва изходния файл и `>>` добавя. Научете за stdout и stderr. -- Запознайте се с управлението на задачи в Bash: `&`, **ctrl-z**, **ctrl-c**, `jobs`, `fg`, `bg`, `kill` и др. +- Научете за разширението на файловия глобус с `*` (и може би `?` и `[`...`]`) и цитиране и разликата между двойно `"` и единични `'` кавички. (Вижте повече за разширяването на променливи по-долу.) -- Познавайте `ssh` и основите на удостоверяване без парола, чрез `ssh-agent`, `ssh-add` и др. +- Запознайте се с управлението на задачи в Bash: `&`, **ctrl-z**, **ctrl-c**, `jobs`, `fg`, `bg`, `kill`и т.н. -- Основно управление на файлове: `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`). +- Зная `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`. +- Научете и използвайте система за управление на контрола на версиите, като напр `git`. -- Познавайте добре регулярните изрази и различните флагове за `grep`/`egrep`. Струва си да знаете опциите „-i“, „-o“, „-v“, „-A“, „-B“ и „-C“. - -- Научете се да използвате `apt-get`, `yum`, `dnf` или `pacman` (в зависимост от дистрибуцията), за да намерите и инсталирате пакети. И се уверете, че имате `pip`, за да инсталирате базирани на Python инструменти за команден ред (няколко по-долу са най-лесни за инсталиране чрез `pip`). +- Познавайте добре регулярните изрази и различните флагове `grep`/`egrep`. The `-i`, `-o`, `-v`, `-A`, `-B`, и `-C` опциите си струва да знаете. +- Научете се да използвате `apt-get`, `yum`, `dnf` или `pacman` (в зависимост от дистрибуцията), за да намерите и инсталирате пакети. И се уверете, че имате `pip` за инсталиране на базирани на Python инструменти за команден ред (няколко по-долу са най-лесни за инсталиране чрез `pip`). ## Ежедневна употреба -- В Bash използвайте **Tab** за попълване на аргументи или изброяване на всички налични команди и **ctrl-r** за търсене в хронологията на командите (след натискане въведете за търсене, натиснете **ctrl-r** многократно за цикъл през още съвпадения, натиснете **Enter**, за да изпълните намерената команда, или натиснете стрелката надясно, за да поставите резултата в текущия ред, за да позволите редактиране). +- В 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-*** разширява глобус. +- В 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` да го върна обратно). -- Като алтернатива, ако обичате vi-style key-bindings, използвайте `set -o vi` (и `set -o emacs`, за да го върнете обратно). +- За редактиране на дълги команди, след настройка на вашия редактор (напр `export EDITOR=vim`), **ctrl-x** **ctrl-e** ще отвори текущата команда в редактор за многоредово редактиране. Или във vi стил, **бягство-v**. -- За редактиране на дълги команди, след настройка на вашия редактор (например `export EDITOR=vim`), **ctrl-x** **ctrl-e** ще отвори текущата команда в редактор за многоредово редактиране. Или в стил vi, **escape-v**. +- За да видите последните команди, използвайте `history`. Следвайте с `!n` (където `n` е номерът на командата), за да изпълните отново. Има и много съкращения, които можете да използвате, вероятно най-полезното е `!$` за последен аргумент и `!!` за последната команда (вижте "РАЗШИРЯВАНЕ НА ИСТОРИЯТА" в страницата на ръководството). Те обаче често се заменят лесно с **ctrl-r** и **alt-.**. -- За да видите последните команди, използвайте `history`. Следвайте `!n` (където `n` е номерът на командата), за да изпълните отново. Има и много съкращения, които можете да използвате, като най-полезното вероятно е `!$` за последен аргумент и `!!` за последна команда (вижте "РАЗШИРЯВАНЕ НА ИСТОРИЯТА" в страницата с ръководство). Те обаче често се заменят лесно с **ctrl-r** и **alt-.**. - -- Отидете в началната си директория с `cd`. Достъп до файлове, свързани с вашата домашна директория с префикса `~` (напр. `~/.bashrc`). В `sh` скриптовете се отнасят към началната директория като `$HOME`. +- Отидете в началната си директория с `cd`. Достъп до файлове, свързани с вашата домашна директория с `~` префикс (напр. `~/.bashrc`). в `sh` скриптовете се отнасят до началната директория като `$HOME`. - За да се върнете към предишната работна директория: `cd -`. -- Ако сте по средата на въвеждането на команда, но промените решението си, натиснете **alt-#**, за да добавите `#` в началото и го въведете като коментар (или използвайте **ctrl-a**, ** #**, **въведете**). След това можете да се върнете към него по-късно чрез хронология на командите. +- Ако сте наполовина въвели команда, но промените решението си, натиснете **alt-#** да добавите a `#` в началото и го въведете като коментар (или използвайте **ctrl-a**, **#**, **влизам**). След това можете да се върнете към него по-късно чрез хронология на командите. -- Използвайте `xargs` (или `parallel`). Много е мощен. Имайте предвид, че можете да контролирате колко елемента се изпълняват на ред (`-L`), както и паралелизма (`-P`). Ако не сте сигурни дали ще направи правилното нещо, първо използвайте `xargs echo`. Също така, `-I{}` е удобно. Примери: -``` баш - намирам . -име '*.py' | xargs grep някаква_функция - домакини на котки | xargs -I{} ssh root@{} име на хост +- Използвайте `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` е полезно). +- Използвайте `pgrep` и `pkill` за намиране или сигнализиране на процеси по име (`-f` е полезно). -- Познайте различните сигнали, които можете да изпращате на процеси. Например, за да спрете процес, използвайте `kill -STOP [pid]`. За пълния списък вижте `man 7 signal` +- Запознайте се с различните процеси, които можете да изпращате. Например, за да спрете процес, използвайте `kill -STOP [pid]`. За пълния списък вж `man 7 signal` -- Използвайте `nohup` или `disown`, ако искате фонов процес да продължи да работи вечно. +- Използвайте `nohup` или `disown` ако искате фонов процес да продължи да работи завинаги. -- Проверете какви процеси слушат чрез `netstat -lntp` или `ss -plat` (за TCP; добавете `-u` за UDP) или `lsof -iTCP -sTCP:LISTEN -P -n` (което също работи на macOS ). +- Проверете кои процеси слушат `netstat -lntp` или `ss -plat` (за TCP; доп `-u` за UDP) или `lsof -iTCP -sTCP:LISTEN -P -n` (което също работи на macOS). - Вижте също `lsof` и `fuser` за отворени сокети и файлове. -- Вижте `uptime` или `w`, за да разберете колко време системата работи. +- Вижте `uptime` или `w` за да разберете колко време работи системата. -- Използвайте `alias`, за да създадете преки пътища за често използвани команди. Например, `alias ll='ls -latr'` създава нов псевдоним `ll`. +- Използвайте `alias` за създаване на преки пътища за често използвани команди. Например, `alias ll='ls -latr'` създава нов псевдоним `ll`. -- Запазете псевдонимите, настройките на обвивката и функциите, които обикновено използвате в `~/.bashrc`, и [подредете обвивките за влизане, за да го източат](http://superuser.com/a/183980/7106). Това ще направи вашата настройка достъпна във всичките ви сесии на обвивката. +- Запазете псевдоними, настройки на обвивката и функции, в които често използвате `~/.bashrc`, и [уредете черупките за влизане, за да го изворят](http://superuser.com/a/183980/7106). Това ще направи вашата настройка достъпна във всичките ви сесии на обвивката. -- Поставете настройките на променливите на средата, както и командите, които трябва да се изпълняват, когато влезете в `~/.bash_profile`. Ще е необходима отделна конфигурация за обвивки, които стартирате от влизания в графична среда и задания `cron`. +- Поставете настройките на променливите на средата, както и командите, които трябва да се изпълняват, когато влезете `~/.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 променливи с кавички, напр. `"$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. Полезен навик е да стартирате скрипт като този, който ще го накара да открие и да прекрати често срещани грешки и да отпечата съобщение: -``` баш - set -euo pipefail - trap "ехо 'грешка: Скриптът е неуспешен: вижте неуспешната команда по-горе'" ГРЕШКА +- В 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 скриптовете, подобвивките (изписани със скоби) са удобни начини за групиране на команди. Често срещан пример е временно преместване в друга работна директория, напр. -``` баш - # направи нещо в текущата директория - (cd /some/other/dir && other-command) - # продължете в оригиналната реж +- В 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`. +- Имайте предвид, че в 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}` (което разширява всички възможни комбинации и създава дърво на директория). Разширяването на скоби се извършва преди всяко друго разширение. +- Използване на разширение на скоби `{`...`}` може да намали необходимостта от повторно въвеждане на подобен текст и да автоматизира комбинациите от елементи. Това е полезно в примери като `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`.) +- Редът на разширенията е: разширяване на скоби; разширяване на тилда, разширяване на параметри и променливи, аритметично разширяване и заместване на команда (направено отляво надясно); разделяне на думи; и разширение на името на файла. (Например диапазон като `{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) +- Резултатът от команда може да се третира като файл чрез `<(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 <logfile 2>&1` или `some-command &>logfile`. Често, за да се гарантира, че дадена команда не оставя отворен манипулатор на файл към стандартния вход, свързвайки го с терминала, в който се намирате, също е добра практика да добавите ` + + 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 ``` -- В Bash пренасочете стандартния изход и стандартната грешка чрез: `some-command >logfile 2>&1` или `some-command &>logfile`. Често, за да се гарантира, че дадена команда не оставя манипулатор на отворен файл към стандартния вход, свързвайки го с терминала, в който се намирате, също е добра практика да добавите `>> 2+3 -5 -``` +- За основен калкулатор (и разбира се достъп до Python като цяло) използвайте `python` преводач. Например, + + + >>> 2+3 + 5 ## Обработка на файлове и данни -- За да намерите файл по име в текущата директория, `намери . -iname '*нещо*'` (или подобно). За да намерите файл навсякъде по име, използвайте „locate something“ (но имайте предвид, че „updatedb“ може да не е индексирал наскоро създадени файлове). +- За да намерите файл по име в текущата директория, `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). +- За общо търсене чрез файлове с източници или данни има няколко опции, по-разширени или по-бързи от `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` +- За Markdown, HTML и всички видове конвертиране на документи, опитайте [`pandoc`](http://pandoc.org/). Например, за да конвертирате Markdown документ във формат на Word: `pandoc README.md --from markdown --to docx -o temp.docx` -- Ако трябва да работите с XML, `xmlstarlet` е стар, но добър. +- Ако трябва да работите с 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` и др. +- За 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 . +- За 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` на uniq - вижте едноредовия текст по-долу. Вижте също `comm`. +- Знам за `sort` и `uniq`, включително уникални `-u` и `-d` опции -- вижте едноредовите по-долу. Вижте също `comm`. -- Научете за „изрязване“, „поставяне“ и „съединяване“, за да манипулирате текстови файлове. Много хора използват `cut`, но забравят за `join`. +- Знам за `cut`, `paste`, и `join` за манипулиране на текстови файлове. Много хора използват `cut` но забравете за `join`. -- Знайте за `wc` за преброяване на нови редове (`-l`), знаци (`-m`), думи (`-w`) и байтове (`-c`). +- Знам за `wc` за броене на нови редове (`-l`), символи (`-m`), думи (`-w`) и байтове (`-c`). -- Знайте за `tee` за копиране от stdin във файл, а също и в stdout, както в `ls -al | tee file.txt`. +- Знам за `tee` за копиране от stdin във файл, а също и в stdout, както в `ls -al | tee file.txt`. -- За по-сложни изчисления, включително групиране, обръщане на полета и статистически изчисления, помислете за [`datamash](https://www.gnu.org/software/datamash/). +- За по-сложни изчисления, включително групиране, обръщане на полета и статистически изчисления, помислете [`datamash`](https://www.gnu.org/software/datamash/). -- Знайте, че локалът засяга много инструменти на командния ред по фини начини, включително ред на сортиране (съпоставяне) и производителност. Повечето инсталации на Linux ще зададат `LANG` или други локални променливи на локална настройка като US English. Но имайте предвид, че сортирането ще се промени, ако промените локала. И знайте, че рутинните процедури на i18n могат да накарат сортирането или други команди да се изпълняват *много пъти* по-бавно. В някои ситуации (като операциите за набор или операциите за уникалност по-долу) можете безопасно да игнорирате изцяло бавните i18n процедури и да използвате традиционния ред на сортиране, базиран на байтове, като използвате `export LC_ALL=C`. +- Знайте, че локалът засяга много инструменти на командния ред по фини начини, включително ред на сортиране (съпоставяне) и производителност. Повечето инсталации на Linux ще се зададат `LANG` или други локални променливи към локална настройка като американски английски. Но имайте предвид, че сортирането ще се промени, ако промените локала. И знайте, че рутинните процедури на i18n могат да накарат сортиране или други команди да се изпълняват _много пъти_ по-бавно. В някои ситуации (като операциите за набор или операциите за уникалност по-долу) можете безопасно да игнорирате изцяло бавните i18n процедури и да използвате традиционния ред на сортиране, базиран на байтове, като използвате `export LC_ALL=C`. -- Можете да зададете обкръжението на конкретна команда, като поставите префикс за нейното извикване с настройките на променливата на обкръжението, като в `TZ=Pacific/Fiji date`. +- Можете да зададете среда на конкретна команда, като префиксирате нейното извикване с настройките на променливата на средата, както в `TZ=Pacific/Fiji date`. -- Познаване на основните `awk` и `sed` за лесно прехвърляне на данни. Вижте [One-liners](#one-liners) за примери. +- Знайте основни `awk` и `sed` за просто събиране на данни. Вижте [Еднолинейни](#one-liners) например. - За да замените всички срещания на низ на място, в един или повече файлове: -```ш - perl -pi.bak -e 's/old-string/new-string/g' my-files-*.txt + +```sh + 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 +- За да преименувате множество файлове и/или да търсите и заменяте във файлове, опитайте [`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 ``` -- Както се казва в страницата с ръководството, `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 някои-директории +- Както се казва в 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`. +- За наблюдение на напредъка при обработка на файлове използвайте [`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`, за да разбъркате или изберете произволни редове от файл. +- Използвайте `shuf` за разбъркване или избиране на произволни редове от файл. -- Познайте опциите за сортиране. За числа използвайте `-n` или `-h` за обработка на четими от човека числа (напр. от `du -h`). Научете как работят ключовете (`-t` и `-k`). По-специално, внимавайте, че трябва да напишете `-k1,1`, за да сортирате само по първото поле; „-k1“ означава сортиране според целия ред. Стабилното сортиране (`sort -s`) може да бъде полезно. Например, за да сортирате първо по поле 2, след това вторично по поле 1, можете да използвате `sort -k1,1 | сортиране -s -k2,2`. +- Зная `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** **[Tab]** или напишете `$'\t' ` (последното е по-добро, тъй като можете да го копирате/поставите). +- Ако някога ви се наложи да напишете разделителен литерал в команден ред в Bash (напр. за аргумента -t за сортиране), натиснете **ctrl-v** **\[Раздел]** или пишете `$'\t'` (последното е по-добро, тъй като можете да го копирате/поставите). -- Стандартните инструменти за корекция на изходния код са `diff` и `patch`. Вижте също `diffstat` за обобщена статистика на разлика и `sdiff` за разлика една до друга. Забележка `diff -r` работи за цели директории. Използвайте `diff -r дърво1 дърво2 | diffstat` за обобщение на промените. Използвайте `vimdiff` за сравняване и редактиране на файлове. +- Стандартните инструменти за корекция на изходния код са `diff` и `patch`. Вижте също `diffstat` за обобщена статистика на разл `sdiff` за разл. Забележка `diff -r` работи за цели директории. Използвайте `diff -r tree1 tree2 | diffstat` за обобщение на промените. Използвайте `vimdiff` за сравняване и редактиране на файлове. -- За бинарни файлове използвайте `hd`, `hexdump` или `xxd` за прости шестнадесетични дъмпове и `bvi`, `hexedit` или `biew` за двоично редактиране. +- За двоични файлове използвайте `hd`, `hexdump` или `xxd` за прости шестнадесетични дъмпове и `bvi`, `hexedit` или `biew` за двоично редактиране. -- Също така за двоични файлове, `strings` (плюс `grep` и т.н.) ви позволява да намерите битове текст. +- Също така за двоични файлове, `strings` (плюс `grep`и т.н.) ви позволява да намирате части от текст. -- За двоични разлики (делта компресия), използвайте `xdelta3`. +- За двоични разлики (делта компресия) използвайте `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 +- За да конвертирате текстови кодировки, опитайте `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` (за разделяне по модел). +- За да разделите файлове на части, вижте `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/). +- Дата и час: За да получите текущата дата и час в полезното [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` за работа с компресирани файлове. +- Използвайте `zless`, `zmore`, `zcat`, и `zgrep` за работа с компресирани файлове. -- Файловете атрибути могат да се задават чрез `chattr` и предлагат алтернатива от по-ниско ниво на разрешенията за файлове. Например, за защита срещу случайно изтриване на файл, неизменният флаг: `sudo chattr +i /critical/directory/or/file` +- Атрибутите на файла могат да се задават чрез `chattr` и предлагат алтернатива от по-ниско ниво на разрешенията за файлове. Например, за защита срещу случайно изтриване на файл, неизменният флаг: `sudo chattr +i /critical/directory/or/file` - Използвайте `getfacl` и `setfacl` за запазване и възстановяване на разрешения за файлове. Например: -```ш - getfacl -R /някои/път > permissions.txt - setfacl --restore=permissions.txt + +```sh + getfacl -R /some/path > 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). +- За бързо създаване на празни файлове използвайте `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). +- За уеб отстраняване на грешки, `curl` и `curl -I` са удобни, или техните `wget` еквиваленти, или по-модерните [`httpie`](https://github.com/jkbrzt/httpie). -- За да знаете текущото състояние на процесора/диска, класическите инструменти са `top` (или по-добре `htop`), `iostat` и `iotop`. Използвайте `iostat -mxz 15` за основен CPU и подробна статистика за дял на диска и информация за производителността. +- За да знаете текущото състояние на процесора/диска, класическите инструменти са `top` (или по-добре `htop`), `iostat`, и `iotop`. Използвайте `iostat -mxz 15` за основен CPU и подробна статистика за дял на диска и информация за производителността. - За подробности за мрежовата връзка използвайте `netstat` и `ss`. -- За бърз преглед на това, което се случва в системата, `dstat` е особено полезен. За най-широк преглед с подробности използвайте [`glances`](https://github.com/nicolargo/glances). +- За бърз преглед на това, което се случва в системата, `dstat` е особено полезно. За най-обширен преглед с подробности използвайте [`glances`](https://github.com/nicolargo/glances). - За да знаете състоянието на паметта, стартирайте и разберете изхода на `free` и `vmstat`. По-специално, имайте предвид, че „кешираната“ стойност е паметта, съхранявана от ядрото на Linux като файлов кеш, така че ефективно се брои към „свободната“ стойност. -- Отстраняването на грешки в системата на Java е различен котел за риба, но прост трик на Oracle и някои други JVM е, че можете да стартирате `kill -3 ` и пълно проследяване на стека и обобщение на купчината (включително подробности за събирането на боклука за поколенията, които може да бъде много информативен) ще бъдат изхвърлени в stderr/logs. `jps`, `jstat`, `jstack`, `jmap` на JDK са полезни. [SJK инструментите](https://github.com/aragozin/jvm-tools) са по-усъвършенствани. +- Отстраняването на грешки в системата на Java е различен котел за риба, но прост трик на Oracle и някои други JVM е, че можете да стартирате `kill -3 ` и пълно проследяване на стека и обобщение на купчината (включително подробности за събирането на боклук за поколенията, които могат да бъдат много информативни) ще бъдат изхвърлени в stderr/logs. JDK `jps`, `jstat`, `jstack`, `jmap` са полезни. [SJK инструменти](https://github.com/aragozin/jvm-tools) са по-напреднали. -- Използвайте [`mtr`](http://www.bitwizard.nl/mtr/) като по-добър маршрут за проследяване, за да идентифицирате мрежови проблеми. +- Използвайте [`mtr`](http://www.bitwizard.nl/mtr/) като по-добро трасиране за идентифициране на мрежови проблеми. -- За да разберете защо даден диск е пълен, [`ncdu`](https://dev.yorhel.nl/ncdu) спестява време в сравнение с обичайните команди като `du -sh *`. +- За да разберете защо дискът е пълен, [`ncdu`](https://dev.yorhel.nl/ncdu) спестява време в сравнение с обичайните команди като `du -sh *`. -- За да намерите кой сокет или процес използва честотна лента, опитайте [`iftop`](http://www.ex-parrot.com/~pdw/iftop/) или [`nethogs`](https://github.com /raboof/nethogs). +- За да разберете кой сокет или процес използва честотна лента, опитайте [`iftop`](http://www.ex-parrot.com/~pdw/iftop/) или [`nethogs`](https://github.com/raboof/nethogs). -- Инструментът `ab` (доставя се с Apache) е полезен за бърза и мръсна проверка на производителността на уеб сървъра. За по-сложни тестове за натоварване, опитайте `siege`. +- The `ab` инструмент (доставя се с Apache) е полезен за бърза и мръсна проверка на производителността на уеб сървъра. За по-сложни тестове за натоварване опитайте `siege`. -- За по-сериозно отстраняване на грешки в мрежата, [`wireshark`](https://wireshark.org/), [`tshark`](https://www.wireshark.org/docs/wsug_html_chunked/AppToolstshark.html) или [ `ngrep`](http://ngrep.sourceforge.net/). +- За по-сериозно отстраняване на грешки в мрежата, [`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`), за да избегнете пропускане на важни повиквания. +- Знам за `strace` и `ltrace`. Те могат да бъдат полезни, ако дадена програма се проваля, виси или се срива и вие не знаете защо, или ако искате да получите обща представа за производителността. Обърнете внимание на опцията за профилиране (`-c`) и възможността за прикачване към работещ процес (`-p`). Използвайте опцията за проследяване на дете (`-f`), за да избегнете пропускане на важни повиквания. -- Знайте за `ldd`, за да проверявате споделени библиотеки и т.н. — но [никога не го стартирайте на ненадеждни файлове](http://www.catonmat.net/blog/ldd-arbitrary-code-execution/). +- Знам за `ldd` за проверка на споделени библиотеки и т.н. — но [никога не го стартирайте на ненадеждни файлове](http://www.catonmat.net/blog/ldd-arbitrary-code-execution/). -- Знаете как да се свържете с работещ процес с `gdb` и да получите следите на неговия стек. +- Знайте как да се свържете с работещ процес с `gdb` и вземете следите на стека му. -- Използвайте `/proc`. Понякога е удивително полезно при отстраняване на грешки на живо. Примери: `/proc/cpuinfo`, `/proc/meminfo`, `/proc/cmdline`, `/proc/xxx/cwd`, `/proc/xxx/exe`, `/proc/xxx/fd/` , `/proc/xxx/smaps` (където `xxx` е идентификаторът на процеса или pid). +- Използвайте `/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). +- За по-задълбочени системи и анализи на ефективността вижте `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). +- Провери с каква ОС си `uname` или `uname -a` (обща информация за Unix/ядрото) или `lsb_release -a` (Информация за дистрибуцията на Linux). -- Използвайте `dmesg`, когато нещо се държи наистина смешно (може да са проблеми с хардуера или драйвера). +- Използвайте `dmesg` винаги, когато нещо се държи наистина смешно (може да са проблеми с хардуера или драйвера). -- Ако изтриете файл и той не освободи очакваното дисково пространство, както се съобщава от `du`, проверете дали файлът се използва от процес: -`lsof | grep изтрит | grep "името-на-моят-голям-файл"` +- Ако изтриете файл и той не освободи очакваното дисково пространство, както се съобщава от `du`проверете дали файлът се използва от процес: + `lsof | grep deleted | grep "filename-of-my-big-file"` - -## Едноредови +## Еднолинейни Няколко примера за сглобяване на команди: -- Понякога е изключително полезно, че можете да правите пресичане, обединение и разлика на текстови файлове чрез `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 +- Понякога е изключително полезно, че можете да правите пресичане, обединение и разлика на текстови файлове чрез `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 | по-малко -R -``` +- Красиво отпечатайте два JSON файла, като нормализирате синтаксиса им, след което оцветете и пагинирайте резултата: -- Използвайте `grep . *` за бързо разглеждане на съдържанието на всички файлове в директория (така че всеки ред е съчетан с името на файла), или `head -100 *` (така че всеки файл има заглавие). Това може да бъде полезно за директории, пълни с конфигурационни настройки като тези в `/sys`, `/proc`, `/etc`. + + diff <(jq --sort-keys . < file1.json) <(jq --sort-keys . < file2.json) | colordiff | less -R + +- Използвайте `grep . *` за бързо изследване на съдържанието на всички файлове в директория (така че всеки ред е съчетан с името на файла), или `head -100 *` (така че всеки файл има заглавие). Това може да бъде полезно за директории, пълни с конфигурационни настройки като тези в `/sys`, `/proc`, `/etc`. - Сумиране на всички числа в третата колона на текстов файл (това вероятно е 3 пъти по-бързо и 3 пъти по-малко код от еквивалентен Python): -```ш - awk '{ x += $3 } END { print x }' myfile + +```sh + awk '{ x += $3 } END { print x }' myfile ``` -- За да видите размерите/датите на дърво от файлове, това е като рекурсивен `ls -l`, но е по-лесен за четене от `ls -lR`: -```ш - намирам . -тип f -ls +- За да видите размери/дати на дърво от файлове, това е като рекурсивно `ls -l` но се чете по-лесно от `ls -lR`: + +```sh + find . -type f -ls ``` -– Да приемем, че имате текстов файл, като регистър на уеб сървър, и определена стойност, която се появява на някои редове, като параметър „acct_id“, който присъства в URL адреса. Ако искате да видите колко заявки за всеки `acct_id`: -```ш - egrep -o 'acct_id=[0-9]+' access.log | изрежете -d= -f2 | сортиране | уникален -c | сортиране -rn +- Да кажем, че имате текстов файл, като регистър на уеб сървър, и определена стойност, която се появява на някои редове, като например `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`. +- За да наблюдавате непрекъснато промените, използвайте `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 САЩ - } -``` +```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`: извършва аритметични или булеви операции или оценява регулярни изрази +- `expr`: изпълнява аритметични или булеви операции или оценява регулярни изрази - `m4`: прост макро процесор -- `yes`: отпечата низ много +- `yes`: отпечатайте низ много - `cal`: хубав календар @@ -418,41 +431,41 @@ mkdir празен && rsync -r --изтриване празен/ някои-д - `look`: намира английски думи (или редове във файл), започващи с низ -- `изрязване`, `поставяне` и `съединяване`: манипулиране на данни +- `cut`, `paste` и `join`: манипулиране на данни - `fmt`: форматиране на текстови параграфи -- `pr`: форматиране на текст в страници/колони +- `pr`: форматирайте текста в страници/колони - `fold`: обвиване на редове от текст -- `колона`: форматирайте текстовите полета в подравнени колони или таблици с фиксирана ширина +- `column`: форматирайте текстовите полета в подравнени колони или таблици с фиксирана ширина - `expand` и `unexpand`: конвертиране между раздели и интервали - `nl`: добавете номера на редове -- `seq`: отпечатване на числа +- `seq`: печат на числа - `bc`: калкулатор -- `фактор`: множител цели числа +- `factor`: множител на цели числа - [`gpg`](https://gnupg.org/): криптиране и подписване на файлове -- `toe`: таблица със записи на terminfo +- `toe`: таблица с терминофони -- `nc`: мрежово отстраняване на грешки и пренос на данни +- `nc`: отстраняване на грешки в мрежата и пренос на данни -- `socat`: реле на сокет и пренасочване на tcp порт (подобно на `netcat`) +- `socat`: реле за гнездо и пренасочване на tcp порт (подобно на `netcat`) - [`slurm`](https://github.com/mattthias/slurm): визуализация на мрежовия трафик - `dd`: преместване на данни между файлове или устройства -- `файл`: идентифицира типа на файла +- `file`: идентифицирайте типа на файла -- `дърво`: показване на директории и поддиректории като вложено дърво; като `ls`, но рекурсивно +- `tree`: показва директории и поддиректории като вложено дърво; като `ls` но рекурсивно - `stat`: информация за файла @@ -460,29 +473,29 @@ mkdir празен && rsync -r --изтриване празен/ някои-д - `timeout`: изпълнете команда за определено време и спрете процеса, когато определеното време приключи. -- `lockfile`: създава семафорен файл, който може да бъде премахнат само чрез `rm -f` +- `lockfile`: създайте семафорен файл, който може да бъде премахнат само от `rm -f` -- `logrotate`: завъртане, компресиране и изпращане по пощата. +- `logrotate`: ротиране, компресиране и изпращане на регистрационни файлове. -- `watch`: изпълнява команда многократно, показвайки резултати и/или маркирайки промените +- `watch`: изпълнете команда многократно, като показвате резултатите и/или маркирате промените -- [`when-changed`](https://github.com/joh/when-changed): изпълнява всяка команда, която посочите, когато види файл променен. Вижте също и `inotifywait` и `entr`. +- [`when-changed`](https://github.com/joh/when-changed): изпълнява всяка команда, която посочите, когато види файл променен. Вижте `inotifywait` и `entr` както добре. -- `tac`: печат на файлове в обратен ред +- `tac`: отпечатване на файлове в обратен ред -- `comm`: сравнява сортирани файлове ред по ред +- `comm`: сравнете сортираните файлове ред по ред - `strings`: извлича текст от двоични файлове - `tr`: превод или манипулиране на знаци -- `iconv` или `uconv`: конвертиране за текстови кодировки +- `iconv` или `uconv`: преобразуване за текстови кодировки - `split` и `csplit`: разделяне на файлове -- `sponge`: чете целия вход, преди да го запише, полезно за четене от след това за запис в същия файл, напр., `grep -v нещо някои-файл | гъба някаква пила` +- `sponge`: чете целия вход, преди да го запише, полезно за четене от след това за запис в същия файл, напр. `grep -v something some-file | sponge some-file` -- `units`: преобразуване на единици и изчисления; преобразува стадии на две седмици в twips на мигане (вижте също `/usr/share/units/definitions.units`) +- `units`: преобразуване на единици и изчисления; преобразува стадии на две седмици в туипове на мигане (вижте също `/usr/share/units/definitions.units`) - `apg`: генерира произволни пароли @@ -496,11 +509,11 @@ mkdir празен && rsync -r --изтриване празен/ някои-д - `strace`: отстраняване на грешки в системно повикване -- [`mtr`](http://www.bitwizard.nl/mtr/): по-добро трасиране за мрежово отстраняване на грешки +- [`mtr`](http://www.bitwizard.nl/mtr/): по-добър traceroute за отстраняване на грешки в мрежата - `cssh`: визуална едновременна обвивка -- `rsync`: синхронизиране на файлове и папки през SSH или в локална файлова система +- `rsync`: синхронизирайте файлове и папки през SSH или в локална файлова система - [`wireshark`](https://wireshark.org/) и [`tshark`](https://www.wireshark.org/docs/wsug_html_chunked/AppToolstshark.html): улавяне на пакети и отстраняване на грешки в мрежата @@ -512,21 +525,21 @@ mkdir празен && rsync -r --изтриване празен/ някои-д - `dstat`: полезна системна статистика -- [`glances`](https://github.com/nicolargo/glances): преглед на високо ниво, мулти-подсистема +- [`glances`](https://github.com/nicolargo/glances): високо ниво, преглед на много подсистеми - `iostat`: Статистика за използване на диска -- `mpstat`: статистика за използване на процесора +- `mpstat`: Статистика за използването на процесора - `vmstat`: Статистика за използване на паметта -- `htop`: подобрена версия на top +- `htop`: подобрена версия на топ -- `последно`: хронология на влизанията +- `last`: история на влизане -- `w`: кой е влязъл +- `w`: който е влязъл -- `id`: информация за идентичността на потребител/група +- `id`: информация за самоличност на потребител/група - [`sar`](http://sebastien.godard.pagesperso-orange.fr/): исторически системни статистики @@ -536,7 +549,7 @@ mkdir празен && rsync -r --изтриване празен/ някои-д - `dmesg`: съобщения за грешки при зареждане и системни грешки -- `sysctl`: преглед и конфигуриране на параметрите на ядрото на Linux по време на изпълнение +- `sysctl`: прегледайте и конфигурирайте параметрите на ядрото на Linux по време на изпълнение - `hdparm`: SATA/ATA дискова манипулация/производителност @@ -544,81 +557,79 @@ mkdir празен && rsync -r --изтриване празен/ някои-д - `lshw`, `lscpu`, `lspci`, `lsusb`, `dmidecode`: информация за хардуера, включително CPU, BIOS, RAID, графики, устройства и др. -- `lsmod` и `modinfo`: Списък и показване на подробности за модулите на ядрото. - -- `fortune`, `ddate` и `sl`: хм, добре, зависи дали смятате парните локомотиви и цитатите на Zippy за "полезни" +- `lsmod` и `modinfo`: Избройте и покажете подробности за модулите на ядрото. +- `fortune`, `ddate`, и `sl`: хм, добре, зависи дали смятате парните локомотиви и цитатите на Zippy за "полезни" ## само за macOS -Това са елементи, подходящи *само* за macOS. +Това са подходящи елементи _само_ на macOS. - Управление на пакети с `brew` (Homebrew) и/или `port` (MacPorts). Те могат да се използват за инсталиране на macOS на много от горните команди. -- Копирайте изхода на всяка команда в настолно приложение с `pbcopy` и поставете вход от едно с `pbpaste`. +- Копирайте изхода на всяка команда в настолно приложение с `pbcopy` и поставете вход от един с `pbpaste`. -- За да активирате клавиша Option в macOS Terminal като клавиш alt (като използван в командите по-горе като **alt-b**, **alt-f** и т.н.), отворете Предпочитания -> Профили -> Клавиатура и изберете „Използване на опция като мета ключ“. +- За да активирате клавиша Option в macOS Terminal като клавиш alt (като използвания в командите по-горе като **alt-b**, **alt-f**и т.н.), отворете Предпочитания -> Профили -> Клавиатура и изберете „Използване на опция като мета ключ“. - За да отворите файл с настолно приложение, използвайте `open` или `open -a /Applications/Whatever.app`. -- Прожектор: Търсете файлове с `mdfind` и изброявайте метаданни (като EXIF информация за снимка) с `mdls`. +- Spotlight: Търсене на файлове с `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 е базиран на 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`. +- За да получите информация за изданието на macOS, използвайте `sw_vers`. -## Само за Windows +## Само Windows -Тези елементи са подходящи *само* за Windows. +Тези елементи са подходящи _само_ на Windows. ### Начини за получаване на Unix инструменти под Windows -- Достъп до силата на обвивката на Unix под Microsoft Windows, като инсталирате [Cygwin](https://cygwin.com/). Повечето неща, описани в този документ, ще работят веднага. +- Достъп до силата на обвивката на Unix под Microsoft Windows чрез инсталиране [Cygwin](https://cygwin.com/). Повечето неща, описани в този документ, ще работят веднага. -- В Windows 10 можете да използвате [Подсистема на Windows за Linux (WSL)](https://msdn.microsoft.com/commandline/wsl/about), която предоставя позната Bash среда с помощни програми за командния ред на Unix. +- В 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 инструменти. +- Ако искате да използвате основно инструменти за разработчици на 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 команди и опции на командния ред са налични в тази среда. +- Друга възможност да получите Unix външен вид и усещане под Windows е [Пари в брой](https://github.com/dthree/cash). Обърнете внимание, че само много малко Unix команди и опции на командния ред са налични в тази среда. -### Полезни инструменти от командния ред на Windows +### Полезни инструменти за командния ред на Windows - Можете да изпълнявате и скриптирате повечето задачи за системно администриране на Windows от командния ред, като научите и използвате `wmic`. -- Вградените мрежови инструменти на Windows за команден ред, които може да намерите за полезни, включват `ping`, `ipconfig`, `tracert` и `netstat`. +- Вградените мрежови инструменти на Windows за команден ред, които може да намерите за полезни, включват `ping`, `ipconfig`, `tracert`, и `netstat`. -- Можете да изпълнявате [много полезни задачи на Windows](http://www.thewindowsclub.com/rundll32-shortcut-commands-windows), като извикате командата `Rundll32`. +- Можете да изпълнявате [много полезни задачи за Windows](http://www.thewindowsclub.com/rundll32-shortcut-commands-windows) чрез извикване на `Rundll32` команда. ### Съвети и трикове на Cygwin - Инсталирайте допълнителни Unix програми с мениджъра на пакети на Cygwin. -- Използвайте `mintty` като прозорец на командния ред. +- Използвайте `mintty` като вашия прозорец на командния ред. - Достъп до клипборда на Windows чрез `/dev/clipboard`. -- Стартирайте `cygstart`, за да отворите произволен файл чрез регистрираното приложение. +- Бягай `cygstart` за отваряне на произволен файл чрез регистрираното приложение. - Достъп до системния регистър на Windows с `regtool`. -- Обърнете внимание, че пътят на устройство `C:\` на Windows става `/cygdrive/c` под Cygwin и че `/` на Cygwin се появява под `C:\cygwin` на Windows. Конвертирайте между Cygwin и файлови пътища в стил Windows с `cygpath`. Това е най-полезно в скриптове, които извикват Windows програми. +- Имайте предвид, че 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. +- [страхотна черупка](https://github.com/alebcay/awesome-shell): Подбран списък с инструменти и ресурси на shell. +- [страхотен-osx-команден ред](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): Още команди и инструменти, полезни за правене на наука за данни, от книгата със същото име +- [shellcheck](https://github.com/koalaman/shellcheck): Инструмент за статичен анализ на shell скрипт. По същество мъх за bash/sh/zsh. +- [Имена на файлове и пътища в Shell](http://www.dwheeler.com/essays/filenames-in-shell.html): Тъжно сложните подробности за това как да се обработват правилно имената на файловете в скриптове на обвивката. +- [Data Science в командния ред](http://datascienceatthecommandline.com/#tools): Още команди и инструменти, полезни за правене на наука за данни, от книгата със същото име ## Опровержение -С изключение на много малки задачи, кодът се пише, така че другите да могат да го четат. С властта идва и отговорността. Фактът, че *можете* да направите нещо в Bash, не означава непременно, че трябва! ;) - +С изключение на много малки задачи, кодът се пише, така че другите да могат да го четат. С властта идва и отговорността. Фактът вие _мога_ да направите нещо в Bash не означава непременно, че трябва! ;) ## Разрешително -[![Лиценз на Creative Commons](https://i.creativecommons.org/l/by-sa/4.0/88x31.png)](http://creativecommons.org/licenses/by-sa/4.0/) +[![Creative Commons License](https://i.creativecommons.org/l/by-sa/4.0/88x31.png)](http://creativecommons.org/licenses/by-sa/4.0/) -Това произведение е лицензирано съгласно [Международен лиценз на Creative Commons Attribution-ShareAlike 4.0](http://creativecommons.org/licenses/by-sa/4.0/). +Тази работа е лицензирана под a [Creative Commons Attribution-ShareAlike 4.0 Международен лиценз](http://creativecommons.org/licenses/by-sa/4.0/). From ff2c195165971131a7b33013afc57d5d7e7004f6 Mon Sep 17 00:00:00 2001 From: Angelo II <62988428+AngeloCore@users.noreply.github.com> Date: Sun, 29 Jan 2023 20:04:58 +0200 Subject: [PATCH 3/6] Update README-bg.md --- README-bg.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/README-bg.md b/README-bg.md index 0889abf..9282c41 100644 --- a/README-bg.md +++ b/README-bg.md @@ -4,8 +4,6 @@ # Изкуството на командния ред -_Забележка: Планирам да преработя това и търся нов съавтор, който да ми помогне с разширяването на това в по-изчерпателно ръководство. Въпреки че е много популярен, той може да бъде по-широк и малко по-дълбок. Ако обичате да пишете и сте почти експерт по този материал и желаете да обмислите да помогнете, моля, пуснете ми бележка на josh (0x40) holloway.com. –[jlevy](https://github.com/jlevy), [Холоуей](https://www.holloway.com). Благодаря ти!_ - - [Мета](#meta) - [Основи](#basics) - [Ежедневна употреба](#everyday-use) From b6e4bfab8fc8891bbc20e22913c1de2333dc2323 Mon Sep 17 00:00:00 2001 From: Angelo II <62988428+AngeloCore@users.noreply.github.com> Date: Sun, 29 Jan 2023 20:25:28 +0200 Subject: [PATCH 4/6] Update README-bg.md --- README-bg.md | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/README-bg.md b/README-bg.md index 9282c41..9650539 100644 --- a/README-bg.md +++ b/README-bg.md @@ -1,6 +1,5 @@ 🌍 -*[Č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)* - +_[Č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)_ # Изкуството на командния ред @@ -11,7 +10,7 @@ - [Отстраняване на грешки в системата](#system-debugging) - [Еднолинейни](#one-liners) - [Неясно, но полезно](#obscure-but-useful) -- [само за macOS](#macos-only) +- [Само за macOS](#macos-only) - [Само Windows](#windows-only) - [Повече ресурси](#more-resources) - [Опровержение](#disclaimer) @@ -33,7 +32,7 @@ Обхват: - Това ръководство е както за начинаещи, така и за опитни потребители. Целите са _широчина_ (всичко важно), _специфичност_ (дайте конкретни примери за най-често срещания случай) и _краткост_ (избягвайте неща, които не са от съществено значение, или отклонения, които лесно можете да потърсите другаде). Всеки съвет е важен в дадена ситуация или значително спестява време пред алтернативи. -- Това е написано за Linux, с изключение на "[само за macOS](#macos-only)" и "[Само Windows](#windows-only)" секции. Много от другите елементи се прилагат или могат да бъдат инсталирани на други Unices или macOS (или дори Cygwin). +- Това е написано за Linux, с изключение на "[Само за macOS](#macos-only)" и "[Само Windows](#windows-only)" секции. Много от другите елементи се прилагат или могат да бъдат инсталирани на други Unices или macOS (или дори Cygwin). - Фокусът е върху интерактивния Bash, въпреки че много съвети се отнасят и за други черупки и за общото писане на Bash. - Той включва както "стандартни" Unix команди, така и такива, които изискват инсталиране на специални пакети - стига да са достатъчно важни, за да заслужават включване. @@ -559,7 +558,7 @@ mkdir empty && rsync -r --delete empty/ some-dir && rmdir some-dir - `fortune`, `ddate`, и `sl`: хм, добре, зависи дали смятате парните локомотиви и цитатите на Zippy за "полезни" -## само за macOS +## Само за macOS Това са подходящи елементи _само_ на macOS. @@ -567,7 +566,7 @@ mkdir empty && rsync -r --delete empty/ some-dir && rmdir some-dir - Копирайте изхода на всяка команда в настолно приложение с `pbcopy` и поставете вход от един с `pbpaste`. -- За да активирате клавиша Option в macOS Terminal като клавиш alt (като използвания в командите по-горе като **alt-b**, **alt-f**и т.н.), отворете Предпочитания -> Профили -> Клавиатура и изберете „Използване на опция като мета ключ“. +- За да активирате клавиша Option в macOS Terminal като клавиш alt (като използвания в командите по-горе като **alt-b**, **alt-f** и т.н.), отворете Предпочитания -> Профили -> Клавиатура и изберете „Използване на опция като мета ключ“. - За да отворите файл с настолно приложение, използвайте `open` или `open -a /Applications/Whatever.app`. @@ -615,16 +614,16 @@ mkdir empty && rsync -r --delete empty/ some-dir && rmdir some-dir ## Повече ресурси -- [страхотна черупка](https://github.com/alebcay/awesome-shell): Подбран списък с инструменти и ресурси на shell. -- [страхотен-osx-команден ред](https://github.com/herrbischoff/awesome-osx-command-line): По-задълбочено ръководство за командния ред на macOS. -- [Строг режим](http://redsymbol.net/articles/unofficial-bash-strict-mode/) за писане на по-добри шел скриптове. +- [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. -- [Имена на файлове и пътища в Shell](http://www.dwheeler.com/essays/filenames-in-shell.html): Тъжно сложните подробности за това как да се обработват правилно имената на файловете в скриптове на обвивката. -- [Data Science в командния ред](http://datascienceatthecommandline.com/#tools): Още команди и инструменти, полезни за правене на наука за данни, от книгата със същото име +- [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 не означава непременно, че трябва! ;) +С изключение на много малки задачи, кодът се пише, така че другите да могат да го четат. С властта идва и отговорността. Фактът вие _можете_ да направите нещо в Bash не означава непременно, че трябва! ;) ## Разрешително From f6012acae3b446cc56277b98fa462c2d51c3f072 Mon Sep 17 00:00:00 2001 From: Angelo II <62988428+AngeloCore@users.noreply.github.com> Date: Sun, 29 Jan 2023 20:28:16 +0200 Subject: [PATCH 5/6] Update README-bg.md --- README-bg.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README-bg.md b/README-bg.md index 9650539..04ced81 100644 --- a/README-bg.md +++ b/README-bg.md @@ -1,5 +1,5 @@ 🌍 -_[Č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)_ +_[Български](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)_ # Изкуството на командния ред From 7581e8f9eb117e0b33188ec96ecd0f7fa653196c Mon Sep 17 00:00:00 2001 From: Angelo II <62988428+AngeloCore@users.noreply.github.com> Date: Wed, 1 Feb 2023 20:25:54 +0200 Subject: [PATCH 6/6] fix heading links --- README-bg.md | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/README-bg.md b/README-bg.md index 04ced81..cf25c90 100644 --- a/README-bg.md +++ b/README-bg.md @@ -3,17 +3,17 @@ _[Български](README-bg.md) ∙ [Čeština](README-cs.md) ∙ [Deutsch]( # Изкуството на командния ред -- [Мета](#meta) -- [Основи](#basics) -- [Ежедневна употреба](#everyday-use) -- [Обработка на файлове и данни](#processing-files-and-data) -- [Отстраняване на грешки в системата](#system-debugging) -- [Еднолинейни](#one-liners) -- [Неясно, но полезно](#obscure-but-useful) -- [Само за macOS](#macos-only) -- [Само Windows](#windows-only) -- [Повече ресурси](#more-resources) -- [Опровержение](#disclaimer) +- [Мета](#мета) +- [Основи](#основи) +- [Ежедневна употреба](#ежедневна-употреба) +- [Обработка на файлове и данни](#обработка-на-файлове-и-данни) +- [Отстраняване на грешки в системата](#отстраняване-на-грешки-в-системата) +- [Еднолинейни](#еднолинейни) +- [Неясно, но полезно](#неясно-но-полезно) +- [Само за 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)