wykonywanie instrukcji if z wiersza poleceń

19

W bash mogę wykonać następujące czynności:

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

Jednak jeśli dodam sudoz przodu, to już nie działa:

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

Jak mogę to zrobić?

m33lky
źródło
1
Zobacz tę odpowiedź na SO ...
jasonwryan
Lepiej jest ćwiczyć sudotylko testi / lub tylko echo. Nie całe ifoświadczenie.
jippie
Masz na myśli if sudo test? Tak, byłoby lepiej. Nie mogę używać testbez if, ponieważ ustawia kod wyjścia inaczej.
m33lky

Odpowiedzi:

14

sudowykonuje swój argument, używając exec, a nie interpretera powłoki. Dlatego jest ograniczony do rzeczywistych programów binarnych i nie może używać funkcji powłoki, aliasów ani wbudowanych funkcji ( ifjest wbudowany). Zauważ, że opcje -ii -smogą być użyte do wykonania podanych poleceń odpowiednio w powłoce do logowania lub bez logowania (lub tylko w powłoce, interaktywnie; pamiętaj, że będziesz musiał uciec ze średnika lub zacytować polecenie).

$ 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
źródło
Tak więc, jeśli użyję -ilub -s, instrukcja if zostanie właściwie oceniona?
m33lky
1
Tak, pod warunkiem, że jest poprawnie cytowany lub uciekł. Zobacz moją edycję.
Kevin
9

Spróbuj wywołać linię jako argument ciągu przez powłokę.

sudo /bin/sh -c 'if [ -f /tmp/test.txt ]; then echo "true"; fi'
Arcege
źródło