BASH Shell dir stack and the shell path hash

Искам да споделя малко открития относно BASH и Unix shell-овете.
Наскоро разцъквах малко FreeBSD където default-ния shell e C shell. При
него когато инсталираш нова бинарка на системата, за да се ползва, е нужно
ръчно да си препрочете shell path-a, което става с rehash builtin-a.

Оказа се, че и в BASH им builtin с подобно име и цел, но действа по различен начин –
кешира в един масив външните бинарки, които сме викали от shell path-a в
рамките на настоящия интерактивен shell.

Възможно е когато пуснем нова команда BASH да
търси първо в него преди да започне да търси в директориите от shell path-a.

За да се възползваме от тази функционалност, е нужно да включим checkhash опцията на shell-a. Можем да го направим със shopt builtin-a:

shopt -s checkhash

Добавил съм този ред в своя ~/.bashrc.

Хеширането на извиканите външни бинарки може да се disable-не напълно чрез set builtin-a, но по подразбиране е включен. Вградения variable $- съдържа включените shell options, които можем да манипулираме със set. Щом буквата h присъства в този стринг, значи hashing-a е включен.

Когато пуснете hash builtin-а без аргументи може да го видите, също и по
колко пъти вече сте ползвали тези команди в настоящия interactive shell.
С hash -r може да изтриете командите от масива.

Друго нещо, което чак сега открих как работи е dir stack-a и pushd и popd
builtin-ите. От известно време знам за тях, но чак сега схванах за какво
иде реч. Първото ми сблъскване с понятието стек всъщност.

С pushd може да добавяте нови директории в дирстек-а. С popd сменяте working directory-то на shell-a на последната директория и я махате от стека.
Съответно с dirs (ползвам следната опция за четимост: dirs -v ) можете да видите директориите в dir stack-a.

С cd и tilde expansion можете да се придвижите до някоя директория по-долу в stack-a:
[cvetomir@laptop:nginx]$ dirs -v
0 /etc/nginx
1 /etc/postgresql
2 /var/log
3 ~
[cvetomir@laptop:nginx]$ cd ~1
./ 9.4/ ../
[cvetomir@laptop:postgresql]$

Leave a Reply

Your email address will not be published. Required fields are marked *