Как я могу окончательно определить, является ли текущая работающая оболочка bash или zsh?
(возможность устранения неоднозначности между дополнительными оболочками является бонусом, но только bash & zsh 100% необходимо)
Я видел несколько способов предположительно сделать это, но у всех есть проблемы (см. Ниже).
Лучшее, что я могу придумать, - это запустить какой-нибудь синтаксис, который будет работать на одном, а не на другом, а затем проверить ошибки / выходы, чтобы увидеть, какая оболочка работает. Если это лучшее решение, какая команда будет лучшей для этого теста?
Самое простое решение будет, если каждая оболочка включает в себя параметр только для чтения с тем же именем, который идентифицирует оболочку. Однако, если это существует, я не слышал об этом.
Неопределенные способы определения работающей в данный момент оболочки:
# default shell, not current shell
basename "${SHELL}"
# current script rather than current shell
basename "${0}"
# BASH_VERSINFO could be defined in any shell, including zsh
if [ -z "${BASH_VERSINFO+x}" ]; then
echo 'zsh'
else
echo 'bash'
fi
# executable could have been renamed; ps isn't a builtin
shell_name="$(ps -o comm= -p $$)"
echo "${shell_name##*[[:cntrl:][:punct:][:space:]]}"
# scripts can be sourced / run by any shell regardless of shebang
# shebang parsing