Даже если Вы могли бы распознать, что как строка опции, это будет действительно плохая идея использовать символ вопросительного знака в качестве реального аргумента, потому что большинство оболочек использует это в качестве части их синтаксиса шарика (представляющий, что символ, прежде чем это будет дополнительно использование или не в соответствии). Передача побережья ?
было бы трудным для пользователей, потому что они должны будут выйти из него.
При создании опции справки некоторого вида, обычный синтаксис должен искать короткие и долгие опции -h
и --help
.
У меня есть стандартная функция, в которой я использую bash
для этой самой цели:
# Check if we're root and re-execute if we're not.
rootcheck () {
if [ $(id -u) != "0" ]
then
sudo "$0" "$@" # Modified as suggested below.
exit $?
fi
}
Существуют, вероятно, более изящные пути (я записал это Давным-давно!), но это хорошо работает для меня.
Для использования этой функции последовательно в сценарии необходимо передать его аргументы, полученные сценарием первоначально.
Использование: rootcheck "${@}"
(rootcheck
один не передаст аргументов функции rootcheck),
Можно изменить полномочия, так, чтобы только корень мог выполнить его. Или Вы могли использовать whoami
команда и в случае, если это это не корневая сила sudo.
Я использую эту однострочную версию, которую легко скопировать вставить поверх скриптов
[ `whoami` = root ] || { sudo "$0" "$@"; exit $?; }
exec sudo "$0" "$@"
чтобы избежать проблем с пробелами в аргументах и избежать имеют первое бродящее вокруг выполнение? – Douglas Leeder 23.09.2010, 12:33rootcheck "$@"
). Или можно просто поместить если встроенный блок, а не в функции. Кроме того, это должно быть сделано очень рано в сценарии как что-либо, прежде чем он будет выполнен дважды (однажды обычно, однажды как корень). – Gordon Davisson 23.09.2010, 22:18if [[ $1 == "--no-sanity-checks" ]]; then shift; else run sanity checks; fi
и затем измените команду sudo кexec sudo "$0" --no-sanity-checks "$@"
– Gordon Davisson 25.09.2010, 20:28