Không, ví dụ đơn giản hóa:
FLAGS='--archive --exclude="foo bar.txt"'
rsync $FLAGS dir1 dir2
Tôi cần bao gồm các trích dẫn như thể lệnh là như thế này:
rsync --archive --exclude="foo bar.txt" dir1 dir2
Không, ví dụ đơn giản hóa:
FLAGS='--archive --exclude="foo bar.txt"'
rsync $FLAGS dir1 dir2
Tôi cần bao gồm các trích dẫn như thể lệnh là như thế này:
rsync --archive --exclude="foo bar.txt" dir1 dir2
Câu trả lời:
Câu trả lời ngắn: xem BashFAQ # 50 ("Tôi đang cố gắng đặt một lệnh vào một biến, nhưng các trường hợp phức tạp luôn thất bại!").
Câu trả lời dài: Việc đưa các lệnh (hoặc các phần của lệnh) vào các biến và sau đó lấy lại chúng nguyên vẹn là rất phức tạp. Khi shell mở rộng một biến trên dòng lệnh, nếu biến đó nằm trong dấu ngoặc kép thì nó không được phân tích cú pháp; nếu nó không có trong dấu ngoặc kép thì khoảng trắng trong nó được phân tích cú pháp dưới dạng ngắt đối số, nhưng dấu ngoặc kép và thoát không được phân tích cú pháp. Trong cả hai trường hợp, đặt dấu ngoặc kép trong giá trị của biến không có gì hữu ích.
Thông thường, cách tốt nhất để thực hiện loại điều này là sử dụng một mảng thay vì một biến văn bản đơn giản:
FLAGS=(--archive --exclude="foo bar.txt")
rsync "${FLAGS[@]}" dir1 dir2
eval là một lựa chọn khác:
$ x="'a b'"
$ printf '%s,%s' $x
'a,b'
$ eval printf '%s,%s' $x
a b
Xem thêm:
Tôi không thấy vấn đề:
$ FLAGS='--archive --exclude="foo bar.txt"'
$ echo $FLAGS
--archive --exclude="foo bar.txt"
Có lẽ bạn cần phải trích dẫn lại giá trị:
$ rsync "$FLAGS" dir1 dir2
echo
không thể hiện những gì bạn nghĩ nó là. Hãy thử printargs() { printf "'%s' " "$@"; echo; }; printargs $FLAGS; printargs "$FLAGS"
xem tại sao cả hai tùy chọn này không hoạt động.