La cosa di base che devi cogliere in questo caso tra entrambi i modi di reindirizzamento (> e >>) è:
>
Reindirizza e sovrascrive le informazioni in cui è stato indicato. Ciò accade durante la ricezione di qualsiasi informazione tramite pipe "|"
>>
Reindirizza e concatena le informazioni a cui è stato puntato. Ciò accade durante la ricezione di qualsiasi informazione tramite pipe "|"
In entrambi i casi, se il file non esiste, verrà invece creato. Solo su ">>" le informazioni verranno concatenate se eseguite nuovamente sullo stesso file. Con ">" sovrascriveresti semplicemente tutto ciò che hai fatto alla prima esecuzione.
Ma ecco l'affare quando si utilizza lo stesso file di input del file di output. In quel caso particolare, se usi ">" rimuoveresti le informazioni che la parte "input" deve analizzare, dal momento che il file di output lo "sovrascriverà". Quindi in:
rev file.txt | cat > file.txt
Ciò che sta realmente accadendo nella "spiegazione al rallentatore" è:
revsi prepara a invertire il contenuto file.txte inviarlo alla pipe
- Durante l'
revinvio delle informazioni alla pipe, pipe le trasmette direttamente a cat.
- Mentre
catriceve le informazioni, le applicherà automaticamente a quelle con cui file.txtè stato impostato.
- La parola chiave qui è "while", perché tutto sta accadendo contemporaneamente. Si prega di vedere gli eccellenti commenti qui sotto di Emil per avere una comprensione più profonda di questa parte.
catnon aspetterò revdi reindirizzare l'intero file. Inizierà semplicemente nel momento in cui arriva la prima parte delle informazioni, il che significa che, a seconda del simbolo utilizzato, aprirà una connessione file.txt.
- In questo caso, poiché hai usato > invece di >> , la shell troncerà il file di output, il che significa che aprirà e cancellerà le informazioni
file.txtmentre attende che le nuove informazioni arrivino ad esso. Con >> aprirebbe una connessione file.txte attenderebbe nuove informazioni sull'ultima riga rilevata.
- Dato che le informazioni erano già state cancellate
file.txtcon > , revavrebbero provato a farlo funzionare e non ottenere nulla perché catcancellato tutto in preparazione delle nuove informazioni.
Quindi perché gli altri funzionano dopo aver letto quanto sopra. A causa di ciò:
rev file.txt | cat > file2.txt && mv file.txt file2.txt
Qui stai eseguendo il piping su cat che sta inviando le informazioni a un altro file. In questo caso, il file di input elaborato file.txtnon è lo stesso del file di output file2.txt. Dopo di che stai letteralmente sovrascrivendo il tutto file2.txtcon file.txt, quindi tutto il processo fatto da è catstato eliminato. Fondamentalmente l'intera riga potrebbe essere semplificata come cp file.txt file2.txtperché sta facendo la stessa cosa poiché file2.txtalla fine perde la reve viene sovrascritta con il mvcomando.
rev file.txt | cat >> file.txt
In questo caso stai concatenando le informazioni nello stesso file. Quindi sta solo aprendo una connessione a quel file ma non sta cancellando le informazioni viste con un singolo > . Il risultato finale dovrebbe essere, l'informazione originale più l'informazione invertita.
catfuori come questo:rev file.txt > file2.txt && mv file2.txt file.txt. Questo è un uso superfluo dicat. Lasciandolo fuori risparmi generando un ulteriore processo.