exécution de l'instruction if à partir de l'invite de commande


19

En bash, je peux faire ce qui suit:

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

Cependant, si j'ajoute sudodevant, cela ne fonctionne plus:

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

Comment puis-je le faire fonctionner?



Il est préférable de sudon'utiliser que le testet / ou le seul echo. Pas l'intégralité de la ifdéclaration.
jippie

Tu veux dire if sudo test? Oui, ce serait mieux. Je ne peux pas utiliser testsans le if, car il définit le code de sortie autrement.
m33lky

Réponses:


14

sudoexécute son argument en utilisant exec, pas via un interpréteur de shell. Par conséquent, il est limité aux programmes binaires réels et ne peut pas utiliser de fonctions shell, d'alias ou de commandes intégrées ( ifest une commande intégrée). Notez que les options -iet -speuvent être utilisées pour exécuter les commandes données dans un shell de connexion ou non, respectivement (ou simplement le shell, de manière interactive; notez que vous devrez échapper les points-virgules ou citer la commande).

$ 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

Donc, si j'utilise -iou -s, l'instruction if sera évaluée correctement?
m33lky

1
Oui, tant qu'il est cité ou échappé correctement. Voir mon montage.
Kevin

9

Essayez d'appeler la ligne en tant qu'argument chaîne via le shell.

sudo /bin/sh -c 'if [ -f /tmp/test.txt ]; then echo "true"; fi'
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.