Как мне определить тип моей оболочки? - PullRequest
20 голосов
/ 02 марта 2011

Как я могу определить тип моей оболочки?то есть будь то традиционный sh, bash, ksh, csh, zsh и т. д.

Обратите внимание, что проверка $SHELL или $0 не будет работать, поскольку $SHELL не устанавливается всеми оболочками, поэтому есливы начинаете в одной оболочке, а затем запускаете другую, у вас может быть старая $SHELL.

$0 только сообщает вам, где находится бинарный файл оболочки, но не сообщает, является ли /bin/shнастоящая оболочка Bourne или bash.

Я предполагаю, что ответом будет «попробуй некоторые функции и посмотри, что ломается», так что если кто-нибудь может указать мне на скрипт, который это делает, это было бы здорово.

Ответы [ 7 ]

22 голосов
/ 16 мая 2011

Это то, что я использую в моем .profile:

# .profile is sourced at login by sh and ksh. The zsh sources .zshrc and
# bash sources .bashrc. To get the same behaviour from zsh and bash as well
# I suggest "cd; ln -s .profile .zshrc; ln -s .profile .bashrc".
# Determine what (Bourne compatible) shell we are running under. Put the result
# in $PROFILE_SHELL (not $SHELL) so further code can depend on the shell type.

if test -n "$ZSH_VERSION"; then
  PROFILE_SHELL=zsh
elif test -n "$BASH_VERSION"; then
  PROFILE_SHELL=bash
elif test -n "$KSH_VERSION"; then
  PROFILE_SHELL=ksh
elif test -n "$FCEDIT"; then
  PROFILE_SHELL=ksh
elif test -n "$PS3"; then
  PROFILE_SHELL=unknown
else
  PROFILE_SHELL=sh
fi

. Он не проводит четких различий между ksh88, ksh95, pdksh или mksh и т. Д., Но за более чем десять лет он доказалработать для меня, как задумано, на всех системах, на которых я был дома (BSD, SunOS, Solaris, Linux, Unicos, HP-UX, AIX, IRIX, MicroStation, Cygwin.)

Я не вижунужно проверить csh в .profile, так как csh при запуске получает другие файлы.Любой сценарий, который вы пишете, не нуждается в проверке csh против Bourne-наследия, потому что вы явно указываете имя переводчика в строке shebang.

14 голосов
/ 02 марта 2011

Попробуйте найти путь оболочки, используя текущий PID оболочки:

ps -p $$

Должен работать как минимум с sh, bash и ksh.

5 голосов
/ 02 марта 2011

Если причина, по которой вы спрашиваете, состоит в том, чтобы попытаться написать переносимый код оболочки, то определение типа оболочки и переключение на ее основе - ненадежная стратегия. Возможны слишком большие вариации.

В зависимости от того, что вы здесь делаете, вы можете посмотреть соответствующую часть документации autoconf . Это включает в себя интересную (а в некоторых отношениях весьма мрачную) зоологию различных аберраций оболочки.

Для переносимого кода этот раздел должен быть очень полезным. Если вам нужно определить варианты оболочки, возможно, в autoconf похоронен некоторый код (или, по крайней мере, в одном из генерируемых им скриптов ./configure), который поможет с прослушиванием.

3 голосов
/ 02 марта 2011

Вы можете использовать что-то вроде этого:

shell=`cat /proc/$$/cmdline`;
0 голосов
/ 10 февраля 2016

Это старая тема, но ...

В среде GNU Вы можете sh --help и получить что-то вроде

BusyBox v1.23.2 (2015-04-24 15:46:01 GMT) multi-call binary.

Usage: sh [-/+OPTIONS] [-/+o OPT]... [-c 'SCRIPT' [ARG0 [ARGS]] / FILE [ARGS]]

Unix shell interpreter

Итак, первая строка - это тип оболочки =)

0 голосов
/ 20 апреля 2014

Системная оболочка - это то, что вы видите, когда открываете новое окно терминала, для которого не установлено ничего, кроме bash (при условии, что это ваше значение по умолчанию SHELL).

echo $SHELL

Как правило,Вы можете узнать все константы, определенные с помощью команды

set

Если на выходе много информации, выполните команду

set | less

так что вы можете прокрутить его из верхней части командной строки или

set > set.txt

Чтобы сохранить вывод в файл.

Вызов другой интерактивной оболочки для bash вваш терминал не означает , что ваша системная оболочка заменена на что-то другое, т.е. ваша системная оболочка настроена на bash, хотя вы вызываете оболочку csh из оболочки bash только в этом одном сеансе.

Выше означает, что ввод /bin/csh или /bin/python в bash или что-то еще не устанавливает системную оболочку для той оболочки, которую вы вызвали.

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

0 голосов
/ 02 марта 2011

О, у меня была эта проблема. : D

Существует быстрый взлом, используйте команду ps -p $$, чтобы вывести список процесса с PID текущего запущенного процесса - это ваша ОБОЛОЧКА. Это возвращает структуру таблицы строк, если вы хотите, вы можете AWK или SED оболочки ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...