Redirection de command vers plusieurs files: command> file1> file2

J'ai cette command:

cat somefile >file1 >file2 

Après avoir exécuté cette command, je ne peux pas comprendre pourquoi file1 n'a rien. Il devrait avoir la sortie du premier file ( somefile ), mais rien n'est dedans.

Pouvez-vous m'expliquer pourquoi il ne copy pas ou n'écrit pas ma sortie de somefile ? ( file2 contient ma sortie, mais file1 ne contient rien)

Je pense qu'il y a une différence entre la façon dont vous pensez que la redirection de shell fonctionne et comment elle fonctionne réellement.

Vous ne pouvez pas redirect la sortie du shell plusieurs fois et vous attendre à ce qu'il soit redirigé vers tous les locations que vous avez spécifiés. Au lieu de cela, il ne sera redirigé vers le dernier location, qui dans votre cas est file2 . La réponse de Chaos fournit une explication décente sur le fonctionnement de cette redirection d'E / S.

Ce que vous voulez vraiment faire est:

 $ cat example.txt | tee file1 > file2 

tee est un programme qui lit à partir de l'input standard et écrit dans plusieurs descripteurs de files. L'un d'eux est toujours la sortie standard. Nous utilisons donc tee pour écrire la sortie dans file1 , puis redirect sa stdout vers file2 .

En outre, sur la base de suggestions dans les commentaires, c'est une meilleure façon de faire ce que vous cherchez:

 $ tee file1 > file2 < example.txt 

Cette approche a l'avantage de redirect le stdin au lieu d'essayer de lire un tube. Cela signifie que le shell doit maintenant générer un process de less. Il élimine également ce que l'on appelle «l'utilisation inutile du chat».

Ce que vous avez fait, s'appelle I / O-Redirection . >file redirige la sortie standard (stdout) vers le file donné. Dans votre cas, vous l'avez fait 2 fois. Le shell ne gère pas une redirection de la même sortie plusieurs fois.

Dans ce cas:

 cat somefile >file1 >file2 

Le shell traite les redirections avant l' cat somefile la command ( cat somefile ). Cela signifie que le > tronque le file à zéro longueur, parce que vous remplacez le contenu des files. Le file doit être vide avant que le shell puisse exécuter la command. Ceci est fait avec les deux > redirections.

Maintenant, le second ( >file2 ) remplace le premier ( >file1 ), car le shell traite la redirection par ordre d'apparition. Donc, le dernier est celui qui sera effectivement utilisé. La sortie de cat somefile sera donc redirigée vers file2 et file1 sera tronquée à zero length.


Redirection de stdout vers plusieurs process / files peut être fait avec tee comme ceci:

 cat somefile | tee file1 file2 file3 fileX 

Cela imprimera le contenu à stdout et à tous les files donnés en tant que parameters.

Dans l' option zsh avec MULTIOS , vous pouvez utiliser:

 cat somefile >file1 >file2 

comme dans ce cas, une action zsh similaire à tee .