О, але sponge
це не єдиний варіант; вам не доведеться отримувати moreutils
для того, щоб це працювало належним чином. Будь-який механізм працюватиме до тих пір, поки він задовольняє двом наступним вимогам:
- Він приймає ім'я вихідного файла як параметр.
- Він створює вихідний файл лише після того, як буде оброблено весь вхід.
Розумієте, загальновідома проблема, на яку йдеться в ОП, полягає в тому, що оболонка створить усі файли, необхідні для роботи труб, перш ніж навіть почати виконувати команди в конвеєрі, тому саме оболонка насправді скорочується вихідний файл (який, на жаль, також є вхідним файлом) перед будь-якою з команд, навіть мав шанс почати виконання.
tee
Команда не працює, навіть якщо вона задовольняє першу вимогу, оскільки вона не задовольняє другій вимозі: воно завжди буде створювати вихідний файл відразу після запуску, так що, по суті , так погано , як створити трубу прямо в вихідний файл. (Це насправді гірше, тому що його використання вводить недетерміновану випадкову затримку до того, як вихідний файл обрізається, тож ви можете подумати, що він працює, а насправді це не так.)
Отже, все, що нам потрібно для вирішення цієї проблеми, - це якась команда, яка буде буферувати весь свій вхід, перш ніж виробляти будь-який вихід, і яка здатна приймати назву вихідного файла як параметр, так що нам не доведеться передавати його вихід у вихідний файл. Одна з таких команд shuf
. Отже, наступне здійснить те саме, що sponge
і:
shuf --output=file --random-source=/dev/zero
Ці --random-source=/dev/zero
прийоми частини shuf
в робити свою справу , не роблячи перестановку на всіх, так що це буде буфер введення , не зраджуючи його.