Các công cụ Unix: nếu một tệp được đặt tên trừ đi một cái gì đó thì sao?


9

Tôi luôn tự hỏi: hầu hết các công cụ GNU / Unix đều có các tùy chọn ở dạng "trừ một cái gì đó", đôi khi được theo sau bởi một đối số. Điều gì nếu bạn có một tập tin tên là trừ một cái gì đó?

$ ls
-f
$ rm -f
$ ls
-f
$ mv -f abc
mv: missing destination file operand after `abc'
Try `mv --help' for more information.
$ cat -f
cat: invalid option -- 'f'
Try `cat --help' for more information.

hoặc là

$ ls
-ohello.c
$ gcc -ohello -ohello.c
gcc: fatal error: no input files
compilation terminated.

Đây chỉ là sự tò mò; Tôi không có trường hợp sử dụng cho việc này.


Bạn phải tìm cách chuyển chuỗi "-f" theo nghĩa đen cho cuộc gọi hệ thống. Thông thường đó là bằng cách thoát cẩn thận.
Flexo

2
Đối với cử tri 'gần vì lạc đề': Đây là câu hỏi về lập trình shell và cách tránh một vấn đề. Nó hoàn toàn thuộc chủ đề của SO. (OTOH, nó có thể là một bản sao; vấn đề là tìm câu hỏi khác có liên quan.)
Jonathan Leffler

Câu trả lời:


12

Để xóa một tệp có tên -x, sử dụng rm -- -x( --có nghĩa là kết thúc các tùy chọn) hoặc rm ./-x.


10

Nó là khá phổ biến để hỏi loại câu hỏi này trong cài đặt phỏng vấn. Một cách phổ biến để xử lý các tệp có dấu gạch ngang là:

$ rm -- -f
$ rm ./-f

6

Một câu hỏi phổ biến trong Unix. Cách chính là cung cấp tên đường dẫn đầy đủ cho tệp, vì vậy nó không có dấu gạch ngang phía trước:

$ rm -file.txt
unknown option -l

$ rm ./-file.txt    #No problem!
$ rm $PWD/-file.txt #Same thing

Một số lệnh, bạn có thể sử dụng một dấu gạch ngang (hoặc dấu gạch ngang kép) để kết thúc các tùy chọn. Tuy nhiên, điều này không nhất thiết đúng với tất cả các lệnh hoặc thậm chí cùng một lệnh trên các hệ thống khác nhau.

$ rm -- -file.txt   #Works on Linux but not on some Unix systems

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.