Cách đọc tệp dash


15

Làm cách nào tôi có thể đọc tệp gạch ngang từ thiết bị đầu cuối ngoài việc phân định nó với ./

Ví dụ để đọc một - filechúng ta có thể đọc nó bằng cách

cat ./-file_name

Q: Có cách nào khác để đạt được điều tương tự không?


4
cách được đề nghị là thực sự sử dụng ./tiền tố. Đây là thiết bị di động nhất (cf Câu hỏi thường gặp về Unix của usenet)
Olivier Dulac

find . -name "-filename" | xargs catsẽ gửi ./-filename qua đường ống. Đối với trường hợp (đơn giản hóa?) Của bạn là một lỗi, nhưng nó có thể giúp trong các thư mục / tập lệnh lớn.
Walter A

Câu trả lời:


11

Đối với các lệnh nhận đầu vào từ stdin, bạn có thể sử dụng chuyển hướng:

cat <-file_name

ya cái này hoạt động :) vì vậy tôi có 3 cách để đọc chúng bằng cách sử dụng ./ khác bằng cách sử dụng - và cách khác bằng cách sử dụng <, còn cách nào khác để làm điều tương tự không ??
vidhan 10/03/2015

22

Sử dụng gấp đôi --để đánh dấu kết thúc các tùy chọn:

cat -- -<FILENAME>

Các chương trình khác như touch, rmhoặc git checkoutcũng tuân theo quy ước này:

$ touch -- -file
$ ll
total 0
-rw-r--r-- 1 ja ja 0 Mar 10 13:13 -file
$ echo hi! >> -file
$ cat -- -file
hi!
$ rm -- -file
$ echo $?
0

CẢNH BÁO: Đó là cách thực hành tốt để luôn sử dụng --sau rmcác tập lệnh. Kẻ tấn công có thể đặt --rftệp trong một thư mục và rm *sẽ lấy nó làm tham số chạy. Xem cái này:

$ touch A
$ touch B
$ mkdir dir
$ touch dir/C
$ touch -- -rf
$ rm *
$ ll
total 0
-rw-r--r-- 1 ja ja 0 Mar 10 13:21 -rf

Rất tiếc, điều này không có nghĩa là chúng tôi không muốn xóa các thư mục. Chúng ta nên sử dụng --:

$ touch A
$ touch B
$ mkdir dir
$ touch dir/C
$ touch -- -rf
$ rm -- *
rm: cannot remove `dir': Is a directory
$ ll
total 4.0K
drwxr-xr-x 2 ja ja 4.0K Mar 10 13:22 dir

3
Bạn không thể tin tưởng vào mọi chương trình thực hiện --: nhiều người làm nhưng không phải tất cả.
glenn jackman 10/03/2015

2
Có thật không? Tôi đã không nói rằng tất cả các chương trình thực hiện --, tôi nói đã cho thấy một số điều đó.
Arkadiusz Drabchot

1
@vidhan: tôi không biết bất kỳ lựa chọn nào khác.
Arkadiusz Drabchot 10/03/2015

1
@vidhan bạn cũng có thể làm phức tạp cuộc sống của mình mà không có lý do và làm điều gì đó như find . -name '-file_name' -exec cat {} \; nhưng thực sự không có nhiều điểm cho nó.
terdon

2
Điều này không hoạt động nếu tập tin được đặt tên -và không có gì khác? Điều này xuất hiện trong wargame: overthewire.org/wargames/bandit/bandit2.html
ThisClark

2

Các lựa chọn thay thế trở nên kỳ lạ:

dd if=-x 2>/dev/null
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.