Ваш запропонований приклад (нижче) не працює, оскільки ви насправді одночасно читали та записували в той самий файл.
$ cat filename | sort | uniq > filename
Ідея з трубою або переадресацією полягає в тому, що команда з лівої та правої сторони кожної труби або перенаправлення виконується одночасно, паралельно. Команда праворуч обробляє інформацію, коли вона передається їй від команди зліва, в той час як команда зліва все ще виконується.
Для того, щоб ваш сценарій працював, команду, що читає з файлу, потрібно було б виконати до того, як розпочнеться команда, що записує у файл. Для того, щоб це працювало, вам потрібно спочатку перенаправити висновок у тимчасове місце розташування, після чого після завершення відправте його з тимчасового місця назад у файл.
Кращий спосіб зробити це в основному, як у попередньому прикладі, коли ви перенаправляєте на тимчасовий файл, а потім перейменовуєте цей файл у початковий (за винятком того, що вам не потрібно спочатку видаляти файл, оскільки переміщення видаляє будь-яку існуючу ціль) .
$ cat filename | sort | uniq > result
$ mv -f result filename
Ви також можете зберегти його в рядковій змінній, за винятком того, що працює лише тоді, коли даних достатньо мало, щоб одразу вписатись у пам'ять.
echo $(cat filename | sort | uniq > result) > filenameабо щось ? Просто проходячи повз, я не встигаю спробувати це.