Почему echo $0 отображает оболочку по умолчанию даже после ее изменения?

К сожалению, текущая версия стандартов POSIX sh не предлагает ни официального флага командной строки, ни переменной среды для надежного доступа к версии оболочки.

К счастью, есть обходные пути. Можно попробовать поставить --versionв оболочку для большинства производных bash (, кроме dash и posh ). Илиecho "$BASH_VERSION"(баш ),echo "$ZSH_VERSION"(зш ),echo "${.sh.version}"(кш ).

Некоторые пакеты различают версии в имени двоичного файла, например, имя приложения командной строки Python v3 python3. Возможно, имя текущего процесса оболочки включает в себя основную версию или двоичный путь оболочки, такой как /bin/sh, ссылается на более конкретный путь, такой как /bin/bash4.4.12. К сожалению, это соглашение не дошло до крошечного сообщества разработчиков оболочки, поэтому вряд ли эти проверки дадут полезные результаты.

Тем не менее, система упаковки может представить номер версии рассматриваемого пакета оболочки. Итак, запуститеdpkg -l <shell>(производные Debian ),yum -l <shell>(производные RHEL ),emerge -Opv <shell>(Gentoo ),pacman -Qi dash(Arch ),brew list dash(Homebrew )и так далее. Если речь идет о оболочке sh, то эта оболочка, скорее всего, предоставляется пакетом coreutils, поэтому запросите у диспетчера пакетов coreutils, а не sh.

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

Наконец, оболочка может быть просто предоставлена ​​операционной системой, поэтому uname -a; cat /etc/*release*может предоставляться хотя бы какой-то идентификатор для отслеживания версии оболочки.

Если все эти команды соединить точкой с запятой в скрипте, можно было бы получить достаточно всеобъемлющий инструмент грубой силы, похожий на nmap -, для определения версии данной оболочки.

-2
03.01.2020, 04:55
2 ответа

Как указал kaylum , вы все еще находитесь в той же пользовательской среде.

Чтобы обновить его, вы должны выйти и снова войти в систему или, если хотите, используйте команду suдля повторного -входа без потери текущего сеанса:

su - $USER

Тогда ваш echo $0будет работать правильно.

после того, как вы выйдете из этого сеанса с помощью exit, вы снова окажетесь в предыдущем.

1
28.01.2020, 05:15

До сих пор ни в одном ответе или комментарии явно не говорилось, что на самом деле делает chsh.

Кажется, вы думаете, что chshменяет текущую оболочку. Нет. Он только изменяет некоторую запись, которая сообщает ОС, какая оболочка является вашей оболочкой входа в систему. Запись засчитывается, когда ваша оболочка входа в систему вот-вот будет запущена. Текущая оболочка (или любая другая уже запущенная оболочка )остается неизменной :, она не трансформируется в другую оболочку, не уничтожается и не заменяется другой оболочкой.

Такие решения, как «выйти из системы и снова войти в систему», работают, потому что после повторного входа в систему вы получаете доступ к выбранной вами оболочке входа. Любая команда, которая проверяет, какая у вас оболочка входа в систему, и запускает ее (, в отличие от запуска какой-либо фиксированной оболочки, независимой от вашего выбора ), может быть решением. suв этот другой ответ является такой командой.

2
28.01.2020, 05:15

Теги

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