Почему SHLVL первоначально 2 в Ubuntu 16.10 (но не более ранние версии)?

Я просто обновил до Ubuntu 16.10. Почему делает $SHLVL теперь запустите со значения 2, когда я открою терминал Gnome? Дело было не так в 16,04.

2
задан 4 December 2016 в 01:43

4 ответа

Эта неудачная ошибка была представлена в Ubuntu 16.10.

Для обходного решения удара, см. https://bugs.launchpad.net/ubuntu / + источник/единица / + bug/1707977/comments/3

2
ответ дан 2 December 2019 в 02:16

При запуске приложения, которое не запускает оболочку, но может предоставить Вам доступ к переменным среды, Вы будете видеть, что среда уже содержит SHLVL со значением 1. Например, я установил и выполнил IDLE3, выполнил import os и проверил значение os.environ['SHLVL'], который оказался 1.

Теперь, SHLVL также установлен и увеличен в сценариях, таким образом, если бы я запустил скрипт удара, содержащий echo $SHLVL в терминале, я добрался бы 3.

Однако consoles/TTYs все еще имеют SHLVL из 1, таким образом, преступник должен быть где-нибудь в GUI, запускают процесс. Я не знаю, каково точно это было бы, но моим предположением является Единица. В GNOME Shell, например, этого не происходит. Где-нибудь в том запуске Единицы, сценарий удара, вероятно, присутствует.

1
ответ дан 2 December 2019 в 02:16

Развитие из моего комментария в исходном вопросе (и, это не ответ по сути, так как я не могу ответить, "почему", но я могу проверить, что новое поведение существует):

Это изменение повреждает обратную совместимость. Теперь, неважно, как Вы открываете терминал/удар в человечности, они все запускают в 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 (до сих пор, просто человечность; но вероятно другие также, например, монетный двор, и т.д.).

1
ответ дан 2 December 2019 в 02:16

Это не делает действительно, 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}"
0
ответ дан 2 December 2019 в 02:16

Другие вопросы по тегам:

Похожие вопросы: