Bash в bash-е, в bash-е, …, в bash-е.

Думаю, всем знакома ситуация, когда, во время компиляции какого-либо ПО, выполнение `./configure` останавливается с сообщением о неудовлетворенной зависимости. И приходится установить что-нибудь еще и не одно, и не только из репозиториев, а еще и скомпилить что-нибудь другое, а там тоже зависимости.

Если всё это делать в одном терминале, то неизбежны: путаница в зависимостях, безуспешное копание в истории ввода и прочие пляски. Можно, конечно, для каждой задачи открывать новую вкладку в терминале или новый терминал, но тут может вмешаться параллельная задача и порядок задач будет нарушен, и открутить его в обратную сторону будет уже очень сложно — опять бардак.

Достаточно давно я выработал для таких случаев очень удобный, на мой взгляд, способ — рекурсивный запуск `bash`. Если для установки или сборки какого-либо приложения требуется установить или собрать что-нибудь другое, то в момент возникновения такой необходимости я запускаю `bash` прямо в этом же терминале. Это можно делать несколько раз, потом выходить из последнего запущенного экземпляра и получать действие, которое потребовало удовлетворить его зависимости предпоследним в истории. Примерно вот так:

lig@host:~/soft/application$ ./configure
Failed
"dependency" required
lig@host:~/soft/application$ bash
lig@host:~/soft/application$ sudo aptitude install dependency
lig@host:~/soft/application$ exit
lig@host:~/soft/application$ ./configure
Success
lig@host:~/soft/application$
Постоянная ссылка на этот кусок кода: http://paste.nophp.ru/e. Код раскрашен с помощью Paste.NoPHP.ru.

Однако, мне всегда не давало покоя, что я не вижу уровень вложенности `bash`. И вот недавно с небольшой посторонней помощью дошел до решения.

Небольшая добавка в `~/.bashrc`, которая добавляет в приглашение командной строки отображение уровня рекурсии начиная с ноля:

if [ -z $recursion ]; then
recursion="0";
export recursion;
else
recursion=$(($recursion+1));
fi;

PS1='$recursion:'$PS1
Постоянная ссылка на этот кусок кода: http://paste.nophp.ru/c. Код раскрашен с помощью Paste.NoPHP.ru.

После добавления этого кода в `~/.bashrc` первый листинг будет выглядеть вот так:

0:lig@host:~/soft/application$ ./configure
Failed
"dependency" required
0:lig@host:~/soft/application$ bash
1:lig@host:~/soft/application$ sudo aptitude install dependency
1:lig@host:~/soft/application$ exit
0:lig@host:~/soft/application$ ./configure
Success
0:lig@host:~/soft/application$
Постоянная ссылка на этот кусок кода: http://paste.nophp.ru/f. Код раскрашен с помощью Paste.NoPHP.ru.

Вот так-то лучше:)