Não há forma de distribuição cruzada. No entanto:
- Redhat and friends: Test for /etc/redhat-release, check contents
- Debian: Test for /etc/debian_version, check contents
- Mandriva and friends: Test for /etc/version, check contents
- Slackware: Test for /etc/slackware-version, check contents
Etc. De um modo geral, verifique /etc/*-release
e /etc/*-version
.
Edit: Encontrei um velho (1 + anos) script meu mentindo em torno de que eu devo ter remendado juntos ao longo dos anos (tem um impressionante log CVS voltando 6 anos.) Pode não funcionar mais corretamente como é e não posso ser incomodado em encontrar distros instaladas para testar, mas deve fornecer um bom ponto de partida. Funciona bem no CentOS, Fedora e Gentoo. gyaresu testou com sucesso no Debian Lenny.
#!/bin/bash
get_distribution_type()
{
local dtype
# Assume unknown
dtype="unknown"
# First test against Fedora / RHEL / CentOS / generic Redhat derivative
if [ -r /etc/rc.d/init.d/functions ]; then
source /etc/rc.d/init.d/functions
[ zz'type -t passed 2>/dev/null' == "zzfunction" ] && dtype="redhat"
# Then test against SUSE (must be after Redhat,
# I've seen rc.status on Ubuntu I think? TODO: Recheck that)
elif [ -r /etc/rc.status ]; then
source /etc/rc.status
[ zz'type -t rc_reset 2>/dev/null' == "zzfunction" ] && dtype="suse"
# Then test against Debian, Ubuntu and friends
elif [ -r /lib/lsb/init-functions ]; then
source /lib/lsb/init-functions
[ zz'type -t log_begin_msg 2>/dev/null' == "zzfunction" ] && dtype="debian"
# Then test against Gentoo
elif [ -r /etc/init.d/functions.sh ]; then
source /etc/init.d/functions.sh
[ zz'type -t ebegin 2>/dev/null' == "zzfunction" ] && dtype="gentoo"
# For Slackware we currently just test if /etc/slackware-version exists
# and isn't empty (TODO: Find a better way :)
elif [ -s /etc/slackware-version ]; then
dtype="slackware"
fi
echo $dtype
}
Observe que isso provavelmente funcionará apenas corretamente no Bash. Você poderia reescrevê-lo de outras conchas.
Dito isso, você pode querer testar recursos, não distribuições. Eu não estou mais usando isso simplesmente porque se tornou um fardo de manutenção. É mais fácil confiar em ferramentas e soluções de distribuição cruzada.
Conceitualmente, o que acontece é:
- Pull in a known, "common init script function" type of file. Those are distribution-specific. If it doesn't exist, skip to next distribution check.
- Check the existence of a specific, known-to-exist, often-used and unlikely to be renamed function from that core script. We do that using the
type
Bash builtin. type -t
returns function
if that symbol is a function. We prepend zz
to the output from type -t 2>/dev/null
because if the name isn't defined the output string would be empty and we'd get a syntax error about a missing left hand to the ==
operator. If the name we just checked isn't a function, skip to next distribution check, otherwise we found the distribution type.
- Finally, echo the distribution type so the function output can be easily used in a case .. esac block.
Edite caso você esteja tentando executar isso como um script direto: esse script deve ser originado ou incluído em outros scripts. Ele não produz nada por si próprio se você o executar como está. Para testá-lo, crie-o e invoque a função, por exemplo:
source /path/to/this/script.sh
get_distribution_type
no prompt bash.
Edit: Por favor, note que este script não requer privilégios de root. Eu recomendo que você não o execute como root. Não deve prejudicar nada, mas não há necessidade.
Encontrou um link para um post da lista de discussão relevante no Log do CVS. Deve ser útil ao desembrulhar o espaguete do script de inicialização.