Как определить тип оболочки
Как я могу определить тип оболочки? т.е. традиционно ли это sh, bash, ksh, csh, zsh и т.д.
Обратите внимание, что проверка $SHELL
или $0
не будет работать, потому что $SHELL
не задается всеми оболочками, поэтому, если вы запустите в одной оболочке, а затем запустите другую, у вас может быть старый $SHELL
.
$0
сообщает только, где находится бинарный файл оболочки, но не говорит вам, является ли /bin/sh
реальной оболочкой Bourne или bash.
Я предполагаю, что ответ будет "попробовать некоторые функции и посмотреть, что происходит", поэтому, если кто-нибудь может указать мне на script, который сделает это, это будет здорово.
Ответы
Ответ 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, вам нужно установить ее на что-то еще. В случае успеха вы увидите новую оболочку всякий раз, когда вы открываете новый терминал...