Продолжая серию заметок о менее известных функциях 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
Автор: m1rko