web-dev-qa-db-ja.com

bashの「true」の目的は何ですか。

私はこのbashスクリプトをハッキングして、ユーザーがスーパーユーザー権限を持っているかどうかをテストし、そうでない場合はスーパーユーザー権限を要求します。最終的に、次の2行を削除できるように、2番目の「if」ステートメントを反転させようとしています(エコー「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"の目的は単なるnullステートメントですか?

4行目のテストを反転させる必要があります。どうすればよいですか?これが私が試したものです:

if Sudo false; then  
if Sudo true == false; then
if [!(Sudo true)]; then
20
Matt Parkins

true in bashはキーワードではありません。成功した終了コードで即座に終了するプログラムです。同様に、falseは、失敗した終了コードで終了するプログラムです。

端末から両方のプログラムを実行し、最後のプログラムの終了コードを含む_$?_変数を読み取ることで、これを試すことができます。

_true
echo $? # 0
false
echo $? #1
_

_if Sudo true_は_if Sudo == true_と同等ではありません。 _if Sudo true_は、trueを使用してSudoプログラムを実行し、終了コードを確認しています。

したがって:

_if Sudo false; then_はSudoとしてプログラムfalseを実行しています。戻り値は常にfalseになります。

_if Sudo true == false_は、trueを使用して、_==_およびfalseを引数としてプログラムSudoを実行します。これは明らかに意図したものではありません。

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

あなたがおそらく探しているのは

_if ! Sudo true;
_
38
JShorthouse

受け入れられた答えが実際にあなたの質問に答えなかったと思いますか?

これを行う目的は、実際にSudoを実行できることを確認することです。

方法このチェックは、受け入れられた回答で説明されているtrueプログラムを介して実行されます。

21
user541686

このスクリプトで見たように。 Sudoが有効になっているかどうかを確認しているだけです。

trueは単にtrueを返します。

したがって、この場合、Sudoを使用してコマンドを実行する必要がある場合、最初に最初にチェックし、パスワードを1回だけ尋ねます。

条件は次のように機能します。Sudoがtrueコマンドを正しく実行している場合、if条件に対してtrueが返され、Sudoが有効になり、ユーザーがパスワードを正しく入力した。続けてはならない.

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

「エコーパスワードOK」もそれを示しています。シェルスクリプトはパスワードを要求しなくなります。