Question sur l'opérateur de redirection <> Linux

2

J'étudie pour ma LPIC-1 et je suis dérouté par l'opérateur de redirection <>. Je sais que la définition officielle de ceci est qu'il "fait en sorte que le fichier spécifié soit utilisé à la fois pour l'entrée standard et la sortie standard" ... mais je suis toujours confus.

Quelqu'un pourrait-il fournir un exemple de comment / quand j'utiliserais l'opérateur de redirection <> sous Linux?

Mike B
la source
Une bonne explication, mais uniquement en allemand, sur la redirection en bash que je connais peut être trouvée ici .
Nuchoco

Réponses:

4

Un exemple serait lorsque vous devez fournir des données d'entrée de programme et envoyer des données de sortie quelque part (par exemple, un fichier):

$ sort < data.txt > result.txt

Cela exécute les données data.txtvia la commande de tri et envoie la sortie à result.txt. C'est identique à faire ceci:

$ sort data.txt > result.txt

Pensez-y comme ceci:

(2 <- 1) -> 3

Le fichier du milieu est envoyé au programme au numéro 2 et le résultat est finalement envoyé à 3.

John T
la source
Vous êtes les bienvenus! :)
John T
Je pense qu'il existe une différence fonctionnelle entre "sort data.txt" et "sort <data.txt". Dans le premier cas, l'utilitaire doit comprendre comment ouvrir et lire un fichier dans le système de fichiers. Dans ce dernier cas, l’utilitaire doit seulement comprendre comment lire du texte à partir de la "norme en", qui est généralement le clavier pour l’accès au terminal interactif. J'ai peut-être tort.
pcapademic
3

Si la réponse de John T était ce que vous vouliez, vous avez mal posé la question :)

Il a décrit succinctement les opérateurs <et>, mais vous avez posé des questions sur <>. Ceci est un opérateur rarement utilisé que je ne pense pas pouvoir voir dans LPIC-1, mais juste pour mémoire (étant donné que vous en avez probablement déjà terminé avec cet examen):

Lorsque vous exécutez une commande de manière interactive sans rediriger son entrée standard, les sorties et les erreurs seront normalement associées au tty; il va lire stdin et écrire sur stdout / stderr. Bien que vous ne puissiez pas vous y attendre, ces descripteurs de fichier sont généralement ouverts en lecture-écriture. Essayez de lancer un script comme

#!/bin/bash
echo "I'm writing to stdin!" >&0

Exécuter ceci nu fonctionnera, au moins dans les versions actuelles de bash . Cependant, lorsque vous utilisez les redirecteurs <et>, les descripteurs de fichier stdin et stdout ne sont ouverts qu'en lecture et en écriture, donc si vous appelez cela avec une entrée redirigée depuis un fichier -

./write-to-stdin < /tmp/some-input

cela ne fonctionnera pas (assez raisonnablement). Si vous voulez vraiment qu'un programme que vous appelez avec la redirection puisse écrire et écrire dans un seul descripteur de fichier, <> fera le travail.

./read-and-write-stdin   <> /tmp/some-input-and-output
./read-and-write-stdout 1<> /tmp/some-input-and-output

Comme la plupart des programmes n'attendent que stdin un descripteur de lecture et que stdout un descripteur d'écriture, vous pouvez probablement comprendre pourquoi cela est rarement utile, mais si vous écrivez des scripts subordonnés (ou utilisez des fonctions), vous pouvez tirer parti du comportement toi même.

jmb
la source