БСмь Π½Π΅ΠΎΠΆΠΈΠ΄Π°Π½Π½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Bash

ΠŸΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Ρ ΡΠ΅Ρ€ΠΈΡŽ Π·Π°ΠΌΠ΅Ρ‚ΠΎΠΊ ΠΎ ΠΌΠ΅Π½Π΅Π΅ извСстных функциях bash, ΠΏΠΎΠΊΠ°ΠΆΡƒ Π²Π°ΠΌ сСмь ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, ΠΎ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π²Ρ‹ ΠΌΠΎΠ³Π»ΠΈ Π½Π΅ Π·Π½Π°Ρ‚ΡŒ.

1) PROMPT_COMMAND

Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π²Ρ‹ ΡƒΠΆΠ΅ Π² курсС, ΠΊΠ°ΠΊ ΠΌΠ°Π½ΠΈΠΏΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈΠ³Π»Π°ΡˆΠ΅Π½ΠΈΠ΅ΠΌ prompt, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ Ρ€Π°Π·Π»ΠΈΡ‡Π½ΡƒΡŽ ΠΏΠΎΠ»Π΅Π·Π½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ, Π½ΠΎ Π½Π΅ всС Π·Π½Π°ΡŽΡ‚, Ρ‡Ρ‚ΠΎ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· ΠΏΡ€ΠΈ ΠΏΠΎΠΊΠ°Π·Π΅ ΠΏΡ€ΠΈΠ³Π»Π°ΡˆΠ΅Π½ΠΈΡ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ.

На самом Π΄Π΅Π»Π΅ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ слоТныС манипуляторы prompt ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ эту ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ для сбора ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ, которая отобраТаСтся Π² ΠΏΡ€ΠΈΠ³Π»Π°ΡˆΠ΅Π½ΠΈΠΈ.

ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠΉΡ‚Π΅ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ это Π² Π½ΠΎΠ²ΠΎΠΌ шСллС, ΠΈ ΡƒΠ²ΠΈΠ΄ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Ρ‘Ρ‚ с сСссиСй:

$ PROMPT_COMMAND='echo -n "writing the prompt at " && date'

2) HISTTIMEFORMAT

Если Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ history Π² консоли, Π²Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ список ΠΊΠΎΠΌΠ°Π½Π΄, Ρ€Π°Π½Π΅Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Π½Ρ‹Ρ… ΠΏΠΎΠ΄ вашСй ΡƒΡ‡Ρ‘Ρ‚Π½ΠΎΠΉ записью.

$ HISTTIMEFORMAT='I ran this at: %d/%m/%y %T '

Как Ρ‚ΠΎΠ»ΡŒΠΊΠΎ установлСна эта пСрСмСнная, Π½ΠΎΠ²Ρ‹Π΅ записи Π·Π°ΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ врСмя вмСстС с ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ, поэтому Π²Ρ‹Π΄Π°Ρ‡Π° Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ Ρ‚Π°ΠΊ:

1871  I ran this at: 01/05/19 13:38:07 cat /etc/resolv.conf
1872  I ran this at: 01/05/19 13:38:19 curl bbc.co.uk
1873  I ran this at: 01/05/19 13:38:41 sudo vi /etc/resolv.conf
1874  I ran this at: 01/05/19 13:39:18 curl -vvv bbc.co.uk
1876  I ran this at: 01/05/19 13:39:25 sudo su -

Π€ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ соотвСтствуСт символам ΠΈΠ· man date.

3) CDPATH

Π§Ρ‚ΠΎΠ±Ρ‹ ΡΡΠΊΠΎΠ½ΠΎΠΌΠΈΡ‚ΡŒ врСмя Π² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строкС, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ эту ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ для измСнСния ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ² Ρ‚Π°ΠΊ ΠΆΠ΅ Π»Π΅Π³ΠΊΠΎ, ΠΊΠ°ΠΊ Π²Ρ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹.

Как ΠΈ PATH, пСрСмСнная CDPATH прСдставляСт собой список ΠΏΡƒΡ‚Π΅ΠΉ, Ρ€Π°Π·Π΄Π΅Π»Ρ‘Π½Π½Ρ‹Ρ… Π΄Π²ΠΎΠ΅Ρ‚ΠΎΡ‡ΠΈΠ΅ΠΌ. Когда Π²Ρ‹ запускаСтС ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ cd с ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ ΠΏΡƒΡ‚Ρ‘ΠΌ (Ρ‚.Β Π΅. Π±Π΅Π· слэша Π² Π½Π°Ρ‡Π°Π»Π΅), ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠ° ΠΈΡ‰Π΅Ρ‚ Π² вашСй локальной ΠΏΠ°ΠΏΠΊΠ΅ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ ΠΈΠΌΠ΅Π½Π°. CDPATH Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΊΠ°Ρ‚ΡŒ Π² путях, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹ Π΄Π°Π»ΠΈ для ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°, ΠΊΡƒΠ΄Π° Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ.

Если ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ CDPATH Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

$ CDPATH=/:/lib

Π° Π·Π°Ρ‚Π΅ΠΌ ввСсти:

$ cd /home
$ cd tmp

Ρ‚ΠΎ Π²Ρ‹ всСгда ΠΏΠΎΠΏΠ°Π΄Ρ‘Ρ‚Π΅ Π² /tmp нСзависимо ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, Π³Π΄Π΅ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚Π΅ΡΡŒ.

Однако остороТно, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Ссли Π½Π΅ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Π² спискС Π»ΠΎΠΊΠ°Π»ΡŒΠ½ΡƒΡŽ (.) ΠΏΠ°ΠΏΠΊΡƒ, Ρ‚ΠΎ Π²Ρ‹ Π½Π΅ смоТСтС ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π»ΡŽΠ±ΡƒΡŽ Π΄Ρ€ΡƒΠ³ΡƒΡŽ ΠΏΠ°ΠΏΠΊΡƒ tmp ΠΈ ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ ΠΊ Π½Π΅ΠΉ, ΠΊΠ°ΠΊ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ:

$ cd /home
$ mkdir tmp
$ cd tmp
$ pwd
/tmp

Упс!

Π­Ρ‚ΠΎ ΠΏΠΎΡ…ΠΎΠΆΠ΅ Π½Π° ΠΏΡƒΡ‚Π°Π½ΠΈΡ†Ρƒ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ я почувствовал, ΠΊΠΎΠ³Π΄Π° понял, Ρ‡Ρ‚ΠΎ локальная ΠΏΠ°ΠΏΠΊΠ° Π½Π΅ Π±Ρ‹Π»Π° Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Π° Π² Π±ΠΎΠ»Π΅Π΅ Π·Π½Π°ΠΊΠΎΠΌΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ PATH… Π½ΠΎ Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ это Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ PATH, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ вас ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΠ±ΠΌΠ°Π½ΡƒΡ‚ΡŒ, запустив Ρ„Π΅ΠΉΠΊΠΎΠ²ΡƒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ ΠΈΠ· ΠΊΠ°ΠΊΠΎΠ³ΠΎ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ скачанного ΠΊΠΎΠ΄Π°.

Моя устанавливаСтся Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ:

CDPATH=.:/space:/etc:/var/lib:/usr/share:/opt

4) SHLVL

Π’Ρ‹ ΠΊΠΎΠ³Π΄Π°-Π½ΠΈΠ±ΡƒΠ΄ΡŒ Π·Π°Π΄ΡƒΠΌΡ‹Π²Π°Π»ΠΈΡΡŒ, Π²Π²ΠΎΠ΄ exit Π²Ρ‹Π²Π΅Π΄Π΅Ρ‚ вас ΠΈΠ· Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ bash Π² Π΄Ρ€ΡƒΠ³ΡƒΡŽ Β«Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΡƒΡŽΒ» ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΡƒ ΠΈΠ»ΠΈ просто ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ Π·Π°ΠΊΡ€ΠΎΠ΅Ρ‚ ΠΎΠΊΠ½ΠΎ консоли?

Π­Ρ‚Π° пСрСмСнная отслСТиваСт, насколько Π³Π»ΡƒΠ±ΠΎΠΊΠΎ Π²Ρ‹ Π²Π»ΠΎΠΆΠ΅Π½Ρ‹ Π² ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΡƒ bash. Если ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹ΠΉ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π», Ρ‚ΠΎ ΠΎΠ½ установлСн Π½Π° 1:

$ echo $SHLVL
1

Π—Π°Ρ‚Π΅ΠΌ, Ссли Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΎΠΉ процСсс ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ, число увСличиваСтся:

$ bash
$ echo $SHLVL
2

Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ Π² скриптах, Π³Π΄Π΅ Π²Ρ‹ Π½Π΅ ΡƒΠ²Π΅Ρ€Π΅Π½Ρ‹, слСдуСт Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΈΠ»ΠΈ Π½Π΅Ρ‚, ΠΈΠ»ΠΈ ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Ρ‚ΡŒ, Π³Π΄Π΅ Π²Ρ‹ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚Π΅ΡΡŒ ΠΏΠΎ влоТСнности.

5) LINENO

Π’Π°ΠΊΠΆΠ΅ для Π°Π½Π°Π»ΠΈΠ·Π° Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ состояния ΠΈ ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ ΠΏΠΎΠ»Π΅Π·Π½Π° пСрСмСнная LINENO, которая сообщаСт количСство ΠΊΠΎΠΌΠ°Π½Π΄, Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Π½Ρ‹Ρ… Π² сСансС ΠΊ настоящСму ΠΌΠΎΠΌΠ΅Π½Ρ‚Ρƒ:

$ bash
$ echo $LINENO
1
$ echo $LINENO
2

Π­Ρ‚ΠΎ Ρ‡Π°Ρ‰Π΅ всСго ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΏΡ€ΠΈ ΠΎΡ‚Π»Π°Π΄ΠΊΠ΅ скриптов. Вставляя Ρ‚Π°ΠΊΠΈΠ΅ строки, ΠΊΠ°ΠΊ echo DEBUG:$LINENO, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ быстро ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ, Π³Π΄Π΅ Π² скриптС Π²Ρ‹ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚Π΅ΡΡŒ (ΠΈΠ»ΠΈ Π½Π΅Ρ‚).

6) REPLY

Если, ΠΊΠ°ΠΊ я, Π²Ρ‹ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΏΠΈΡˆΠ΅Ρ‚Π΅ Ρ‚Π°ΠΊΠΎΠΉ ΠΊΠΎΠ΄:

$ read input
echo do something with $input

Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΡ‚Π°Ρ‚ΡŒ ΡΡŽΡ€ΠΏΡ€ΠΈΠ·ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ Π²ΠΎΠΎΠ±Ρ‰Π΅ Π±Π΅ΡΠΏΠΎΠΊΠΎΠΈΡ‚ΡŒΡΡ ΠΎ создании ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ:

$ read
echo do something with $REPLY

Π­Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ Ρ‚ΠΎ ΠΆΠ΅ самоС.

7) TMOUT

Π§Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ ΠΎΡΡ‚Π°Π²Π°Ρ‚ΡŒΡΡ Π½Π° производствСнных сСрвСрах слишком Π΄ΠΎΠ»Π³ΠΎ Π² цСлях бСзопасности ΠΈΠ»ΠΈ случайно Π½Π΅ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Ρ‡Ρ‚ΠΎ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ опасноС Π² Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠΌ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π΅, Ρ‚ΠΎ установка этой ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ дСйствуСт ΠΊΠ°ΠΊ Π·Π°Ρ‰ΠΈΡ‚Π°.

Если Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ вводится Π² Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠ΅ установлСнного количСства сСкунд, происходит Π²Ρ‹Ρ…ΠΎΠ΄ ΠΈΠ· ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ.

Π’ΠΎ Π΅ΡΡ‚ΡŒ это Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π° sleep 1 && exit:

$ TMOUT=1

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ