Существуют ли инкрементные (интерактивные) утилиты оболочки? То есть "онлайн" сортировка, туалет и т. д. - PullRequest
3 голосов
/ 20 мая 2011

Существуют ли версии (вставные замены) стандартных утилит оболочки, которые отображают (частичные) результаты, обновляемые на лету (возможно, в stderr)?

Скажите, что я хочу сделать это:

du ~/* -s | sort -rn | head

Сначала абсолютно ничего не происходит, прежде чем du будет сделано.Однако я хотел бы видеть частичные результаты, т.е. я хочу, чтобы sort показывал данные, которые он уже видел.Таким образом, я могу быстро увидеть, если что-то не так с выводом и исправить это.Например, при запуске grep.

То же самое с этим:

du ~/* -s | wc

Я бы хотел, чтобы он обновлялся на лету.

Вот уродливый обходной путь, показывающийчто я хочу.(Но, предпочтительно, он не должен излишне занимать весь экран, как с du ниже.)

du ~/* -s > /tmp/duout | watch -n .1 sort -rn /tmp/duout

du ~/* -s > /tmp/duout | watch -n .1 wc /tmp/duout

Однако я бы предпочел, чтобы я просто делал так:

du ~/* -s | isort -rn

Ответы [ 4 ]

4 голосов
/ 20 мая 2011

Существует множество утилит оболочки, которые отображают активные результаты.Хорошим примером может служить программа top.

Беда в том, что такого рода инструменты НЕ поддаются обычной методологии ввода и вывода linux.Sort предназначен для приема входного потока, его сортировки и вывода.Затем вы можете взять этот вывод и сделать что-то еще с ним.Если он выводит инкрементные версии, он будет бесполезен для дальнейшей обработки.

Если вам нужны конкретные данные для просмотра частичных данных, вам придется самостоятельно их взламывать.Это диаметрально противоположно нормальному рабочему процессу и огромной трате вычислительных ресурсов.Такое излишество оставлено на усмотрение читателя:)

Если у вас есть другая конкретная утилита и вы хотите знать, будет ли альтернативная система отображения, не стесняйтесь спрашивать.Что касается упомянутых вами, в частности sort, они не существуют.Отображение результатов в sort в режиме реального времени замедлит результаты на несколько порядков, и никто не захочет смотреть результаты за счет ожидания конечного результата в десять, сто или тысячу раз дольше.

1 голос
/ 20 мая 2011

Вы можете вставить tee /dev/tty в последовательность каналов для печати промежуточных результатов.tee дублирует стандартный ввод, отправляя вывод как на стандартный вывод, так и на любые файлы, указанные в командной строке.Вы можете использовать этот трюк для просмотра вывода du, одновременно передавая его для сортировки:

du ~/* -s | tee /dev/tty | sort -rn | head

Промежуточный вывод будет конфликтовать с выводом сортировки.Вы можете обойти это с помощью различных трюков с оболочкой;например, отправив вывод сортировки на пейджер:

du ~/* -s | tee /dev/tty | sort -rn | less
0 голосов
/ 20 мая 2011

В обычном случае сортировки данных вам нужно прочитать все данные, прежде чем вы сможете начать печатать значение для строки 1 данных, верно?И, как вы упоминаете, то же самое с du -s (что означает сводку, это также сортировка и сортировка данных).Извлеките -s, и вы сразу же получите несумянный вывод.

Так что вам всегда придется ждать такого рода вещей.Одна вещь, которую вы можете сделать с вашим первым примером, - это добавить tee в поток данных

du ~/* -s | tee /dev/tty | sort -rn | head

или даже

du ~/* -s | tee /dev/tty8 | sort -rn | tee /dev/tty12 | head

, где tty8 и tty12 - отдельные окна терминала,и вы нашли правильный ttyN для замены, используя tty в окне оболочки.

Надеюсь, это поможет.

PS, поскольку вы выглядите как новый пользователь, если вы получаетеответ, который поможет вам, не забудьте пометить его как принятый и / или дать ему + (или -) в качестве полезного ответа.

0 голосов
/ 20 мая 2011

Проблема не в утилитах, а в самой оболочке. Вам нужна другая оболочка, которая будет запускать каждый процесс в цепочке труб одновременно. Утилиты все потокового ввода просто отлично. Запустите рекурсивный grep, чтобы доказать это себе.

...