tag: #N/S/Well #N/T/Linux #N/T/Tool/Util #N/T/Public/Candidate 2021-08-01 13:41, [Source](https://habr.com/ru/company/ruvds/blog/325522/), [15 Bash trics](https://www.bitarray.io/15-cool-bash-tricks/) Related: [[]], Docs: [docs](https://habr.com/ru/company/ruvds/blog/325522/) Related: [[% Mosh]], [[Обозначение события bash]], [[bash funny utils]] , [[Служебные символы используемые в shell скриптах]], ## Bash  Это командная оболочка Unix, которая помогает взаимодействовать с операционной системой с помощью простых команд. Чаще всего Bash используется в Linux, но её можно установить и на другие операционные системы. В Bash встроено большое количество команд, которые сильно упрощают работу с компьютером ### Помощь [[% сhe]] [[% tldr]] #T/T/To/Read https://habr.com/ru/companies/ruvds/articles/325522/ #### Готовые снипеты кода на баш для visual studio https://github.com/yousefvand/shellman https://github.com/yousefvand/shellman/blob/master/COMMANDS.md ### Полезные макросы и скрипты ##### Быстрый бекап файла из последнего аргумента, последней команды ```bash install -Dv !$ ~/BackUps!$-`date +%Y%m%d-%T.bk`; ``` не работает на некоторых системах ```bash mkdir -p ~/BackUps/ & cp $_ ~/BackUps/$_-`date +%Y%m%d-%T.bk`; ``` не работает для полного пути ```bash mkdir -p ~/BackUps && cp !$ ~/BackUps!$-`date +%Y%m%d-%T.bk`; ``` #### [[% grep]] ![[% grep#Очистка файла от коментариев и пустых строк]] ![[% grep#Греп нескольких фраз и ошибок]] ![[% mail#Макросдля отправки тестового письма из консоли]] ![[% mtr#mtr для анализа tcp в риал тайме]] ![[% mtr#Записать вывод mtr в файл]] ![[% nmap#Проверка доступности потчтовых портов]] ![[% tmux#Подключиться к именной сессии тмукс если ее нет то создать]] ![[% tmux#Создать несколько разделенных окон и запустить в них команды мониторинга стандартных почтовых логов]] ##### dir size from andrey #T/T/To/Do/Note ```bash dirsize() { du -shx * .[a-zA-Z0-9_]* 2> /dev/null | egrep '^ *[0-9.]*[MG]' | sort -n > /tmp/list egrep '^ *[0-9.]*M' /tmp/list egrep '^ *[0-9.]*G' /tmp/list rm -rf /tmp/list } ``` ##### Собрать историю из нескольких терминалов ```bash shopt -s histappend ``` ##### Посмотреть частоту процессора [src](https://unix.stackexchange.com/questions/264632/what-is-the-correct-way-to-view-your-cpu-speed-on-linux) ```bash watch -n1 "grep \"^[c]pu MHz\" /proc/cpuinfo" ``` This displays the `cpu speed` of each core in real time. ##### TMOUT To Automatically Log Users Out https://www.cyberciti.biz/faq/linux-tmout-shell-autologout-variable/ [src2](https://blog.sedicomm.com/2018/06/14/tmout-avtomaticheskij-vyhod-s-linux-obolochki-v-sluchae-bezdejstviya-polzovatelya/) edit your [~/.bash_profile](https://bash.cyberciti.biz/guide/.bash_profile) or [/etc/profile](https://bash.cyberciti.biz/guide//etc/profile) file as follows to define a 5 minute idle time out: ```bash # set a 5 min timeout policy for bash shell TMOUT=300 readonly TMOUT export TMOUT ``` o disable auto-logout, just set the TMOUT to zero or unset it as follows: How Do I Disable TMOUT? To disable auto-logout, just set the TMOUT to zero or unset it as follows: ```bash $ export TMOUT=0 # OR $ unset TMOUT ```` Please note that readonly variable can only be disabled by root user in /etc/profile or ~/.bash_profile. #### Алиасы ##### Добавить алиас ```sh alias alias_name="command_to_run" ``` ##### Анти-алиас для запуска одноименной с алиасом команды, в оригинальном варианте, добавтье перед командой обратную косую черту ```bash \ls ``` ##### CDPATH для установки базовых каталогов для быстрого переключения Например, представьте, что вы делаете много переходов в подкаталоги в нескольких каталогах. Чтобы время от времени не вводить или вставлять длинные пути к каталогам при работе с разрозненными каталогами, установите CDPATH для этих базовых каталогов и получите доступ к их подкаталогам, как если бы все они находились в каком-то виртуальном рабочем каталоге: ```bash $ CDPATH='/home/dan/jdk1.8.0_201' ``` Чтобы перейти к '/home/dan/jdk1.8.0_201/bin' , запустите: ```bash $ cd bin # не нужно указывать полный путь ``` #### Сочетание клавиш https://habr.com/ru/companies/lanit/articles/537596/ #T/T/To/Do/Note ##### для очистки экрана терминала POSIX-совместимая команда для очистки экрана терминала — `tput clear` . Более короткая команда `clear` Еще более коротки метод — комбинация клавиш: `Ctrl + l` ##### Перемещение "курсора" в начало строки Предположим, мы только что перечислили файл с помощью команды ls и теперь хотим проверить этот файл. Или мы хотим добавить sudo к ранее запущенной команде. Нажмите клавишу со стрелкой вверх , чтобы подготовить предыдущую командную строку для редактирования и запуска в следующий раз. Чтобы переместить точку вставки в начало редактируемой командной строки, введите комбинацию клавиш: `Ctrl + А` или отдельная кнопка `home` (на некоторых ноутбучных клавиатурах `fn + Стрелка влево`) ##### Сделать заглавной букву под точкой вставки в командной строке Когда точка вставки находится на букве, которую нужно сделать заглавной, используйте комбинацию клавиш: `alt + c` Она также перемещает курсор, в конец изменяемого слова. ### Теория Bash #### Регулярки ##### Чтобы выбрать файлы, имеющие общее расширение в каталоге. ```bash ls {аа, b1, c2, объявление}.sh ``` эта команда интерпретируется в ```bash ls aa.sh b1.sh c2.sh ad.sh ``` ##### Запустить новую команду с теми-же аргументами После команды `cat a1 b1` Запускаем: ```bash ^cat^ls ``` Что эквивалентно: `ls a1 b1` Этот трюк очень полезен, почти спасает жизнь, когда вы пишете такой скрипт, в котором сначала вы проверяете, существует ли конкретный файл, а затем читаете или выполняете этот файл, если он существует. #### Переменные и Подстановка команд | variables and command substitution http://www.compciv.org/topics/bash/variables-and-substitution/ Одна из самых полезных возможностей bash-скриптов — это возможность извлекать информацию из вывода команд и назначать её переменным, что позволяет использовать эту информацию где угодно в файле сценария. Сделать это можно двумя способами. - С помощью значка обратного апострофа «`» проследите за тем, чтобы вместо обратного апострофа не ввести одиночную кавычку. Команду нужно заключить в два таких значка: ```bash mydir=`pwd` ``` - С помощью конструкции `$()` ```bash mydir=$(pwd) ``` `$()` - гораздо более чистый подход по сравнению с обратными кавычками с `` . См. пример ниже: ```bash #using ` pair, \` pair and \\\` pair for escaping echo `echo \`echo \\\`echo inside\\\`\“ #using $( and ) for nesting echo $(echo $(echo $(echo inside))) ``` ##### To do basic calculations, you can enclose an expression inside `$(( ))`: ``` user@host:~$ echo "42 - 10 is...$(( 42 - 10))" 42 - 10 is...32 ``` ##### The internal field separator [src](http://www.compciv.org/topics/bash/variables-and-substitution/) The global variable `IFS` is what Bash uses to split a string of expanded into separate _words_… By default, the `IFS` variable is set to three characters: **newline**, **space**, and the **tab**. ```bash user@host:~$ IFS=Z user@host:~$ story="The man named Zorro rides a Zebra" user@host:~$ echo '>>' $story '<<' >> The man named orro rides a ebra << ``` The upshot is that you may see code snippets online in which the `IFS` variable is changed to something like `\n'` (which stands for the **newline** character). #### [[Конвеер команд и Потоки ввода-вывода в lunux]] #### Логические операторы Такие условные операторы очень полезны для записи точек принятия решений в сценариях на основе результатов завершенных команд. Примеры включают: ##### Выполняйте вторую команду, только если первая команда выполнена успешно перейти в каталог, только если он существует, и избежать ошибки « _Нет такого файла или каталога »,:_ ```bash mkdir /tmp/abc1 && cd /tmp/abc1 ``` cat-нуть файл, только если он существует, и избежать ошибки « _Нет такого файла или каталога »:_ ```bash $ [ -f filename ] && cat filename ``` Приведенная выше команда сначала проверяет (используя **[]** ), существует ли файл "filename" , и отображает его содержимое, если оно существует. #### Условные операторы (операторы ветвления) https://techrocks.ru/2019/01/21/bash-if-statements-tips/ ```bash if [[ "$some_variable" == "good input" ]]; then echo "You got the right input." elif [[ "$some_variable" == "ok input" ]]; then echo "Close enough" else echo "No way Jose." fi ``` (()) - круглые скобочки для математичесских операторов сравнений `> < = !=` etc \[\[\]\] - Квадратные скообчки используют специальные ключи вместо операторо сравнения `-lt`, `-le`, `-gt`, `-ge`, `-eq`, `-ne` #### Циклы [src](https://routerus.com/bash-while-loop/#:~:text=1%20Number%3A%202-,%D0%91%D0%B5%D1%81%D0%BA%D0%BE%D0%BD%D0%B5%D1%87%D0%BD%D1%8B%D0%B9%20%D1%86%D0%B8%D0%BA%D0%BB%20while,%D1%86%D0%B8%D0%BA%D0%BB%D0%B0.%20%3A%20%D0%B2%D1%81%D0%B5%D0%B3%D0%B4%D0%B0%20%D0%B2%D0%BE%D0%B7%D0%B2%D1%80%D0%B0%D1%89%D0%B0%D0%B5%D1%82%20%D0%B8%D1%81%D1%82%D0%B8%D0%BD%D1%83.) ##### Посчитать от одного до 5-ти ```bash for n in {1..5}; do echo $n; done ``` или от 2-х до 10 в C-подобном стиле ```bash for (( i=2; i<=10; i++ )); do echo $i; done; ``` ##### Запустить команду в бесконечном цикле. ```bash while true; do curl -o /dev/null -s -w "%{http_code}\n" https://me-page.org/ ;done ``` или ```bash while :; do echo 'Press <CTRL+C> to exit.'; sleep 1; done ``` ##### Выполнить скрипт на множестве серверов [src](# [How To Run Multiple SSH Command On Remote Machine And Exit Safely](https://www.cyberciti.biz/faq/linux-unix-osx-bsd-ssh-run-command-on-remote-machine-server/)) [[% ssh#Удаленный Запуск Команд или Скрипта]] ```bash for s in server{1..4}.cyberciti.biz do    ssh root@${s} 'bash -s' < /home/vivek/bin/test.sh done ``` или ```bash for (( i=2; i<=10; i++ )); do ssh -i .ssh/id_rsa -o StrictHostKeyChecking=no vladlen.ch@web$i.site.com "hostname -f && sudo echo result"; done; ``` или ```bash for server in box1 box2 box3 do    ssh -i .ssh/id_rsa -o StrictHostKeyChecking=no user@$server "hostname -f && uptime" done ``` ##### Псотрочное чтение и обработка файла ```bash #!usr/bin/env bash file="temp.txt" #file=$1 while read -r line; do echo -e "$line\n" done <$file ``` Путь к файлу также может быть передан как возможный аругмент скрипта, для этого в скрипте необходимо использовать следующую конструкцию:`file=$1` Пример использования `bash filereader.sh filename` ##### Реализация построчной обработки циклом for ```bash #!usr/bin/env bash file=$(cat temp.txt) for line in $file do echo -e "$line\n" done ``` ##### Проверка спецсимволов  в файле ```bash while read LINE; do if [[ $LINE == *['!'@#\$%^\&*()+]* ]] ; then echo $LINE ; fi ; done < /tmp/may_occur_special_character.txt ``` - [[Служебные символы используемые в shell скриптах]] ##### Переименование файлов в текущем каталоге ```bash for i in `ls`; do mv -- "$i" "$i.eml" ; done ``` ### Шпаргалки #### Посчитать количество строк в файле https://stackoverflow.com/questions/32812916/how-to-delete-the-first-column-which-is-in-fact-row-names-from-a-data-file-in ![[% wc#Показать количество строк в файле]] ![[% sed#Показать количество строк в файле]] ![[% awk#Показать количество строк в файле]] #### Многокомпонентные команды [[% eval]] #### Archive [[% tar]] [[% pigz]] [[% gzip]] [[% pv]] ### Environment bash переменные окружения ```bash printenv ``` #### Что есть `$PATH` в линуксе Переменная `$PATH` [окружения](https://linuxize.com/post/how-to-set-and-list-environment-variables-in-linux/) представляет собой список каталогов, разделенных двоеточием, который сообщает оболочке, в каких каталогах искать исполняемые файлы. Чтобы проверить, какие каталоги находятся в вашем `$PATH`, вы можете использовать команду `printenv` или [`echo`](https://linuxize.com/post/echo-command-in-linux-with-examples/) : Если у вас есть два исполняемых файла с одинаковым именем, расположенные в двух разных каталогах, оболочка запустит файл, который находится в каталоге, который идет первым в `$PATH`. ``` echo $PATH ``` ##### Добавление каталога в ваш `$PATH` Бывают ситуации, когда вы можете захотеть добавить в `$PATH` переменную другие каталоги. Например, некоторые программы могут быть установлены в разных местах, или вы можете захотеть иметь отдельный каталог для ваших личных скриптов, но иметь возможность запускать их без указания абсолютного пути к исполняемым файлам. Для этого вам просто нужно добавить каталог в ваш `$PATH`. Допустим, у вас есть каталог с именем, `bin`расположенный в вашем домашнем каталоге, в котором вы храните свои сценарии оболочки. Чтобы добавить каталог к ​​вашему `$PATH`: ``` export PATH="$HOME/bin:$PATH" ## или для приоритетного поиска export PATH=$PATH:~/opt/bin ## или для не приоритетного поиска (добавляем в конец) export PATH=~/opt/bin:$PATH ``` Команда `export` экспортирует измененную переменную в среду дочернего процесса оболочки. Теперь вы можете запускать свои скрипты, введя имя исполняемого скрипта без необходимости указывать полный путь к файлу. > [!note] > это изменение носит временный характер и действует только в текущем сеансе оболочки. Чтобы сделать изменение постоянным, вам нужно определить `$PATH` переменную, в файлах конфигурации оболочки. В большинстве дистрибутивов Linux при запуске нового сеанса переменные среды считываются из следующих файлов: - Глобальные файлы конфигурации оболочки, такие как `/etc/environment`и `/etc/profile`. Используйте этот файл, если вы хотите, чтобы новый каталог был добавлен для всех пользователей системы `$PATH`. - Конфигурационные файлы оболочки для каждого пользователя. Например, если вы используете Bash, вы можете установить `$PATH`переменную в `~/.bashrc`файле. Если вы используете Zsh, имя файла `~/.zshrc`. Сохраните файл и загрузите новый `$PATH` в текущий сеанс оболочки с помощью[`source`](https://linuxize.com/post/bash-source-command/) команды: ``` source ~/.bashrc ``` ## Используемые или важные ключи. ### Файлы