この回答では、それは明確にしましょう、私は推測読者が読み取ることができbash
、およびPOSIXのようなシェルスクリプトdash
。
投票数の多い回答はその多くを説明するのに優れているので、ここで説明することはあまりないでしょう。
しかし、さらに説明することがあれば、遠慮なくコメントしてください。ギャップを埋めるために最善を尽くします。
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
^^^取り消されたソリューションはスピードアップしないことが証明されましたが、長い間使用されてきたので、必要な限りここに置いておきます。
説明
コマンドを実行してPOSIXでユーザーIDを見つけるよりも、$EUID
標準bash
変数である有効なユーザーID番号を読み取る方が何倍も高速であるため、このソリューションは両方を適切にパックされた関数に結合します。が何らかの理由で使用できない場合に限り、コマンドが実行され、状況に関係なく適切な戻り値が取得されます。id -u
$EUID
id -u
何年にもわたってOPがこのソリューションを投稿した理由
まあ、私が正しく見れば、上記のコードの一部が欠けているようです。
ご覧のとおり、考慮しなければならない変数はたくさんあります。その1つは、パフォーマンスと信頼性の組み合わせです。
ポータブル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
。