it-swarm-vi.com

Sử dụng dấu gạch ngang (-) thay cho tên tệp

Đối với một lệnh, nếu sử dụng - làm đối số thay cho tên tệp sẽ có nghĩa là STDIN hoặc STDOUT.

  1. Nhưng trong ví dụ này, nó tạo ra một tệp có tên -:

    echo hello > -
    

    Làm thế nào tôi có thể làm - trong ví dụ này có nghĩa là STDOUT?

  2. Ngược lại, làm thế nào tôi có thể làm - có nghĩa là một tệp có tên - trong các ví dụ như:

    cat -
    
121
Tim

Sử dụng - như một tên tệp có nghĩa là stdin/stdout là một quy ước mà rất nhiều chương trình sử dụng. Nó không phải là một tài sản đặc biệt của tên tệp. Nhân không nhận ra - là đặc biệt nên mọi cuộc gọi hệ thống đều đề cập đến - làm tên tệp sẽ sử dụng - nghĩa đen là tên tệp.

Với chuyển hướng bash, - không được công nhận là tên tệp đặc biệt, vì vậy bash sẽ sử dụng tên đó làm tên tệp theo nghĩa đen.

Khi cat nhìn thấy chuỗi - là tên tệp, nó coi nó là từ đồng nghĩa với stdin. Để giải quyết vấn đề này, bạn cần thay đổi chuỗi mà cat nhìn theo cách mà nó vẫn đề cập đến một tệp có tên -. Cách thông thường để làm điều này là tiền tố tên tệp bằng một đường dẫn - ./-, hoặc là /home/Tim/-. Kỹ thuật này cũng được sử dụng để khắc phục các vấn đề tương tự trong đó các tùy chọn dòng lệnh đụng độ với tên tệp, do đó, một tệp được gọi là ./-e không xuất hiện dưới dạng -e tùy chọn dòng lệnh cho một chương trình, ví dụ.

169
camh
  1. Thay vì echo hello > -, bạn có thể dùng echo hello > /dev/stdout.

    Trong khi '-' là một quy ước phải được thực hiện bởi mỗi chương trình muốn hỗ trợ nó, /dev/stdin, /dev/stdout/dev/stderr, khi được HĐH hỗ trợ (ít nhất là Solaris, Linux và BSD), độc lập với ứng dụng và sau đó sẽ hoạt động như bạn dự định.

18
jlliagre

Như camh đã đề cập , - chỉ là quy ước đặt tên được sử dụng bởi một số chương trình. Nếu bạn muốn tham chiếu các luồng này với một bộ mô tả tệp, Shell sẽ nhận ra, jiliagre đã đúng khi bạn sử dụng tên /dev/stdin hoặc là /dev/stdout thay thế. Những tên tệp đó sẽ hoạt động ở bất kỳ nơi nào mà một tên tệp bình thường sẽ hoạt động.

  1. Điều đó đang được nói, ví dụ đầu tiên của bạn là loại ngớ ngẩn. Bất kỳ đầu ra nào được toán tử chuyển hướng bắt để ghi vào một tệp đã BẬT đầu ra tiêu chuẩn, do đó, việc chuyển hướng nó và ghi lại nó đến nơi nó đến là vô ích. Hành vi bạn sử dụng là đường ống, không phải là chuyển hướng:

    echo hello |
    
  2. Trong ví dụ thứ hai của bạn, bạn chỉ cần đưa ra một số dấu hiệu cho thấy bạn muốn có một tệp rác của tên đó, chứ không phải bí danh nội bộ mà nó có. Bạn có thể làm điều này dễ nhất bằng cách chỉ định đường dẫn đến tệp như thế này:

    cat ./-
    
10
Caleb

Đối với 1, chương trình phải hỗ trợ nó. Bạn không thể tự ý sử dụng nó. Đối với 2, chuyển hướng đầu vào từ (ví dụ: cat < -).

6
bahamat

Cách tiếp cận '-' có rất nhiều vấn đề. Trước hết, nó đòi hỏi một sự giải thích về nhân vật '-' và nhiều chương trình không thực hiện việc giải thích như vậy. Và hơn nữa, có một số chương trình diễn giải một dấu gạch nối là dấu phân cách đánh dấu sự kết thúc của các tùy chọn dòng lệnh. Các chương trình được viết để hoạt động với các đối số tên tệp, cách tiếp cận '-' là một hack, Đẹp nhưng yếu.

Cách tốt nhất là:

$ echo hello > /dev/fd/1

/dev/stdout là một liên kết tượng trưng của /dev/fd/1

1
b3h3m0th

Các ký tự đặc biệt có hai nghĩa chính:

Biểu đồ số ASCII.

Chữ viết hay tượng trưng.

Có thể một ký tự đại diện cho một chuỗi hoặc hoạt động như một chuỗi. theo hiểu biết của tôi.

trong ngôn ngữ C fopen() function có hai đối số luồng tệp đầu tiên và chế độ thứ hai trong đó tệp sẽ được mở. chế độ là một chuỗi. ngay cả khi đó là nhân vật duy nhất.

mèo> "-" hoạt động.

0
Owais Qureshi