Сем нечаканых зменных 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

Дадаць каментар