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:
rev
se prépare à inverser le contenu de file.txt
et à l'envoyer au tuyau
- Pendant l'
rev
envoi des informations au canal, le canal les transmet directement cat
.
- Pendant la
cat
réception des informations, il les appliquera automatiquement à celles avec lesquelles file.txt
elles 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.
cat
n'attendra pas pour rev
diriger 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.txt
en attendant que les nouvelles informations y parviennent. Avec >>, il ouvrirait une connexion avec file.txt
et attendrait de nouvelles informations sur la dernière ligne détectée.
- Étant donné que les informations ont déjà été effacées
file.txt
avec > , rev
j'essaierais de faire son travail et n'obtiendrais rien car cat
tout 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.txt
n'est pas le même que le fichier de sortie file2.txt
. Après cela, vous écrasez littéralement le tout file2.txt
avec 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.txt
car elle fait la même chose puisqu'à file2.txt
la fin perd la rev
et est écrasée par la mv
commande.
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.
cat
comme ç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.