thực hiện if-statement từ dấu nhắc lệnh


19

Trong bash tôi có thể làm như sau:

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

Tuy nhiên, nếu tôi thêm sudovào trước, nó không hoạt động nữa:

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

Làm thế nào tôi có thể làm cho nó hoạt động?



Nó là thực hành tốt hơn để sudochỉ testvà và hoặc chỉ echo. Không phải toàn bộ iftuyên bố.
jippie

Ý bạn là if sudo testsao? Vâng, điều đó sẽ tốt hơn. Tôi không thể sử dụng testmà không có if, bởi vì nó đặt mã thoát khác.
m33lky

Câu trả lời:


14

sudothực thi đối số của nó bằng cách sử dụng exec, không thông qua trình thông dịch shell. Do đó, nó bị giới hạn trong các chương trình nhị phân thực tế và không thể sử dụng các hàm shell, bí danh hoặc nội dung ( iflà một nội dung). Lưu ý rằng các tùy chọn -i-scó thể được sử dụng để thực thi các lệnh đã cho trong shell đăng nhập hoặc không đăng nhập, tương ứng (hoặc chỉ vỏ, tương tác; lưu ý rằng bạn sẽ phải thoát dấu chấm phẩy hoặc trích dẫn lệnh).

$ 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

Vì vậy, nếu tôi sử dụng -ihoặc -s, câu lệnh if sẽ được đánh giá đúng?
m33lky

1
Có, miễn là nó được trích dẫn hoặc thoát đúng. Xem chỉnh sửa của tôi.
Kevin

9

Hãy thử gọi dòng là một đối số chuỗi thông qua shell.

sudo /bin/sh -c 'if [ -f /tmp/test.txt ]; then echo "true"; fi'
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.