Не получается. sar
собирает данные и обобщает их, но он не может составить данные за дни, в которые он не был установлен. sar
не обращается к другим инструментам и не обобщает данные, которые собирают эти инструменты, sar
собирает их напрямую, в реальном времени.
Это не состояние гонки и отсутствие ошибки в WSL или ArchLinux.
Как вы упомянули, это потому, что head
читает больше, чем "должно", и поэтому он может не оставить достаточно или вообще ничего для tail
для работы. Но в стандарте или где-либо еще нет ничего, что говорило бы о том, что head
должен считывать только определенное количество байтов; с тем же успехом он мог бы прочитать весь файл, а затем отбросить все, кроме первой строки.
Чтобы «исправить» это во всех возможных случаях, head
пришлось бы всегда считывать входные данные байт за байтом (, т.е. выполнять системный вызов для каждого байта ), что было бы ужасно неэффективно, и абсолютно бесполезен в 99,999% случаев.
Если вы хотите избежать этого, вы можете
1 )использовать временный файл вместо канала; тогда
{ head -n 2 <tmpfile; tail -n 3 <tmpfile; }
будет работать как положено.
2 )переопределите вашу комбинацию "голова/решка" чем-то другим, например. вawk
:
$ seq 10000 20000 | awk -vH=2 -vT=3 '{if(NR<=H)print; else a[i++%T]=$0}END{if((j=i-T)>0)print "..."; else j=0; while(j<i)print a[j++%T]}'
10000
10001
...
19998
19999
20000