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.