Thay thế gần như đồng nghĩa với việc mở rộng trong bối cảnh này vì ý nghĩa của chúng trùng lặp. Không phải là một danh mục con hoàn chỉnh của cái khác, mặc dù trong phần GNU Manual bạn tham chiếu có những sự thay thế được coi là một phần của việc mở rộng tổng thể.
Một mở rộng đang trích xuất giá trị của một định danh. Ví dụ, nếu this=that
, khi chúng tôi mở rộng, this
chúng tôi nhận được that
. Một mở rộng không liên quan đến sự thay thế được xác định trước ở chỗ giá trị được sử dụng đã tồn tại và đơn giản phải được truy xuất, mặc dù điều này bao gồm kết hợp các giá trị được truy xuất / rõ ràng (chẳng hạn như "mở rộng số học").
Một sự thay thế tạo ra một giá trị là kết quả của một hoạt động đầu vào / đầu ra rõ ràng. Ví dụ, nếu this=$(foo bar)
, this
là kết quả của việc thực hiện foo bar
và nắm bắt đầu ra của nó. 1 Mặc dù giá trị do thay thế có thể hoàn toàn có thể dự đoán được, nó khác với giá trị được lấy trong một bản mở rộng thông thường vì nó không thực sự tồn tại cho đến khi sự thay thế diễn ra - nó được tạo ra.
Sự thay thế có hai hương vị, mệnh lệnh và quy trình , đó là loại đối xứng:
# Command substitution
foo=$(ls)
# Process substitution
wc <(ls)
"Lệnh" trong cái đầu tiên là ls
, "quá trình" trong cái thứ hai. Chúng tôi có thể nói những gì đang được thay thế thực sự là kết thúc của một đường ống. Quá trình thay thế chồng chéo với chuyển hướng . Tuy nhiên, điều này có lẽ là một chút quá hạn chế về mặt kỹ thuật, điều này đưa chúng ta đến phần chú thích ...
foo bar
trong trường hợp này có thể là một hàm shell bên trong, trong trường hợp đó nó không có IO xử lý. Sự tồn tại của lớp vỏ tích hợp ít rõ ràng che khuất sự khác biệt này. Về nội dung, đầu vào và đầu ra sẽ giống nhau.
variable expansion
,command substitution
. Nghi ngờ của bạn là gì?