У цій відповіді, нехай це буде зрозуміло, я припускаю, що читач вміє читати bash
та подібні сценарії оболонки POSIXdash
.
Я вважаю, що тут пояснювати не так багато, оскільки відповіді, що отримали високий голос, добре пояснюють багато цього.
Але, якщо є щось пояснити далі, не соромтесь коментувати, я зроблю все можливе, щоб заповнити прогалини.
Оптимізоване всебічне (не тільки bash
) рішення щодо продуктивності та надійності; всі оболонки сумісні
Нове рішення:
# bool function to test if the user is root or not
is_user_root () { [ ${EUID:-$(id -u)} -eq 0 ]; }
Тест (зберегти у файл is_user_root__benchmark
)
###############################################################################
## is_user_root() benchmark ##
## Bash is fast while Dash is slow in this ##
## Tested with Dash version 0.5.8 and Bash version 4.4.18 ##
## Copyright: 2020 Vlastimil Burian ##
## E-mail: info@vlastimilburian.cz ##
## License: GPL-3.0 ##
## Revision: 1.0 ##
###############################################################################
# intentionally, the file does not have executable bit, nor it has no shebang
# to use it, please call the file directly with your shell interpreter like:
# bash is_user_root__benchmark
# dash is_user_root__benchmark
# bool function to test if the user is root or not
is_user_root () { [ ${EUID:-$(id -u)} -eq 0 ]; }
# helper functions
print_time () { date +"%T.%2N"; }
print_start () { printf '%s' 'Start : '; print_time; }
print_finish () { printf '%s' 'Finish : '; print_time; }
readonly iterations=10000
printf '%s\n' '______BENCHMARK_____'
print_start
i=1; while [ $i -lt $iterations ]; do
is_user_root
i=$((i + 1))
done
print_finish
Оригінальне рішення:
#!/bin/bash
is_user_root()
# function verified to work on Bash version 4.4.18
# both as root and with sudo; and as a normal user
{
! (( ${EUID:-0} || $(id -u) ))
}
if is_user_root; then
echo 'You are the almighty root!'
else
echo 'You are just an ordinary user.'
fi
^^^ Рішення, яке викреслило, було доведено, що воно не пришвидшує справи, але воно існувало вже давно, тому я збираюся тримати його тут, поки вважаю за потрібне.
Пояснення
Оскільки в багато разів швидше зчитувати $EUID
стандартну bash
змінну, ефективний номер ідентифікатора користувача, ніж виконувати id -u
команду для POSIX-тільки знайти ідентифікатор користувача, це рішення поєднує в собі як добре упаковану функцію. Якщо, і тільки якщо, з $EUID
будь-якої причини немає, id -u
команда буде виконуватися, гарантуючи, що ми отримаємо належне повернене значення незалежно від обставин .
Чому я розміщую це рішення після стількох років, що запитувала ОП
Що ж, якщо я правильно бачу, то, здається, вище відсутній фрагмент коду.
Розумієте, існує багато змінних, які потрібно враховувати, і одна з них - це поєднання продуктивності та надійності .
Портативне рішення POSIX + Приклад використання вищевказаної функції
#!/bin/sh
# bool function to test if the user is root or not (POSIX only)
is_user_root() { [ "$(id -u)" -eq 0 ]; }
if is_user_root; then
echo 'You are the almighty root!'
exit 0 # unnecessary, but here it serves the purpose to be explicit for the readers
else
echo 'You are just an ordinary user.' >&2
exit 1
fi
Висновок
Настільки, наскільки ви, можливо, не любите це, середовище Unix / Linux багато в чому відрізняється. Тобто є люди, яким bash
так подобається , вони навіть не думають про портативність ( оболонки POSIX ). Інші, як я, віддають перевагу оболонкам POSIX . Сьогодні це питання особистого вибору та потреб.
id -u
повертає0
для root.