Подтвердить что ты не робот

Как определить тип оболочки

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

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

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

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

4b9b3361

Ответ 1

Это то, что я использую в своем .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 использует другие файлы при запуске. Любые script, которые вы пишете, не нужно проверять для csh vs Bourne-наследия, потому что вы явно называете интерпретатор в строке shebang.

Ответ 2

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

ps -p $$

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

Ответ 3

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

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

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

Ответ 4

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

shell=`cat /proc/$$/cmdline`;

Ответ 5

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

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

Ответ 6

Это старый поток, но...

В среде 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

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

Ответ 7

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

echo $SHELL

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

set

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

set | less

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

set > set.txt

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

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

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

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