Để bổ sung cho các câu trả lời hiện có, hữu ích; mẹo đội mũ cho QZ Hỗ trợ khuyến khích tôi đăng câu trả lời riêng:
Hai cơ chế riêng biệt được sử dụng ở đây:
(a) liệu cut
bản thân có yêu cầu dấu phân cách (không gian, trong trường hợp này) được chuyển cho -d
tùy chọn là một đối số riêng biệt hoặc liệu có thể chấp nhận để nối trực tiếp vào đó hay không -d
.
(b) cách shell thường phân tích các đối số trước khi chuyển chúng đến lệnh được gọi.
(a) được trả lời bằng một trích dẫn từ hướng dẫn POSIX cho các tiện ích (nhấn mạnh của tôi)
Nếu SYNOPSIS của tiện ích tiêu chuẩn hiển thị tùy chọn có đối số tùy chọn bắt buộc [...], ứng dụng tuân thủ sẽ sử dụng các đối số riêng cho tùy chọn đó và đối số tùy chọn . Tuy nhiên , việc triển khai tuân thủ cũng sẽ cho phép các ứng dụng chỉ định tùy chọn và đối số tùy chọn trong cùng một chuỗi đối số mà không can thiệp các ký tự .
Nói cách khác: Trong trường hợp này, vì -d
đối số tùy chọn là bắt buộc , bạn có thể chọn có chỉ định dấu phân cách là :
- (s) EITHER: một đối số riêng
- (d) HOẶC: như một giá trị được gắn trực tiếp vào
-d
.
Khi bạn đã chọn (d) hoặc (d), đó là phân tích cú pháp chuỗi ký tự của trình bao - (b) - đó là vấn đề:
Với (các) phương pháp tiếp cận , tất cả các hình thức sau đây là THIẾT BỊ:
-d ' '
-d " "
-d \<space> # <space> used to represent an actual space for technical reasons
Với cách tiếp cận (d) , tất cả các hình thức sau đây là THIẾT BỊ:
-d' '
-d" "
"-d "
'-d '
d\<space>
Sự tương đương được giải thích bằng cách xử lý chuỗi ký tự của shell :
Tất cả các giải pháp trên đều dẫn đến cùng một chuỗi (trong mỗi nhóm) theo thời gian cut
sẽ thấy chúng :
(s) : cut
xem -d
, như là đối số của chính nó , theo sau là một đối số riêng có chứa dấu cách - không có dấu ngoặc kép hoặc \
tiền tố!.
(d) : cut
thấy -d
cộng với dấu cách - không có dấu ngoặc kép hoặc \
tiền tố! - như một phần của cùng một lập luận.
Lý do các biểu mẫu trong các nhóm tương ứng cuối cùng giống hệt nhau là gấp đôi, dựa trên cách shell phân tích chuỗi ký tự :
- Vỏ cho phép theo nghĩa đen được xác định như là thông qua một cơ chế gọi là trích dẫn , có thể mất nhiều hình thức :
- chuỗi trích dẫn đơn : nội dung bên trong
'...'
được lấy theo nghĩa đen và tạo thành một đối số duy nhất
- chuỗi được trích dẫn kép : nội dung bên trong
"..."
cũng tạo thành một đối số duy nhất , nhưng phải tuân theo phép nội suy (mở rộng các tham chiếu biến như $var
, thay thế lệnh ( $(...)
hoặc `...`
) hoặc mở rộng số học ( $(( ... ))
).
\
- trích dẫn các ký tự riêng lẻ : một ký tự\
đứng trước làm cho ký tự đó được hiểu là một nghĩa đen.
- Trích dẫn được bổ sung bằng cách loại bỏ trích dẫn , có nghĩa là một khi trình bao đã phân tích cú pháp một dòng lệnh, nó sẽ loại bỏ các ký tự trích dẫn khỏi các đối số (kèm theo
'...'
hoặc "..."
hoặc các \
trường hợp) - do đó, lệnh được gọi không bao giờ nhìn thấy các ký tự trích dẫn .