eseguendo if-statement dal prompt dei comandi


19

In bash posso fare quanto segue:

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

Tuttavia, se aggiungo sudodavanti, non funziona più:

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

Come posso farlo funzionare?



È pratica migliore sudosolo il teste / o solo il echo. Non l'intera ifdichiarazione.
jippie,

Intendi if sudo test? Sì, sarebbe meglio. Non posso usare testsenza il if, perché altrimenti imposta il codice di uscita.
m33lky,

Risposte:


14

sudoesegue il suo argomento usando exec, non tramite un interprete di shell. Pertanto, è limitato ai programmi binari effettivi e non può utilizzare funzioni di shell, alias o builtin ( ifè un builtin). Nota che le opzioni -ie -spossono essere usate per eseguire i comandi dati in una shell di login o non login, rispettivamente (o solo la shell, in modo interattivo; nota che dovrai sfuggire ai punti e virgola o citare il 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

Quindi, se uso -io -s, l'istruzione if verrà valutata correttamente?
m33lky,

1
Sì, purché sia ​​quotato o salvato correttamente. Vedi la mia modifica.
Kevin,

9

Prova a chiamare la linea come argomento stringa attraverso la shell.

sudo /bin/sh -c 'if [ -f /tmp/test.txt ]; then echo "true"; fi'
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.