ejecutando sentencia if desde el símbolo del sistema

19

En bash puedo hacer lo siguiente:

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

Sin embargo, si agrego sudoal frente, ya no funciona:

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

¿Cómo puedo hacer que funcione?

m33lky
fuente
1
Ver esta respuesta en SO ...
jasonwryan
Es mejor practicar sudosolo el testy / o solo el echo. No toda la ifdeclaración.
jippie
Quieres decir if sudo test? Sí, eso sería mejor. No puedo usar testsin el if, porque establece el código de salida de lo contrario.
m33lky

Respuestas:

14

sudoejecuta su argumento usando exec, no a través de un intérprete de shell. Por lo tanto, está limitado a programas binarios reales y no puede usar funciones de shell, alias o componentes ifincorporados ( es un componente integrado ). Tenga en cuenta que las opciones -iy -sse pueden usar para ejecutar los comandos dados en un shell de inicio de sesión o no, respectivamente (o solo el shell, de forma interactiva; tenga en cuenta que tendrá que escapar de los puntos y comas o citar el comando).

$ 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
fuente
Entonces, si uso -io -s, ¿la declaración if se evaluará correctamente?
m33lky
1
Sí, siempre que se cite o escape correctamente. Mira mi edición.
Kevin
9

Intente llamar a la línea como un argumento de cadena a través del shell.

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