bashの「true」の目的は何ですか? 「if sudo true; then」

bashの「true」の目的は何ですか? 「if sudo true; then」

私はユーザーにスーパーユーザー権限があるかどうかをテストし、そうでない場合はスーパーユーザー権限を要求するbashスクリプトを作成しました。最終的に、次の2行を削除できるように、2番目の "if"ステートメントを逆に置き換えようとしています(echo "password ok"と次の行のelse)。

# Root user only
if [[ "$EUID" != 0 ]]; then
    sudo -k # make sure to ask for password on next sudo
    if sudo true; then
        echo "Password ok"
    else
        echo "Aborting script"
        exit 1
    fi
fi

echo "do my ops"

4行目の目的が「true」であることは、単に空のステートメントですか?

4行目でテストを逆にする必要がありますが、どうすればよいですか?私が試したことは次のとおりです。

if sudo false; then  
if sudo true == false; then
if [!(sudo true)]; then

答え1

truebashのキーワードではなく、成功した終了コードですぐに終了するプログラムです。同様に、false失敗した終了コードで終了するプログラムです。

ターミナルで両方のプログラムを実行してから、$?最後のプログラムの終了コードを含む変数を読み取ってみてください。

true
echo $? # 0
false
echo $? #1

if sudo trueと同じではありませんif sudo == true。を使用してプログラムを実行し、if sudo true終了コードを確認します。truesudo

だから:

if sudo false; thenプログラムがsudoとして実行されていますfalse。戻り値は常に false です。

if sudo true == falsetrue引数を使用して==プログラムを実行します。これは明らかにあなたが望むものではありません。falsesudo

if [!(sudo true)]無効な構文です。

あなたが探しているもの

if ! sudo true;

答え2

許可された回答が実際にあなたの質問に対する答えではないと思いますか?

これ目的実際にできることを確認するには、次のようにしますsudo

どのようにこの確認は、true許可された回答で説明されているようにプログラム的に行われます。

答え3

このスクリプトで見られるように。 sudoが有効になっていることを確認するだけです。

true は単に true を返します。

したがって、この場合、sudoを使用してコマンドを実行する必要がある場合は、最初に起動を確認し、パスワードを一度だけ尋ねます。

条件は次のように動作します。 sudoがtrueコマンドを正しく実行すると、if条件はtrueを返し、sudoがアクティブになり、ユーザーが入力したパスワードが正確になります。それ以外の場合は、間違ったパスワードを入力したか、sudoが有効になっていないため、スクリプトを続行しないでください。 。

他のコマンドは認証が初めて成功するため、sudoパスワードを要求する必要はありません(ただし、これはsudo構成によって異なり、このスクリプトは環境構成に大きく依存します)。

「echo Password ok」もこれを証明します。シェルスクリプトはパスワードを必要としません。

関連情報