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 `