Nano Hash - криптовалюты, майнинг, программирование

bash однострочник для открытия `less` на последнем экране без временных файлов

Я пытаюсь создать однострочник для открытия less на последнем экране многоэкранного вывода, поступающего из стандартного ввода. Причина этого в том, что я работаю над программой, которая создает длинное AST, и мне нужно иметь возможность перемещаться по ней вверх и вниз, но я бы предпочел начать снизу. Я придумал это:

$ python a.py 2>&1 | tee >(lines=+$(( $(wc -l) - $LINES))) | less +$lines

Во-первых, мне нужно вычислить количество строк в выводе и вычесть из него $LINES, чтобы я знал, какая самая верхняя строка на последнем экране. Позже мне нужно будет повторно использовать вывод a.py, поэтому для этой цели я использую tee с заменой процесса. В качестве последнего шага я указываю less, чтобы открыть исходный стандартный вывод в определенной строке. Конечно, это не работает в Bash, потому что $lines не устанавливается на последнем шаге, так как каждая подкоманда запускается в подоболочке. В ZSH, несмотря на то, что команды канала не выполняются в подоболочке, подстановка процесса все еще выполняется, и поэтому она тоже не работает. Это не домашняя и не рабочая задача, мне просто интересно, можно ли делать то, что я хочу, не создавая временный файл в Bash или ZSH. Любые идеи?

07.01.2016

  • почему python просто не говорит вам, сколько строк он пишет? наверное можно считать... 08.01.2016
  • Это не должно было быть перенесено. 08.01.2016
  • Вопросы об общем вычислительном оборудовании и программном обеспечении не относятся к теме Stack Overflow, если только они напрямую не связаны с инструментами, используемыми в основном для программирования. Вы можете получить помощь по Unix и Linux. 08.01.2016
  • @Gilles: самое смешное, что я задал этот вопрос в U&L, и он был перенесен сюда. 08.01.2016
  • Я тоже не мог понять, почему он был перенесен = s 08.01.2016

Ответы:


1

Настоящим ответом на ваш вопрос должен быть вариант от +G до less, но вы указали, что определение проблемы не является репрезентативным для абстрактной проблемы, которую вы хотите решить. Поэтому, пожалуйста, рассмотрите эту альтернативную задачу:

python a.py 2>&1 | \
awk '
  {a[NR]=$0}
  END{
    print NR
    for (i=1;i<=NR;i++)print a[i]
   }
 ' | {
     read -r l
     less -j-1 +$l
 }

Команда awk печатает количество строк, а затем все строки подряд. Мы определяем первую строку как содержащую некоторую метаинформацию. Это передается группе команд, разделенных { и }. Первая строка потребляется read, которая сохраняет ее в переменной $l. Остальные строки занимает less, где можно использовать эту переменную. Используется -j-1, поэтому совпадающая строка находится внизу экрана.

08.01.2016
  • хорошо, я узнал, что можно сохранить переменные из stdin, используя read, вот так: echo one two | { read l; echo $l ;}. Однако я не совсем уверен, как это будет работать с выводом, который состоит не только из чисел, поэтому он бесполезен для моей конкретной проблемы, но в любом случае хорош. 08.01.2016
  • @ user1042840: Попробуйте заменить первый цикл for на python a.py 2>&1. awk в print NR сделает метаданные пригодным для использования числом, независимо от ввода. 08.01.2016
  • Я сделал это сам, так как должен признать, что это, возможно, запутало. Попробуйте текущую команду. 08.01.2016
  • хорошо, ФАНТАСТИЧЕСКИЙ, это работает, мне просто нужно понять это. Спасибо. 08.01.2016
  • хорошо, так что awk делает, чтобы не потерять стандартный ввод, копирует его целиком + добавляет несколько строк сверху, которые позже устанавливаются read? Действительно, очень умный. Я пытался использовать tee для этой цели, но не смог установить переменную в конвейере, это решение решает эту проблему. 08.01.2016
  • Ты понял. Это уродливый хак, чтобы обойти отсутствие метаданных в текстовых потоках, каким-то образом злоупотребив первой строкой :) 08.01.2016
  • Если общие данные плюс накладные расходы превышают доступную память, это приведет к сбою или смерти, или и тому, и другому. awk может запустить "меньше" с '{a[NR]=$0;} END{ for(i=1;i<=NR;i++) print a[i] | "less -j-1 +" NR }'. 08.01.2016

  • 2

    less поддерживает это изначально. Используемый вами синтаксис + допускает любое меньшее количество команд, которое вы можете ввести во время его работы, включая G для перехода в конец.

    ... | less +G
    

    делает именно то, что вы хотите.

    На самом деле это явно упоминается в качестве примера на справочной странице (ищите "+G" ).

    07.01.2016
  • круто, спасибо, я наверное пропустил. Это полностью решает мою проблему, но просто любопытно, знаете ли вы какой-нибудь способ сделать это без +G? Я знаю, что это немного бессмысленно, но я просто хочу убедиться, что это невозможно без создания временных файлов от более опытных пользователей. 08.01.2016
  • Если у вас есть вопрос об установке переменных в конвейере, я предлагаю вам задать новый вопрос в этом контексте явно. По крайней мере, это, вероятно, зависит от оболочки. 08.01.2016
  • Я пометил этот вопрос Bash и ZSH, так как меня интересуют только эти два. Я думаю, что установка переменных внутри конвейера просто невозможна по дизайну в Bash и невозможна, когда где-то по пути в ZSH используется подстановка процесса. Боюсь, что такой вопрос, вероятно, не получит большего внимания, чем этот. Эта проблема очень специфична, но на самом деле она сводится к установке переменных внутри подоболочек, поэтому идеальным решением для нее было бы вообще избегать подоболочек, но я понятия не имею, как это сделать и возможно ли это вообще. 08.01.2016
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..