Ausführen der if-Anweisung an der Eingabeaufforderung

19

In Bash kann ich Folgendes tun:

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

Wenn ich jedoch sudovorne hinzufüge , funktioniert es nicht mehr:

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

Wie kann ich es zum Laufen bringen?

m33lky
quelle
1
Siehe diese Antwort auf SO ...
Jasonwryan
Es ist besser, sudonur die testund / oder nur die echo. Nicht die ganze ifAussage.
jippie
Du meinst if sudo test? Ja, das wäre besser. Ich kann nicht testohne die verwenden if, weil es den Exit-Code anders setzt.
m33lky

Antworten:

14

sudoführt sein Argument execnicht über einen Shell-Interpreter aus, sondern unter Verwendung von . Daher ist es auf tatsächliche Binärprogramme beschränkt und kann keine Shell-Funktionen, Aliase oder Builtins verwenden ( ifist ein Builtin). Beachten Sie, dass die Optionen -iund -sverwendet werden können, um die angegebenen Befehle in einer Anmelde- bzw. Nicht-Anmelde-Shell (oder nur in der Shell interaktiv) auszuführen. Beachten Sie, dass Sie die Semikolons umgehen oder den Befehl in Anführungszeichen setzen müssen.

$ 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
Kevin
quelle
Also, wenn ich -ioder benutze -s, wird die if-Anweisung richtig ausgewertet?
m33lky
1
Ja, solange es richtig zitiert oder geflüchtet ist. Siehe meine Bearbeitung.
Kevin
9

Versuchen Sie, die Zeile als Zeichenfolgenargument über die Shell aufzurufen.

sudo /bin/sh -c 'if [ -f /tmp/test.txt ]; then echo "true"; fi'
Arcege
quelle