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?



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

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'
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.