Как записать сценарий, который эффективно определяет имя дистрибутива?

ОГРОМНЫЙ ГЛЮК - файловая система Mac OS не чувствительна к регистру.

Можно создать чувствительный к регистру образ диска на Mac OS X, который может быть смонтирован как нормальный том жесткого диска.

# cf. http://codesnippets.joyent.com/posts/show/8617
IMAGE="${HOME}/Desktop/Case Sensitive Test.dmg"
VOLNAME="Case Sensitive Test"

hdiutil create "${IMAGE}" -size 10m -fs HFSX -volname "${VOLNAME}" -layout NONE

hdiutil attach "${IMAGE}"

cd "/Volumes/${VOLNAME}"
touch foo.txt Foo.txt
open .
ls -l [Ff]oo.txt
stat -f "inode: %i  --  name: %N" [Ff]oo.txt

cd ~
hdiutil detach "/Volumes/${VOLNAME}"
13
13.04.2017, 15:37
4 ответа

Каждое распределение (несмотря на lsb усилия) использование или может использовать (или даже может испытать недостаток в нем), другой файл в/etc/для объявления, что является его именем и версией.

Необходимо добавить условие в сценарии для каждого. Также примите для учета этого, некоторые дистрибутивы получены из других главных, и можете, или может не адаптировать их файлы версий.

Если Вы не хотите изобретать велосипед Вас, может использовать другую работу людей для достижения того, что Вы ищете. Например, в Python в платформе модуля существует метод для предположения распределения:

Help on function linux_distribution in module platform:

linux_distribution(distname='', version='', id='', supported_dists=('SuSE', 'debian', 'fedora', 'redhat', 'centos', 'mandrake', 'mandriva', 'rocks', 'slackware', 'yellowdog', 'gentoo', 'UnitedLinux', 'turbolinux'), full_distribution_name=1)
    Tries to determine the name of the Linux OS distribution name.

    The function first looks for a distribution release file in
    /etc and then reverts to _dist_try_harder() in case no
    suitable files are found.

    supported_dists may be given to define the set of Linux
    distributions to look for. It defaults to a list of currently
    supported Linux distributions identified by their release file
    name.

    If full_distribution_name is true (default), the full
    distribution read from the OS is returned. Otherwise the short
    name taken from supported_dists is used.

    Returns a tuple (distname,version,id) which default to the
    args given as parameters.

например:

In [1]: import platform

In [2]: platform.linux_distribution()
Out[2]: ('Ubuntu', '11.10', 'oneiric')
13
27.01.2020, 19:53

Основа Стандарта Linux указывает команду для этого:

lsb_release -si

Это - не всегда часть стандартной установки, поэтому если Вы хотите, чтобы Ваш сценарий работал над каждой системой, необходимо будет отступить к маршруту взгляда-и-предположения.

3
27.01.2020, 19:53
  • 1
    lsb_release - работы СИ с некоторыми дистрибутивами, но не со всем Linux, под "ArchLinux, Slackware & Derivates", это не работает, результат, являются "пустым" –  inukaze 22.10.2011, 17:51

Это - что-то вроде метода "в лоб" выполнения вещей, но это быстро и, с помощью удара, должно работать над большей частью дистрибутива

ver=$(cat /etc/*{issues,release,version} 2> /dev/null)
if [[ $(echo $ver | grep DISTRIB_ID) ]]; then
    lsb_release -si
else
    echo $ver | cut -d ' ' -f 1 | sort -u | head -1
fi
1
27.01.2020, 19:53

Если Вы не боитесь дополнительных зависимостей, можно использовать фактор для этого. Это дает информацию об имени дистрибутива и версии даже без установленного lsb_release.

1
27.01.2020, 19:53

Теги

Похожие вопросы