Щоб відповісти на ваше запитання, найточніше, жодне sudo
не вважається універсальним. Правда, все поняття «універсальне» часто є червоною оселедець. Особливо це стосується сумісності крос-дистрибутива. Після того, як ви кинетеся до безлічі різних версій програмного забезпечення, універсальність стає напівреальною. Сценарій за своєю природою є прагматичним, якби це було педантично, писати портативні сценарії було б практично неможливо.
Зазвичай я вимірюю призначене для виконання середовище, напівсучасний дистрибутив Linux, я очікую оболонку POSIX із загальними утилітами GNU. Для сценаріїв, які можуть працювати за межами Linux, я очікую лише повного стандарту POSIX. Очевидно, що багато скриптів є специфічними для Linux або специфічними для distro, так що часто звужує область переносимості.
Щоб вирішити конкретний сценарій,
#!/bin/sh
## Exit Point
die() {
[ -n "$2" ] && echo "$2"
exit $1
}
## Require SuperUser Execution, Otherwise Re-Execute
[ `id -u` -ne 0 ] && {
command -v lsb_release > /dev/null && {
DISTRO="`lsb_release -is`"
[ "$DISTRO" = "Ubuntu" ] && SUPERUSER='sudo'
}
SUPERUSER="${SUPERUSER:-su}"
case "$SUPERUSER" in
su)
su -c "$0"
;;
sudo)
sudo "$0"
;;
esac
}
## Require SuperUser Execution
[ `id -u` -ne 0 ] && die 78
echo 'Script Executed by UID'
id -u
## Clean Up
die 0
що скріплений скрипт - це комплімент оболонки POSIX, я завжди пишу Dash сумісний.
sudo
може бути в комплекті з більшістю дистрибутивів, але не всі вони налаштовують кожного користувача як здатного запустити його.