Основне, що вам потрібно зрозуміти в цьому випадку між обома способами переадресації (> та >>), це:
>
Перенаправляє та переписує інформацію, на яку вона вказувала. Це відбувається під час отримання будь-якої інформації через трубу "|"
>>
Перенаправляє та зв'язує інформацію, на яку вказували. Це відбувається під час отримання будь-якої інформації через трубу "|"
В обох випадках, якщо файл не існує, він буде створений замість цього. Тільки на ">>" інформація буде об'єднана, якщо ви знову запустите її в тому ж файлі. За допомогою ">" ви просто перезаписаєте все, що зробили під час першого запуску.
Але ось угода, коли використовується той же вхідний файл, що і вихідний файл. У цьому конкретному випадку, якщо ви використовуєте ">", ви видаляли б інформацію, яку "вхідна" частина повинна проаналізувати, оскільки вихідний файл буде "перезаписати її". Так у:
rev file.txt | cat > file.txt
Що насправді відбувається в "поясненні повільного руху", це:
rev
готується до реверсування вмісту file.txt
та відправлення його на розсип
- Поки
rev
передає інформацію в трубу, труба передає її безпосередньо cat
.
- Поки
cat
отримує інформацію, вона автоматично застосує її до тієї, для якої file.txt
вона була встановлена.
- Ключове слово тут "поки", тому що все відбувається одночасно. Будь ласка, дивіться чудові коментарі Еміля нижче, щоб глибше зрозуміти цю частину.
cat
не чекатиме rev
передачі всього файлу. Він просто розпочне хвилину, коли перша частина інформації потрапить до неї, а це означає, що залежно від того, який символ ви використовували, він відкриє з'єднання file.txt
.
- У цьому випадку, оскільки ви використовували >, а не >> , оболонка буде усікати вихідний файл, що означає, що він відкриє та очистить інформацію,
file.txt
поки очікує на отримання нової інформації до неї. З >> він би відкрив з'єднання з file.txt
і чекав нової інформації на останньому виявленому рядку.
- Так як інформація вже була очищена в
file.txt
с > , rev
буде намагатися зробити свою роботу і нічого не отримати , тому що cat
видалені всі в рамках підготовки до нової інформації.
То чому ж інші працюють, прочитавши вище. Через це:
rev file.txt | cat > file2.txt && mv file.txt file2.txt
Тут ви перекладаєте на кота, який надсилає інформацію в інший файл. У цьому випадку оброблений вхідний файл file.txt
не збігається з вихідним файлом file2.txt
. Після того, що ви буквально перезаписувати все file2.txt
з file.txt
, так що весь процес зроблений cat
був видалений. В основному, весь рядок може бути спрощений, як і cp file.txt file2.txt
тому, що він робить те саме, оскільки file2.txt
в кінці втрачає rev
та перезаписується mv
командою.
rev file.txt | cat >> file.txt
У цьому випадку ви об'єднуєте інформацію в один і той же файл. Таким чином, це лише відкриття з'єднання з цим файлом, але не стирання інформації, як видно з одного > . Кінцевим результатом має бути оригінальна інформація плюс зворотна інформація.
cat
ось так:rev file.txt > file2.txt && mv file2.txt file.txt
. Це зайве використанняcat
. Залишивши його, ви запасите нерест додатковим процесом.