Câu hỏi chung:
Trong Bash, tôi biết rằng việc sử dụng biến myvarcó thể được thực hiện theo hai cách:
# Define a variable:
bash$ myvar="two words"
# Method one to dereference:
bash$ echo $myvar
two words
# Method two to dereference:
bash$ echo "$myvar"
two words
Trong trường hợp trên, hành vi là giống hệt nhau. Điều này là do cách làm echoviệc. Trong các tiện ích Unix khác, việc các từ được nhóm lại với nhau bằng dấu ngoặc kép sẽ tạo ra sự khác biệt lớn:
bash$ myfile="Cool Song.mp3"
bash$ rm "$myfile" # Deletes "Cool Song.mp3".
bash$ rm $myfile # Tries to delete "Cool" and "Song.mp3".
Tôi tự hỏi ý nghĩa sâu xa của sự khác biệt này là gì. Quan trọng nhất, làm thế nào tôi có thể xem chính xác những gì sẽ được truyền cho lệnh, để tôi có thể xem nếu nó được trích dẫn đúng?
Ví dụ về tỷ lệ cược cụ thể:
Tôi sẽ chỉ viết mã với hành vi được quan sát:
bash$ mydate="--date=format:\"%Y-%m-%d T%H\""
bash$ git log "$mydate" # This works great.
bash$ git log $mydate
fatal: ambiguous argument 'T%H"': unknown revision or path not in the working tree.
Tại sao tôi cần dấu ngoặc kép? Chính xác thì git-log nhìn thấy gì sau khi biến bị hủy đăng ký mà không có dấu ngoặc kép?
Nhưng bây giờ hãy xem điều này:
bash$ nospace="--date=format:\"%Y-%m-%d\""
bash$ git log $nospace # Now THIS works great.
bash$ git log "$nospace" # This kind of works, here is a snippet:
# From git-log output:
Date: "2018-04-12"
Yuck, tại sao đầu ra in có dấu ngoặc kép trong đó bây giờ? Có vẻ như nếu trích dẫn kép là không cần thiết, chúng không bị tước, chúng được hiểu là các ký tự trích dẫn theo nghĩa đen nếu và chỉ khi chúng không cần thiết.
Git được thông qua là đối số là gì? Tôi ước tôi biết làm thế nào để tìm hiểu.
Để làm cho vấn đề trở nên phức tạp hơn, tôi đã viết một kịch bản Python bằng cách argparsechỉ in tất cả các đối số (như Bash đã giải thích chúng, do đó, với các trích dẫn kép mà Bash nghĩ rằng chúng là một phần của đối số và với các từ được nhóm hoặc không được nhóm lại thành Bash thấy phù hợp) và argparsetập lệnh Python hành xử rất hợp lý. Đáng buồn thay, tôi nghĩ argparsecó thể đang âm thầm sửa chữa một vấn đề đã biết với Bash và do đó che khuất những thứ lộn xộn mà Bash đang truyền cho nó. Đó chỉ là một phỏng đoán, tôi không biết. Có lẽ git-log đang bí mật làm hỏng những gì Bash đang truyền cho nó.
Hoặc có lẽ tôi chỉ không biết chuyện gì đang xảy ra.
Cảm ơn.
Chỉnh sửa Chỉnh sửa: Hãy để tôi nói điều này ngay bây giờ, trước khi có bất kỳ câu trả lời nào: Tôi biết rằng tôi có thể sử dụng các trích dẫn duy nhất xung quanh toàn bộ và sau đó không thoát khỏi dấu ngoặc kép. Điều này thực sự hoạt động tốt hơn đối với vấn đề ban đầu của tôi khi sử dụng git-log, nhưng tôi đã thử nghiệm nó trong một số bối cảnh khác và nó cũng khó đoán và không đáng tin cậy như nhau. Một cái gì đó kỳ lạ đang diễn ra với trích dẫn bên trong các biến. Tôi thậm chí sẽ không đăng tất cả những điều kỳ lạ đã xảy ra với dấu ngoặc đơn.
Chỉnh sửa 2 - Điều này cũng không hoạt động: Tôi chỉ có ý tưởng tuyệt vời này, nhưng nó hoàn toàn không hoạt động:
bash$ mydate="--date=format:%Y-%m-%d\ T%H"
bash$ git log "$mydate"
# Git log output has this:
Date: 2018-04-12\ T23
Vì vậy, nó không có dấu ngoặc kép, nhưng nó có ký tự dấu gạch chéo theo nghĩa đen trong chuỗi ngày. Ngoài ra, git log $mydatekhông có lỗi trích dẫn nào, với dấu gạch chéo ngược trong không gian.