Tôi đã tự hỏi làm thế nào để tạo một tệp có tên là cờ, ví dụ, nếu tôi muốn tạo một thư mục có tên -a
, những lệnh nào sẽ thực hiện thủ thuật?
Tôi đã thử mkdir '-a'
, mkdir \-a
và không làm việc. Tôi đang dùng Ubuntu.
Tôi đã tự hỏi làm thế nào để tạo một tệp có tên là cờ, ví dụ, nếu tôi muốn tạo một thư mục có tên -a
, những lệnh nào sẽ thực hiện thủ thuật?
Tôi đã thử mkdir '-a'
, mkdir \-a
và không làm việc. Tôi đang dùng Ubuntu.
Câu trả lời:
Gọi lệnh như vậy:
mkdir -- -a
Điều --
đó có nghĩa là các tùy chọn kết thúc sau đó, do đó, -a
được hiểu theo nghĩa đen và không phải là một tùy chọn mkdir
. Bạn sẽ tìm thấy cú pháp này không chỉ trong mkdir
, mà bất kỳ tiện ích tuân thủ POSIX nào ngoại trừ echo
và test
. Từ đặc điểm kỹ thuật :
Đối số - nên được chấp nhận như là một dấu phân cách chỉ ra sự kết thúc của các tùy chọn. Bất kỳ đối số nào sau đây phải được coi là toán hạng, ngay cả khi chúng bắt đầu bằng ký tự '-'. Không nên sử dụng đối số - làm tùy chọn hoặc toán hạng.
Sử dụng --
như một biện pháp bảo vệ được khuyến nghị cho hầu hết mọi hành động khi bạn xử lý tên tệp và muốn đảm bảo rằng chúng không vi phạm lệnh, ví dụ: khi di chuyển tệp trong một vòng lặp bạn có thể muốn gọi như sau, để tệp có tên là -i
' t (in?) được phân tích chính xác như một tùy chọn:
mv -- "$f" new-"$f"
cc -o -myfile -Wall -myfile.c
một ví dụ chỉ hơi khó khăn. Bất kỳ trình soạn thảo nào có giá trị muối của nó sẽ có thể lưu vào một tệp có tên -myfile.c
nếu bạn yêu cầu nó, nhưng trình biên dịch C có thể sẽ không làm những gì bạn muốn khi đưa ra một danh sách các tùy chọn như vậy.
cc
lệnh Michael đưa ra ở trên, có -o
tùy chọn chỉ định tệp đầu ra.
for f in ./*; do...
hơnfor f in *; do...
Cách đơn giản nhất nên làm việc với bất kỳ chương trình hợp lý nào là sử dụng tên đường dẫn tương đối phía trước -
, ví dụ: mkdir ./-a
sẽ tạo một thư mục được gọi -a
trong thư mục làm việc hiện tại.
Ví dụ phổ biến nhất về việc sử dụng "mẹo" này là khi bạn muốn xóa một tệp bắt đầu bằng dấu gạch ngang, vì vậy bạn có thể làm rm ./-a
.
./
luôn là một ý tưởng hay, hãy tưởng tượng bạn đã tạo một tệp được gọi -rf
và sau đó bạn đã gọi rm *
.
--
không được hiểu bởi mọi lệnh, chỉ một vài)
--
là một điều bash, vì vậy nó nên hoạt động cho tất cả các chương trình?
Lý do tại sao mkdir '-a'
, hoặc mkdir \-a
không hoạt động là vì cả hai phương pháp này (sử dụng dấu ngoặc kép hoặc dấu gạch chéo ngược) được sử dụng để ngăn vỏ của bạn (có thể bash
) không mang lại cho chúng bất kỳ ý nghĩa đặc biệt nào. Vì -a
dù sao nó cũng không có ý nghĩa gì đặc biệt đối với vỏ, nên những thứ này không ảnh hưởng đến cách nó được truyền lại mkdir
.
Theo như mkdir
có liên quan, nó nhận được một danh sách các đối số từ shell và nó không thể cho biết bạn có đặt chúng trong dấu ngoặc kép hay không, hoặc liệu có dấu gạch chéo ngược hay không. Nó chỉ thấy một đối số -a
. Đó là lý do tại sao bạn cần --
như được giải thích trong các câu trả lời khác.
Ngoài câu trả lời từ "slhck", có một mẹo khác đôi khi hoạt động:
Đặt tên tệp trong câu hỏi trong vòng 2 bộ qoutes khác nhau như "'-a'"
hoặc '"-a"'
.
Việc này có hoạt động hay không phụ thuộc vào chương trình, nhưng đây là biện pháp cuối cùng nếu chương trình không hỗ trợ --
tính năng POSIX .
Phương pháp POSIX luôn được ưa thích vì nó đáng tin cậy 100%.
--
để chấm dứt xử lý tùy chọn cũng cho rằng bạn không cần bất kỳ tùy chọn nào để theo tên tệp, điều này không phải lúc nào cũng đúng.
'-a'
hoặc "-a"
, ít nhất là trên các hệ thống loại BSD