Comment savoir quel paramètre est fourni à une commande avec un opérateur de redirection?

9

Cela marche:

$ echo "notifier-envoyer BONJOUR" | maintenant

Cela ne veut pas:

$ at now <echo "notify-send HELLO"

Il dit "fichier ou répertoire introuvable".

Je comprends qu'il y a une -foption à cette commande, avec laquelle je peux fournir le fichier à exécuter à un moment donné.

Donc, cela m'a fait réfléchir ... en général, comment savoir pour quel paramètre les opérateurs de redirection fournissent la valeur?

vlad-ardelean
la source
5
Votre question n'est pas très claire. Qu'entendez-vous par "quel paramètre". Votre problème est probablement que vous (à tort) pensez cela foo | baret que vous bar < fooêtes équivalent. Ils ne sont pas.
terdon

Réponses:

16

Vous utilisez deux choses différentes ici et devriez en utiliser une troisième. Voyons voir:

  1. |: Ceci est l' opérateur de tuyau , il sert à passer la sortie d'un processus en entrée à un autre:

    foo | bar

    Cela exécute le programme fooet transmet sa sortie en entrée au programme bar.

  2. >, <, >>Et <<: Ce sont les opérateurs de redirection , ils servent à envoyer des données à / de fichiers :

    • foo > bar: exécute le programme fooet enregistre sa sortie dans le fichier bar , écrase 1 son contenu et le crée s'il n'existe pas.

    • foo >> bar: exécute le programme fooet enregistre sa sortie dans le fichier bar , l' ajoute à son contenu et le crée s'il n'existe pas.

    • foo < bar: s'exécute foo, lui disant de lire l'entrée du fichier bar .

    • C'est <<un cas particulier, car il n'y a aucun intérêt à "ajouter" une entrée à une commande, <<c'est principalement (exclusivement AFAIK) utilisé pour Here Documents :

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

      La construction << SomeStringHere > Out.fileredirigera tout le texte écrit jusqu'à ce qu'il rencontre la chaîne de fin ( EOFdans l'exemple ci-dessus) vers le fichier cible. Ici, les documents vous permettent de formater facilement des chaînes multi-lignes et d'inclure des variables et des caractères spéciaux.

  3. L' <<<opérateur, la chaîne Here , est comme un document Here mais il développe les variables. Ainsi, par exemple:

    grep foo <<< "$bar"

    La commande ci-dessus est équivalente à echo "$bar" | grep foo.

  4. Ce que vous recherchez réellement s'appelle la substitution de processus et est une autre façon de passer la sortie d'une commande à une autre. Il se compose de <(command).

    foo <(bar) 

    Donc, pour votre atexemple, vous pourriez faire

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

    Ce qui précède fonctionne car la substitution de processus crée réellement un fichier (lisez le lien ci-dessus pour plus de détails) et c'est le descripteur de fichier de ce fichier qui est transmis <à at now.


1 Le comportement par défaut est d'écraser, cela peut être modifié en définissant l' noclobberoption sur bash. S'il est défini, echo foo > baréchouera s'il barexiste. Dans ce cas, il peut être forcé d'utiliser à la echo foo |> barplace. Voir la section 3.6.2 ici .

terdon
la source
1
Bonne réponse! très approfondi (notamment en ce qui concerne les différences entre les redirecteurs de fichiers)
steeldriver
@steeldriver AWW, zut, merci :) Et était ce sous bijou apprécié. Je souhaite que j'aurais pu vous donner un +1 pour chacun des différents pièges que votre solution évite en silence.
terdon
Pourriez-vous s'il vous plaît également développer pour inclure des informations sur <<et <<<(que @steeldriver a mentionné dans sa réponse). De plus, y a-t-il plus - quelque chose comme >>>>>>ou <<<<<<<<<<?
Aditya
@Aditya fait. Et ne vous inquiétez pas, ça s'arrête à <<<:)
terdon
12

Dans ce cas, echo "notify-send HELLO"est un processus et non un fichier - vous avez donc besoin d'une substitution de processus plutôt que d'une redirection de fichier

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

Vous auriez également pu utiliser une chaîne ici pour éviter echocomplètement la commande

at now <<< "notify-send HELLO"
tournevis
la source
5
Après avoir vu le genre de questions que vous avez tendance à aimer (les mêmes que moi), je pense que vous devriez passer plus de temps sur Unix et Linux . Nous vivons et mourons pour des tours de coquillage sympas là-bas ..
terdon
@terdon: même chose pour les golfeurs de Perl?
Sylvain Pineau
1
@SylvainPineau oooh ouais. Tout à fait :). Sérieusement, le genre de question que vous, le conducteur d'acier et moi apprécions est beaucoup plus courant là-bas. L'endroit est plein de geeks commandline certains de qui sont absurdement bien informés.
terdon