mengeksekusi if-statement dari command prompt

19

Dalam bash saya bisa melakukan hal berikut:

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

Namun, jika saya tambahkan sudodi depan, itu tidak berfungsi lagi:

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

Bagaimana saya bisa membuatnya bekerja?

m33lky
sumber
1
Lihat jawaban ini di SO ...
jasonwryan
Ini adalah praktik yang lebih baik untuk sudohanya testdan / atau hanya echo. Bukan keseluruhan ifpernyataan.
jippie
Maksudmu if sudo test? Ya, itu akan lebih baik. Saya tidak dapat menggunakan testtanpa if, karena mengatur kode keluar jika tidak.
m33lky

Jawaban:

14

sudomengeksekusi argumennya menggunakan exec, bukan melalui shell interpreter. Oleh karena itu, ini terbatas pada program biner aktual dan tidak dapat menggunakan fungsi shell, alias, atau builtin ( ifadalah builtin). Perhatikan bahwa opsi -idan -sdapat digunakan untuk mengeksekusi perintah yang diberikan dalam login atau shell non-login, masing-masing (atau hanya shell, secara interaktif; perhatikan bahwa Anda harus melarikan diri dari tanda titik koma atau mengutip perintah).

$ 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
sumber
Jadi, jika saya menggunakan -iatau -s, pernyataan jika akan dievaluasi dengan benar?
m33lky
1
Ya, selama itu dikutip atau lolos dengan benar. Lihat hasil edit saya.
Kevin
9

Coba panggil baris sebagai argumen string melalui shell.

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