Собственно сабж. Конечно из самого шелла. И для разных шеллов. bash, ksh, zsh, csh, tcsh или просто sh что есть линк как правило. У bash есть переменная BASHOPTS в которой можно вытянуть login_shell. Еще можно проверить $0 которая выдаст или bash, или -bash. А как на счет interactive/non-interactive?
Я это к тому, что все шеллы после вызова потом смотрят в /etc/profile.d/*.[tczk]sh. Поэтому там уже нужно разделять login/non-login, interactive/non-interactive shells где соответственно определяются свои переменные.