Я просто обновил до Ubuntu 16.10. Почему делает $SHLVL
теперь запустите со значения 2, когда я открою терминал Gnome? Дело было не так в 16,04.
Эта неудачная ошибка была представлена в Ubuntu 16.10.
Для обходного решения удара, см. https://bugs.launchpad.net/ubuntu / + источник/единица / + bug/1707977/comments/3
При запуске приложения, которое не запускает оболочку, но может предоставить Вам доступ к переменным среды, Вы будете видеть, что среда уже содержит SHLVL
со значением 1. Например, я установил и выполнил IDLE3, выполнил import os
и проверил значение os.environ['SHLVL']
, который оказался 1.
Теперь, SHLVL
также установлен и увеличен в сценариях, таким образом, если бы я запустил скрипт удара, содержащий echo $SHLVL
в терминале, я добрался бы 3.
Однако consoles/TTYs все еще имеют SHLVL
из 1, таким образом, преступник должен быть где-нибудь в GUI, запускают процесс. Я не знаю, каково точно это было бы, но моим предположением является Единица. В GNOME Shell, например, этого не происходит. Где-нибудь в том запуске Единицы, сценарий удара, вероятно, присутствует.
Развитие из моего комментария в исходном вопросе (и, это не ответ по сути, так как я не могу ответить, "почему", но я могу проверить, что новое поведение существует):
Это изменение повреждает обратную совместимость. Теперь, неважно, как Вы открываете терминал/удар в человечности, они все запускают в SHLVL=2
, Хотя, я не уверен, является ли это конкретным вопросом Ubuntu, или из-за использования Единицы. Если у Вас, оказывается, есть логика, которая делает что-то определенное, когда родительская оболочка выходит (например, сохраняющий состояние), который никогда не будет теперь выполняться.
(Кроме того, я не уверен, называется ли ~/.bash_logout
в то же время, что и прежде, также. Не уверенный, не может помнить. Непредсказуемость в зависимости от этого поведения - то, почему мы используем пользовательскую логику в зависимости от глубины оболочки. Единственным путем я могу инициировать ~/.bash_logout
, это путем явного выхода из оболочки, запущенной с bash -l
; все другие оболочки удара Ubuntu не являются оболочками входа в систему. Это, возможно, всегда был этот путь.)
В экспериментировании со способами попытаться вывести истинный SHLVL, пытаясь видеть, существует ли другой способ сказать "родителя" по сравнению с подоболочкой, это могло бы работать (проверяющий на человечность, является дополнительным, если это - на самом деле Определенное для единицы <забастовка> ошибка забастовка> функция.)
$ echo $SHLVL
2
$ my_shlvl() {
lsb_release -i | grep -qi ubuntu && pstree -s $ | grep -o bash | wc -l
}
$ export -f my_shlvl
$ my_shlvl
1
$ bash
$ echo $SHLVL
3
$ my_shlvl
2
$ exit
$ my_shlvl
1
Этот <забастовка> взлом забастовка> обходное решение является очень конкретной гну/Linux (например, принимает pstree
, lsb_release
существуют), но afaik эта проблема существует только на подмножестве дистрибутивов Linux (до сих пор, просто человечность; но вероятно другие также, например, монетный двор, и т.д.).
Это не делает действительно, man bash
объясняет, SHLVL Incremented by one each time an instance of bash is started.
К тому времени, когда Вы смотрите $SHLVL
в терминале Gnome, Вы - два уровня глубоко. Если Вы посмотрите $SHLVL
в тексте ( Ctrl-Alt-F1 ) терминал, то он запустится как 1
.
можно отследить прогресс SHLVL
путем добавления этих строк к .bashrc
:
# keep track of the SHLVL values I see.
export SHLVLs="${SHLVLs:='init'}"
SHLVLs="${SHLVLs}:${SHLVL}"