Thay thế lệnh cho phép đầu ra của một lệnh được thay thế thay cho tên lệnh. Thay thế lệnh sẽ xảy ra khi lệnh được bao quanh như sau:
$(command)
hoặc (phiên bản rút gọn):
`command`
Shell sẽ mở rộng thay thế lệnh bằng cách thực thi lệnh
trong môi trường lớp con (xem Môi trường thực thi Shell ) và thay thế lệnh thay thế (văn bản lệnh cộng với "$ ()" hoặc backquote kèm theo với đầu ra tiêu chuẩn của lệnh, loại bỏ trình tự của một hoặc nhiều <newline>
ký tự ở cuối thay thế. Các <newline>
ký tự nhúng trước khi kết thúc đầu ra sẽ không bị xóa; tuy nhiên, chúng có thể được coi là các dấu phân cách trường và bị loại bỏ trong quá trình tách trường, tùy thuộc vào giá trị của IFS và trích dẫn có hiệu lực. Nếu đầu ra chứa bất kỳ byte rỗng nào, hành vi không được chỉ định.
Trong kiểu thay thế lệnh <backslash>
được trích dẫn , sẽ giữ nguyên nghĩa đen của nó, ngoại trừ khi được theo sau: ' $
', ' `
' hoặc
<backslash>
. Việc tìm kiếm backquote phù hợp sẽ được thỏa mãn bởi backquote không thoát được trích dẫn đầu tiên; trong quá trình tìm kiếm này, nếu gặp phải một backquote không thoát trong một nhận xét shell, tài liệu ở đây, thay thế lệnh nhúng của biểu mẫu $ ( lệnh ) hoặc chuỗi được trích dẫn, sẽ xảy ra kết quả không xác định. Một chuỗi trích dẫn đơn hoặc trích dẫn kép bắt đầu, nhưng không kết thúc, trong `...`
chuỗi "" tạo ra kết quả không xác định.
Với biểu mẫu $ ( lệnh ), tất cả các ký tự theo dấu ngoặc đơn mở cho dấu ngoặc đơn đóng phù hợp sẽ tạo thành
lệnh . Bất kỳ tập lệnh shell hợp lệ nào cũng có thể được sử dụng cho lệnh , ngoại trừ tập lệnh chỉ bao gồm các chuyển hướng tạo ra kết quả không xác định.
Các kết quả thay thế lệnh sẽ không được xử lý để mở rộng dấu ngã, mở rộng tham số, thay thế lệnh hoặc mở rộng số học. Nếu thay thế lệnh xảy ra bên trong dấu ngoặc kép, việc tách trường và mở rộng tên đường dẫn sẽ không được thực hiện trên kết quả của sự thay thế.
Thay thế lệnh có thể được lồng nhau. Để chỉ định lồng trong phiên bản backquote, ứng dụng phải đi trước các backquote bên trong với các <backslash>
ký tự; ví dụ:
\`command\`
Cú pháp của ngôn ngữ lệnh shell có sự mơ hồ đối với các mở rộng bắt đầu bằng "$((
. thay thế nếu nó xác định rằng nó không thể phân tích sự mở rộng như một sự mở rộng số học. Vỏ không cần đánh giá các mở rộng lồng nhau khi thực hiện xác định này. shell sẽ coi việc mở rộng là một mở rộng số học không hoàn chỉnh và báo cáo lỗi cú pháp. Một ứng dụng tuân thủ phải đảm bảo rằng nó tách biệt "$(
" và '(
'thành hai mã thông báo (nghĩa là tách chúng bằng khoảng trắng) trong một thay thế lệnh bắt đầu bằng một lớp con. Ví dụ, một sự thay thế lệnh có chứa một chuỗi con có thể được viết là:
$( (command) )
$()
là POSIX và được hỗ trợ bởi tất cả các shell Bourne hiện đại, ví dụ: ksh, bash, ash, dash, zsh, busybox, bạn đặt tên cho nó. (Một thứ không quá hiện đại là Solaris/bin/sh
, nhưng trên Solaris bạn sẽ đảm bảo sử dụng hiện đại/usr/xpg4/bin/sh
thay thế).