Come dire quale parametro viene fornito a un comando con un operatore di reindirizzamento?


9

Questo funziona:

$ echo "notifica-invia CIAO" | a ora

Questo non:

$ at now <echo "notifica-invia CIAO"

Dice "file o directory non trovati".

Capisco che c'è -fun'opzione per questo comando, con cui posso fornire il file da eseguire in un determinato momento.

Quindi questo mi ha fatto pensare ... in generale, come faccio a sapere per quale parametro gli operatori di reindirizzamento forniscono il valore?


5
La tua domanda non è molto chiara Cosa intendi con "quale parametro". Il tuo problema è probabilmente che tu (erroneamente) lo pensi foo | bare bar < foosei equivalente. Non sono.
terdon,

Risposte:


16

Stai usando due cose diverse qui e dovresti usarne una terza. Vediamo:

  1. |: Questo è l' operatore pipe , serve per passare l'output di un processo come input per un altro:

    foo | bar

    Questo esegue il programma fooe passa il suo output come input al programma bar.

  2. >, <, >>E <<: Questi sono gli operatori di redirezione , servono per inviare i dati a / da file :

    • foo > bar: esegue il programma fooe salva il suo output nel file bar , sovrascrivendo 1 il suo contenuto e creandolo se non esiste.

    • foo >> bar: esegue il programma fooe salva il suo output nel file bar , accodandolo al suo contenuto e creandolo se non esiste.

    • foo < bar: corre foo, dicendogli di leggere l'input dal file bar .

    • Questo <<è un caso speciale, poiché non ha senso inserire "unendo" l'input a un comando, <<viene utilizzato principalmente (esclusivamente AFAIK) per Here Documents :

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

      Il costrutto << SomeStringHere > Out.filereindirizzerà tutto il testo scritto fino a quando non incontra la stringa finale ( EOFnell'esempio sopra) sul file di destinazione. Qui i documenti ti consentono di formattare facilmente stringhe multilinea e includere variabili e caratteri speciali.

  3. L' <<<operatore, la stringa Here , è come un documento Here ma espande le variabili. Quindi, per esempio:

    grep foo <<< "$bar"

    Il comando sopra è equivalente a echo "$bar" | grep foo.

  4. Quello che stai effettivamente cercando si chiama sostituzione di processo ed è un altro modo per passare l'output di un comando a un altro. Si compone di <(command).

    foo <(bar) 

    Quindi, per il tuo atesempio, potresti farlo

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

    Quanto sopra funziona perché la sostituzione del processo in realtà crea un file (leggi il link sopra per maggiori dettagli) ed è il descrittore di quel file che viene passato <a at now.


1 Il comportamento predefinito è quello di sovrascrivere, questo può essere modificato impostando l' noclobberopzione su bash. Se impostato, echo foo > barfallirà se baresiste. In tal caso, può essere forzato utilizzando echo foo |> barinvece. Vedere la sezione 3.6.2 qui .


1
Bella risposta! molto approfondito (specialmente includendo le differenze tra i redirector di file)
steeldriver

@steeldriver aww, gusci, grazie :) E così è stato questo sotto gioiello apprezzato. Vorrei poterti dare un +1 per ognuna delle varie insidie ​​che la tua soluzione evita silenziosamente.
terdon,

Potresti espandere anche per includere alcune informazioni su <<e <<<(che @steeldriver ha menzionato nella sua risposta). Inoltre, ce ne sono altri - qualcosa di simile >>>>>>o <<<<<<<<<<?
Aditya,

@Aditya fatto. E non preoccuparti, si ferma alle <<<:)
Terdon,

12

In questo caso, echo "notify-send HELLO"è un processo non un file, quindi è necessario un processo di sostituzione piuttosto che un reindirizzamento del file

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

Avresti anche potuto usare una stringa qui per evitare del echotutto il comando

at now <<< "notify-send HELLO"

5
Avendo visto il tipo di domande che ti piacciono (le stesse che faccio io) penso che dovresti passare un po 'più di tempo su Unix e Linux . Viviamo e moriamo per trucchi conchiglie laggiù ..
Terdon

@terdon: stessa cosa per i golfisti del Perl?
Sylvain Pineau,

1
@SylvainPineau oooh sì. Così tanto :). Seriamente, il tipo di domanda che tu, Steeldriver e io ci divertiamo è molto più comune laggiù. Il posto è pieno di fanatici della linea di comando, alcuni dei quali sono assurdamente informati.
terdon,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.