Вы не понимаете, как система обрабатывает файлы.
Вы удаляете запись файла, но файл все еще существует, пока программа хранит его дескриптор. Таким образом, tee никогда не уведомляется о том, что запись была удалена, и все равно пишет в файл!
Уникальный файл может иметь много записей благодаря жестким ссылкам (, созданным командой ln ).
Вы можете написать свою собственную версию tee, которая будет закрывать и открывать файл при каждой строке, которую он записывает в файл, но это будет очень -неэффективно, так как будет генерироваться слишком много системных вызовов.
Вот функция оболочки -, которая разделит ввод на несколько файлов:
splitSizeInKio=100
splitInput(){
local PS4='+splitInput+ '
set -x
local i=0
local fname="$1"
local ii
while true
do if [ $i -lt 10 ]
then ii=0$i
else ii=$i
fi
local outfile="$fname".$ii
dd of="$outfile" bs=1024 count=$splitSizeInKio
i=$((i+1))
done
}
(Вы могли бы использовать "head" вместо "dd", если вы разлили количество строк вместо размера.)
В bash вы можете использовать «подстановку процесса» следующим образом:
prog1 | tee >( splitInput somefilename ) | prog2
Добавление следующего кода в начало скрипта должно предотвратить подобные ошибки:
# If script is run inside tmux, exit without doing anything
if [[ -n $TMUX ]]; then
echo "Nested tmux sessions not supported!"
exit 0
fi