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ć?



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

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'
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.