Řešení 1:
Neexistuje žádný způsob křížové distribuce. Nicméně:
- Redhat a přátelé:Test na
/etc/redhat-release
, zkontrolujte obsah- Debian:Test na
/etc/debian_version
, zkontrolujte obsah- Mandriva a přátelé:Test na
/etc/version
, zkontrolujte obsah- Slackware:Test na
/etc/slackware-version
, zkontrolujte obsah
atd. Obecně řečeno, zkontrolujte /etc/*-release
a /etc/*-version
.
Edit:Našel jsem svůj starý (1+ rok) bash skript, který se povaluje, který jsem musel za ta léta seskládat (má působivý CVS log sahající 6 let zpátky.) Možná už nebude fungovat správně tak, jak je a já můžu Neobtěžujte se hledáním nainstalovaných distribucí k testování, ale mělo by vám to poskytnout dobrý výchozí bod. Funguje dobře na CentOS, Fedoře a Gentoo. gyaresu to úspěšně otestovalo na Debianu 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
}
Všimněte si, že to bude pravděpodobně fungovat správně pouze v Bash. Můžete jej přepsat pro jiné shelly.
Jak již bylo řečeno, možná budete chtít testovat funkce, nikoli distribuce. Už to nepoužívám jen proto, že se to stalo údržbou. Je snazší spolehnout se na nástroje a řešení pro křížovou distribuci.
Koncepčně to dělá v tomto pořadí:
- Natáhněte známý typ souboru „společná funkce inicializačního skriptu“. Ty jsou specifické pro distribuci. Pokud neexistuje, přejděte na další kontrolu distribuce.
- Zkontrolujte existenci konkrétní, známé, často používané a nepravděpodobné funkce přejmenované z tohoto základního skriptu. Děláme to pomocí
type
Bash vestavěný.type -t
vrátífunction
pokud je tento symbol funkcí. Přidámezz
na výstup ztype -t 2>/dev/null
protože pokud název není definován, výstupní řetězec by byl prázdný a dostali bychom chybu syntaxe o chybějící levé ruce na==
operátor. Pokud název, který jsme právě zkontrolovali, není funkcí, přejděte na další kontrolu distribuce, jinak jsme našli typ distribuce.- Nakonec opakujte typ distribuce, aby bylo možné výstup funkce snadno použít v bloku case ..esac.
Upravit v případě, že se to pokoušíte spustit jako přímý skript:Tento skript by měl být získán nebo zahrnut z jiných skriptů. Pokud jej spustíte tak, jak je, nevydává nic samo o sobě. Chcete-li to otestovat, zadejte zdroj a poté funkci vyvolejte, např.:
source /path/to/this/script.sh
get_distribution_type
na výzvu bash.
Edit:Upozorňujeme, že tento skript nevyžaduje oprávnění root. Žádám vás, abyste to nespouštěli jako root. Nemělo by to nic poškodit, ale není to potřeba.
V logu CVS jsem našel odkaz na příslušný příspěvek v seznamu adresátů. Mělo by být užitečné při rozbalování špaget init skriptu.
Řešení 2:
Nezkoušejte a vytvářejte si domněnky založené na distribuci, co můžete a nemůžete dělat, protože to je šílenství (viz také "Detekce User Agent"). Místo toho zjistěte, zda to, co chcete udělat, je podporováno a jak se to provádí jakýmkoli příkazem nebo umístěním souboru, které chcete použít.
Pokud jste například chtěli nainstalovat balíček, můžete zjistit, zda používáte systém podobný Debianu nebo RedHat, kontrolou existence dpkg nebo rpm (nejprve zkontrolujte dpkg, protože počítače Debianu mohou mít příkaz rpm na nich...). Na základě toho se rozhodněte, co dělat, nejen podle toho, zda se jedná o systém Debian nebo RedHat. Tímto způsobem budete automaticky podporovat všechny odvozené distribuce, které jste explicitně nenaprogramovali. Jo, a pokud váš balíček vyžaduje specifické závislosti, otestujte je také a dejte uživateli vědět, co jim chybí.
Dalším příkladem je pohrávání si se síťovými rozhraními. Zjistěte, co dělat na základě toho, zda existuje soubor /etc/network/interfaces nebo adresář /etc/sysconfig/network-scripts, a jděte odtud.
Ano, je to více práce, ale pokud nechcete předělat všechny chyby, kterých se weboví vývojáři dopustili za poslední desetiletí nebo více, uděláte to chytře hned od začátku.
Řešení 3:
Verzi jádra zjistíte spuštěním uname -a
, nalezení verze distribuce závisí na distribuci.
Na Ubuntu a některých dalších OS můžete spustit lsb_release -a
nebo si přečtěte /etc/lsb_release
Debian ukládá verzi do /etc/debian_version
Řešení 4:
Většina distribucí má jedinečnou metodu určování konkrétní distribuce.
Například:
Redhat (And derivatives): /etc/redhat-release
SUSE: /etc/SUSE-release
Existuje standard známý jako Linux Standard Base nebo LSB. Definuje, že by měl existovat soubor nazvaný /etc/lsb-release nebo program nazvaný lsb_release, který bude odrážet informace o vaší linuxové distribuci.
lsb_release -a
Řešení 5:
python -c 'import platform ; print platform.dist()[0]'
kód:http://hg.python.org/cpython/file/2.7/Lib/platform.py