Làm thế nào để biết tham số nào đang được cung cấp cho lệnh với toán tử redirectioin?


9

Những công việc này:

$ echo "thông báo-gửi HELLO" | ngay bây giờ

Đây không phải là:

$ ngay bây giờ <echo "thông báo-gửi HELLO"

Nó nói 'không tìm thấy tập tin hoặc thư mục ".

Tôi hiểu rằng có một -ftùy chọn cho lệnh này, mà tôi có thể cung cấp tệp để thực thi tại một thời điểm nhất định.

Vì vậy, điều này khiến tôi suy nghĩ ... nói chung, làm thế nào để tôi biết tham số nào mà các toán tử chuyển hướng cung cấp giá trị?


5
Câu hỏi của bạn không rõ ràng lắm. Bạn có ý nghĩa gì bởi "tham số nào". Vấn đề của bạn có lẽ là bạn (nhầm lẫn) nghĩ rằng foo | barbar < footương đương. Họ không phải.
terdon

Câu trả lời:


16

Bạn đang sử dụng hai thứ khác nhau ở đây và nên sử dụng thứ ba. Hãy xem nào:

  1. |: Đây là toán tử đường ống , nó phục vụ để chuyển đầu ra của một quá trình làm đầu vào cho một quá trình khác:

    foo | bar

    Điều này chạy chương trình foovà chuyển đầu ra của nó là đầu vào cho chương trình bar.

  2. >, <, >><<: Đây là những nhà khai thác chuyển hướng , họ phục vụ để gửi dữ liệu đến / từ file :

    • foo > bar: chạy chương trình foovà lưu đầu ra của nó vào tệp bar , ghi đè 1 nội dung của nó và tạo nó nếu nó không tồn tại.

    • foo >> bar: chạy chương trình foovà lưu kết quả đầu ra của nó vào tệp bar , nối thêm vào nội dung của nó và tạo nó nếu nó không tồn tại.

    • foo < bar: chạy foo, bảo nó đọc đầu vào từ tệp bar .

    • Đây <<là một trường hợp đặc biệt, vì không có điểm nào trong đầu vào "nối thêm" vào một lệnh, <<chủ yếu (chủ yếu là AFAIK) được sử dụng cho Tài liệu ở đây :

      $ cat << EOF > file.txt
      > Hello World!
      > EOF
      

      Cấu trúc << SomeStringHere > Out.filesẽ chuyển hướng tất cả văn bản được viết cho đến khi nó gặp chuỗi kết thúc ( EOFtrong ví dụ trên) đến tệp đích. Tại đây, tài liệu cho phép bạn dễ dàng định dạng các chuỗi nhiều dòng và bao gồm các biến và ký tự đặc biệt.

  3. Các <<<nhà điều hành, các Dưới đây Chuỗi , giống như một tài liệu ở đây nhưng nó mở rộng các biến. Ví dụ:

    grep foo <<< "$bar"

    Lệnh trên tương đương với echo "$bar" | grep foo.

  4. Những gì bạn đang thực sự tìm kiếm được gọi là thay thế quá trình và là một cách khác để chuyển đầu ra của lệnh sang lệnh khác. Nó bao gồm <(command).

    foo <(bar) 

    Vì vậy, atví dụ của bạn , bạn có thể làm

    at now < <(echo "notify-send HELLO")

    Các công việc trên bởi vì sự thay thế quá trình thực sự tạo ra một tệp (đọc liên kết ở trên để biết thêm chi tiết) và đó là mô tả tệp của tệp đó được truyền <tới at now.


1 Hành vi mặc định là ghi đè, điều này có thể được sửa đổi bằng cách đặt noclobbertùy chọn thành bash. Nếu được đặt, echo foo > barsẽ thất bại nếu bartồn tại. Trong trường hợp đó, nó có thể bị buộc sử dụng echo foo |> barthay thế. Xem phần 3.6.2 tại đây .


1
Câu trả lời tốt đẹp! rất kỹ lưỡng (đặc biệt bao gồm sự khác biệt giữa các bộ chuyển hướng tập tin)
Steeldo

@steel ấn aww, shucks, cảm ơn :) Và điều này đã được đánh giá cao. Tôi ước tôi có thể cho bạn +1 cho mỗi cạm bẫy khác nhau mà giải pháp của bạn âm thầm tránh.
terdon

Bạn có thể vui lòng mở rộng để bao gồm một số thông tin về <<<<<(mà @steel ấn đã đề cập trong câu trả lời của anh ấy). Hơn nữa, có nhiều hơn - một cái gì đó như >>>>>>hay <<<<<<<<<<?
Aditya

@Aditya đã xong. Và đừng lo lắng, nó dừng lại ở <<<:)
terdon

12

Trong trường hợp này, echo "notify-send HELLO"là một quy trình không phải là tệp - vì vậy bạn cần thay thế quy trình thay vì chuyển hướng tệp

at now < <(echo "notify-send HELLO")

Bạn cũng có thể đã sử dụng một chuỗi ở đây để tránh echohoàn toàn lệnh

at now <<< "notify-send HELLO"

5
Đã thấy loại câu hỏi mà bạn có xu hướng thích (những câu hỏi tương tự tôi làm) Tôi nghĩ bạn nên dành nhiều thời gian hơn cho Unix & Linux . Chúng ta sống và chết vì những thủ đoạn vỏ sò tuyệt vời ở đó ..
terdon

@terdon: điều tương tự cho người chơi golf perl?
Sylvain Pineau

1
@SylvainPineau oooh vâng. Rất nhiều như vậy :). Nghiêm túc mà nói, loại câu hỏi mà bạn, người thép và tôi thích là phổ biến hơn nhiều ở đó. Nơi tràn đầy đam mê dòng lệnh số của ai là vô lý có kiến thức.
terdon
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.