Я сумніваюся, що така поведінка передбачувана (і, безумовно, від цього не залежатиме). tee
Команда , ймовірно , починається новий процес , щоб відправити свій внесок в «інше» призначення. Операційна система буде «буферувати» вихід, поки не досягне точки, де він створює файл призначення і записує свій тимчасовий буфер у файл. Точний момент, коли це станеться (і замінить джерело), ймовірно, залежить від:
- Розмір файлу та наявна пам'ять для буфера
- Час, що минув
- Якщо вхід з труби
tee
закінчується
Це йде глибше, ніж bash
: Це те, як програми bash
починають роботу. Оболонка просто інтерпретує команди, які ви вводите, і запускає програми, необхідні для виконання команд. Оболонка не має контролю над тим, як працює кожна програма, а ще менше, як ці програми взаємодіють. Попросити програму (або набір програм) взяти дані з вхідного файлу та записати результат у той самий вхідний файл у тому самому реченні - це відповідальність користувача.
Не забувайте, що bash - це лише інтерпретатор команд користувача: це лише shell
навколо операційної системи для перетворення намірів користувача в системні виклики.
І це теж задокументовано ! Або цей лист , який вирішує подібні проблеми. Або ця нитка StackOverflow . Або цей потік сервера за замовчуванням .
Зверніть увагу , що це може статися і з перенаправленням stdin
: якщо взяти входи команди з файлу $ myprog < commandfile
. Якщо myprog
пише в commandfile, немає гарантії, що всі commandfile
команди будуть виконані .
Дійсно базовою аналогією було б щось подібне до цього списку інструкцій:
- Execute the instructions step by step
- Dip this instruction list in a bucket of black paint
- Type in the following commands:
find /etc -type f -exec cat '{}' \; | tr -c '.[:digit:]' '\n' \
| grep '^[^.][^.]*\.[^.][^.]*\.[^.][^.]*\.[^.][^.]*$'
Я б уявив, що ти зробиш копію спочатку? (команда взята з Посібника з розширеного сценарію Bash )
GNU sort
ви можете використовувати-o
опцію:sort file1 -o file1
.