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?


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 .


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"

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.