J'ai essayé rev
un fichier, puis je l'ai redirigé, cat > same_file
mais il se transformait en un fichier vierge.
Pendant que j'essayais, rev file.txt | cat > file2.txt && mv file.txt file2.txt;
ça fonctionnait.
Même rev file.txt | cat >> file.txt;
travaillé.
Mais quand j'ai essayé, rev file.txt | cat > file.txt
ça a échoué.
command-line
redirect
Vintux
la source
la source
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.Réponses:
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:
Ce qui se passe réellement dans "l'explication au ralenti" est:
rev
se prépare à inverser le contenu defile.txt
et à l'envoyer au tuyaurev
envoi des informations au canal, le canal les transmet directementcat
.cat
réception des informations, il les appliquera automatiquement à celles avec lesquellesfile.txt
elles ont été définies.cat
n'attendra pas pourrev
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 connexionfile.txt
.file.txt
en attendant que les nouvelles informations y parviennent. Avec >>, il ouvrirait une connexion avecfile.txt
et attendrait de nouvelles informations sur la dernière ligne détectée.file.txt
avec > ,rev
j'essaierais de faire son travail et n'obtiendrais rien carcat
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:
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 sortiefile2.txt
. Après cela, vous écrasez littéralement le toutfile2.txt
avecfile.txt
, donc tout le processus effectué par acat
é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 larev
et est écrasée par lamv
commande.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.
la source
rev file.txt | cat --bogus-option > file.txt
tronquera également le fichier, même si cat ne tentera pas de l'ouvrir.moreutils
) qui comprendsponge
, un outil spécialement conçu pour l'utilisation de l'écrasement d'un fichier d'entrée. Par exemple, larev file.txt >file2.txt && mv file2.txt file.txt
solution de contournement deviendraitrev file.txt | sponge file.txt
, ce qui fonctionnerait correctement même s'il y a déjà quelque chose nomméfile2.txt
.Lorsque le shell voit la redirection, il ouvre d'abord les fichiers pertinents, avant d'exécuter l'une des commandes impliquées. Ainsi, lorsque vous faites:
La redirection vers le
file.txt
fait tronquer avant defoo
s'exécuter et peut être lufile.txt
. En passant, c'est pourquoi vous ne pouvez pas faire:Et pourquoi
sed
a une option d'édition sur place.Enfin, faire:
est une utilisation inutile du chat , surtout si vous essayez de lire
file.txt
plus tôt.Si vous souhaitez inverser un fichier sur place, il n'y a pas de raccourcis . Vous pourrez peut-être utiliser les astuces
sed
ouawk
avec la modification sur place.la source
>
est un redirecteur (opérateur) envoyant la sortie vers autre chose(entrée de la commande suivante, imprimante ..)
Dans votre cas, la sortie va dans un fichier
file.txt
, si ce fichier existe déjà, il est écrasé, sinon il est créé.>>
est un opérateur d'ajout, s'ilfile.txt
existe déjà, la sortie est ajoutée à la fin du fichier. si le fichier n'existe pas, il est créé et la sortie écrite dans le nouveau fichier, identique à>
(redirecteur).la source
>
et>>
.Vous pouvez utiliser Vim en mode Ex:
%
sélectionner toutes les lignes!
exécuter la commandex
sauver et fermerla source