La chose fondamentale que vous devez saisir dans ce cas entre les deux façons de rediriger (> et >>) est:
>
Redirige et remplace les informations vers lesquelles elles ont été dirigées. Cela se produit lors de la réception d'informations via le canal "|"
>>
Redirige et concatène les informations vers lesquelles il a été signalé. Cela se produit lors de la réception d'informations via le canal "|"
Dans les deux cas, si le fichier n'existe pas, il sera créé à la place. Ce n'est que sur ">>" que les informations seront concaténées si vous les réexécutez sur le même fichier. Avec ">", vous écraseriez simplement tout ce que vous avez fait lors de la première exécution.
Mais voici l'affaire lorsque vous utilisez le même fichier d'entrée que le fichier de sortie. Dans ce cas particulier, si vous utilisez ">", vous supprimez les informations que la partie "entrée" doit analyser, car le fichier de sortie "l'écrase". Donc dans:
rev file.txt | cat > file.txt
Ce qui se passe réellement dans "l'explication au ralenti" est:
revse prépare à inverser le contenu de file.txtet à l'envoyer au tuyau
- Pendant l'
revenvoi des informations au canal, le canal les transmet directement cat.
- Pendant la
catréception des informations, il les appliquera automatiquement à celles avec lesquelles file.txtelles ont été définies.
- Le mot-clé ici est "pendant", car tout se passe en même temps. Veuillez voir les excellents commentaires ci-dessous d'Emil pour avoir une compréhension plus profonde de cette partie.
catn'attendra pas pour revdiriger le fichier entier. Il démarre simplement à la minute où la première partie des informations y parvient, ce qui signifie que, selon le symbole que vous avez utilisé, il ouvrira une connexion file.txt.
- Dans ce cas, puisque vous avez utilisé le > au lieu de >> , le shell tronquera le fichier de sortie, ce qui signifie qu'il ouvrira et effacera les informations
file.txten attendant que les nouvelles informations y parviennent. Avec >>, il ouvrirait une connexion avec file.txtet attendrait de nouvelles informations sur la dernière ligne détectée.
- Étant donné que les informations ont déjà été effacées
file.txtavec > , revj'essaierais de faire son travail et n'obtiendrais rien car cattout a été supprimé en préparation des nouvelles informations.
Alors pourquoi les autres fonctionnent après avoir lu ce qui précède. À cause de ce:
rev file.txt | cat > file2.txt && mv file.txt file2.txt
Ici, vous dirigez vers cat qui envoie les informations vers un autre fichier. Dans ce cas, le fichier d'entrée traité file.txtn'est pas le même que le fichier de sortie file2.txt. Après cela, vous écrasez littéralement le tout file2.txtavec file.txt, donc tout le processus effectué par a catété supprimé. Fondamentalement, la ligne entière pourrait être simplifiée, cp file.txt file2.txtcar elle fait la même chose puisqu'à file2.txtla fin perd la revet est écrasée par la mvcommande.
rev file.txt | cat >> file.txt
Dans ce cas, vous concaténez les informations dans le même fichier. Il ouvre donc uniquement une connexion à ce fichier mais n'efface pas les informations comme vu avec un seul > . Le résultat final doit être, les informations d'origine plus les informations inversées.
catcomme ça:rev file.txt > file2.txt && mv file2.txt file.txt. C'est une utilisation superflue decat. En le laissant de côté, vous épargnez de générer un processus supplémentaire.