Основне, що вам потрібно зрозуміти в цьому випадку між обома способами переадресації (> та >>), це:
>
Перенаправляє та переписує інформацію, на яку вона вказувала. Це відбувається під час отримання будь-якої інформації через трубу "|"
>>
Перенаправляє та зв'язує інформацію, на яку вказували. Це відбувається під час отримання будь-якої інформації через трубу "|"
В обох випадках, якщо файл не існує, він буде створений замість цього. Тільки на ">>" інформація буде об'єднана, якщо ви знову запустите її в тому ж файлі. За допомогою ">" ви просто перезаписаєте все, що зробили під час першого запуску.
Але ось угода, коли використовується той же вхідний файл, що і вихідний файл. У цьому конкретному випадку, якщо ви використовуєте ">", ви видаляли б інформацію, яку "вхідна" частина повинна проаналізувати, оскільки вихідний файл буде "перезаписати її". Так у:
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. Залишивши його, ви запасите нерест додатковим процесом.