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" è:
rev
si prepara a invertire il contenuto file.txt
e inviarlo alla pipe
- Durante l'
rev
invio delle informazioni alla pipe, pipe le trasmette direttamente a cat
.
- Mentre
cat
riceve 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.
cat
non aspetterò rev
di 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.txt
mentre attende che le nuove informazioni arrivino ad esso. Con >> aprirebbe una connessione file.txt
e attenderebbe nuove informazioni sull'ultima riga rilevata.
- Dato che le informazioni erano già state cancellate
file.txt
con > , rev
avrebbero provato a farlo funzionare e non ottenere nulla perché cat
cancellato 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.txt
non è lo stesso del file di output file2.txt
. Dopo di che stai letteralmente sovrascrivendo il tutto file2.txt
con file.txt
, quindi tutto il processo fatto da è cat
stato eliminato. Fondamentalmente l'intera riga potrebbe essere semplificata come cp file.txt file2.txt
perché sta facendo la stessa cosa poiché file2.txt
alla fine perde la rev
e viene sovrascritta con il mv
comando.
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.
cat
fuori come questo:rev file.txt > file2.txt && mv file2.txt file.txt
. Questo è un uso superfluo dicat
. Lasciandolo fuori risparmi generando un ulteriore processo.