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?



É 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

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'
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.