executando instrução if no prompt de comando

19

No bash, posso fazer o seguinte:

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

No entanto, se eu adicionar sudona frente, ele não funcionará mais:

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

Como posso fazer isso funcionar?

m33lky
fonte
11
Veja esta resposta em SO ...
jasonwryan
É uma prática recomendada sudoapenas para teste / ou apenas para echo. Nem toda a ifdeclaração.
jippie
Você quer dizer if sudo test? Sim, seria melhor. Não posso usar testsem o if, porque ele define o código de saída de outra forma.
m33lky

Respostas:

14

sudoexecuta seu argumento usando exec, não através de um interpretador de shell. Portanto, é limitado a programas binários reais e não pode usar funções de shell, aliases ou builtins ( ifé um builtin). Observe que as opções -ie -spodem ser usadas para executar os comandos fornecidos em um shell de login ou não, respectivamente (ou apenas o shell, interativamente; observe que você precisará escapar do ponto-e-vírgula ou citar o 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
fonte
Então, se eu usar -iou -s, a instrução if será avaliada corretamente?
m33lky
11
Sim, desde que citado ou escapado corretamente. Veja minha edição.
Kevin
9

Tente chamar a linha como um argumento de string através do shell.

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