コマンドプロンプトからifステートメントを実行する


19

bashでは、次のことができます。

if [ -f /tmp/test.txt ]; then echo "true"; fi

ただし、sudo前に追加すると、機能しなくなります。

sudo if [ -f /tmp/test.txt ]; then echo "true"; fi
-bash: syntax error near unexpected token `then'

どうすればそれを機能させることができますか?


1
SOでこの回答を参照してください。
jasonwryan12年

これは、より良い練習でsudoのみtest、および/またはのみechoifステートメント全体ではありません。
ジッピー

という意味if sudo testですか?はい、それは良いでしょう。それ以外の場合は終了コードを設定するため、testなしでは使用できませんif
m33lky

回答:


14

sudoexecシェルインタープリターではなく、を使用して引数を実行します。したがって、実際のバイナリプログラムに限定され、シェル関数、エイリアス、またはビルトイン(ビルトイン)ifは使用できません。ことを注意-iして-sオプションは、ログインまたは非ログインシェル、それぞれに与えられたコマンドを実行するために使用することができます(対話的に、または単にシェル;あなたはセミコロンをエスケープするか、コマンドを引用する必要がありますことに注意してください)。

$ sudo if [ -n x ]; then echo y; fi
-bash: syntax error near unexpected token `then'
$ sudo if [ -n x ]\; then echo y\; fi
sudo: if: command not found
$ sudo -i if [ -n x ]\; then echo y\; fi
y
$ sudo -s 'if [ -n x ]; then echo y; fi'
y

だから、-iまたはを使用する-sと、if文が適切に評価されますか?
m33lky

1
はい、適切に引用またはエスケープされている限り。編集をご覧ください。
ケビン

9

シェルを介して文字列引数として行を呼び出してみてください。

sudo /bin/sh -c 'if [ -f /tmp/test.txt ]; then echo "true"; fi'
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.