Bagaimana cara mengetahui parameter mana yang dipasok ke perintah dengan operator redirectioin?

9

Ini bekerja:

$ echo "notify-send HELLO" | sekarang

Ini tidak:

$ at now <echo "notify-send HELLO"

Dikatakan 'file atau direktori tidak ditemukan ".

Saya mengerti ada -fopsi untuk perintah ini, yang dengannya saya dapat menyediakan file untuk dieksekusi pada saat tertentu.

Jadi ini membuat saya berpikir ... secara umum, bagaimana saya tahu untuk parameter mana operator redirection memberikan nilai?

vlad-ardelean
sumber
5
Pertanyaan Anda tidak terlalu jelas. Apa yang Anda maksud dengan "parameter mana". Masalah Anda mungkin adalah Anda (secara keliru) berpikir foo | bardan bar < foosetara. Mereka tidak.
terdon

Jawaban:

16

Anda menggunakan dua hal berbeda di sini dan harus menggunakan yang ketiga. Ayo lihat:

  1. |: Ini adalah operator pipa , ini berfungsi untuk melewatkan output dari satu proses sebagai input ke yang lain:

    foo | bar

    Ini menjalankan program foodan meneruskan outputnya sebagai input ke program bar.

  2. >, <, >>Dan <<: Ini adalah operator redirection , mereka melayani untuk mengirim data ke / dari file :

    • foo > bar: menjalankan program foodan menyimpan hasilnya ke file bar , menimpa 1 isinya dan membuatnya jika tidak ada.

    • foo >> bar: menjalankan program foodan menyimpan hasilnya ke file bar , menambahkan kontennya dan membuatnya jika tidak ada.

    • foo < bar: berjalan foo, menyuruhnya membaca input dari file bar .

    • Ini <<adalah kasus khusus, karena tidak ada gunanya "menambahkan" input ke perintah, <<ini terutama (khusus AFAIK) yang digunakan untuk Dokumen Di Sini :

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

      Konstruk << SomeStringHere > Out.fileakan mengarahkan ulang semua teks yang ditulis hingga menemukan string akhir ( EOFdalam contoh di atas) ke file target. Di sini dokumen memungkinkan Anda untuk dengan mudah memformat string multi-garis dan memasukkan variabel dan karakter khusus.

  3. The <<<operator, yang Berikut String , seperti Berikut Dokumen tetapi memperluas variabel. Jadi, misalnya:

    grep foo <<< "$bar"

    Perintah di atas setara dengan echo "$bar" | grep foo.

  4. Apa yang sebenarnya Anda cari disebut proses substitusi dan merupakan cara lain untuk meneruskan output dari perintah ke perintah lain. Terdiri dari <(command).

    foo <(bar) 

    Jadi, sebagai atcontoh, Anda bisa melakukannya

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

    Hal di atas berfungsi karena proses substitusi sebenarnya membuat file (baca tautan di atas untuk detail lebih lanjut) dan itu adalah deskriptor file dari file yang diteruskan <ke at now.


1 Perilaku default adalah menimpa, ini dapat dimodifikasi dengan mengatur noclobberopsi untuk bash. Jika diatur, echo foo > barakan gagal jika barada. Dalam hal itu, itu bisa dipaksa menggunakan echo foo |> bar. Lihat bagian 3.6.2 di sini .

terdon
sumber
1
Jawaban bagus! sangat teliti (terutama termasuk perbedaan antara pengalih file)
steeldriver
@steeldriver aww, kampret, thanks :) Dan begitu ini di bawah permata dihargai. Saya berharap saya bisa memberi Anda +1 untuk setiap jebakan berbagai solusi Anda diam-diam menghindari.
terdon
Bisakah Anda juga memperluas untuk memasukkan beberapa informasi tentang <<dan <<<(yang @steeldriver disebutkan dalam jawabannya). Selain itu, apakah ada lebih banyak - sesuatu seperti >>>>>>atau <<<<<<<<<<?
Aditya
@Aditya selesai. Dan jangan khawatir, berhenti di <<<:)
terdon
12

Dalam hal ini, echo "notify-send HELLO"adalah proses bukan file - jadi Anda memerlukan substitusi proses alih-alih pengalihan file

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

Anda juga bisa menggunakan string di sini untuk menghindari echoperintah sepenuhnya

at now <<< "notify-send HELLO"
Steeldriver
sumber
5
Setelah melihat jenis pertanyaan yang cenderung Anda sukai (yang sama saya lakukan) saya pikir Anda harus menghabiskan lebih banyak waktu di Unix & Linux . Kita hidup dan mati untuk trik tempurung yang keren di sana ..
terdon
@terdon: hal yang sama untuk pegolf perl?
Sylvain Pineau
1
@ SilvainPineau oooh ya. Sangat banyak sehingga :). Serius, pertanyaan yang Anda, steeldriver, dan saya nikmati jauh lebih umum di sana. Tempat ini penuh dengan Geeks baris perintah yang beberapa di antaranya adalah kepalang.
terdon