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?

m33lky
la source
1
Voir cette réponse sur SO ...
jasonwryan
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
Kevin
la source
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'
Arcege
la source