Sự khác biệt khi sử dụng backticks trong dấu ngoặc kép và dấu ngoặc đơn trong Bash


12

Tại sao hai lần thực hiện sau lại khác nhau về đầu ra? (Tôi cần dấu ngoặc kép cho các biến trong lệnh cuối cùng của mình)

$ sudo su -c "echo `cat /root/root_file`"
cat: /root/root_file: Permission denied
$ sudo su -c 'echo `cat /root/root_file`'
Yay, highly classified content!

Câu trả lời:


19

Bash thực hiện một loạt các mở rộng trước khi lệnh được thực thi ( sudotrong trường hợp này). Trong trường hợp đầu tiên, việc thay thế lệnh được thực hiện bởi vì nó nằm trong dấu ngoặc kép - nó thực thi như bạn, do đó xảy ra lỗi. Trong trường hợp thứ hai, các trích dẫn đơn ngăn chặn việc mở rộng, do đó, backticks không được thay thế cho đến khi shell của root hoạt động.

Xem thêm https://www.gnu.org/software/bash/manual/bashref.html#Quote


6

Trong ví dụ đầu tiên, backticks được đánh giá bởi shell của bạn (như bạn chứ không phải root). Thử với

sudo su -c "echo `whoami`"

Trong phần thứ hai với dấu ngoặc đơn ', toàn bộ chuỗi echo `cat /root/root_file`được truyền vào shell gốc.

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.