Состояние гонки для блоков оболочки в Bash?

Не получается. sar собирает данные и обобщает их, но он не может составить данные за дни, в которые он не был установлен. sar не обращается к другим инструментам и не обобщает данные, которые собирают эти инструменты, sar собирает их напрямую, в реальном времени.

0
28.11.2018, 12:01
1 ответ

Это не состояние гонки и отсутствие ошибки в 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
2
28.01.2020, 02:23

Теги

Похожие вопросы