Может ли zsh получить доступ к стандартной версии программы последнего запуска?

Я часто использую find или locate чтобы узнать о путях.

 (~) locate foobar.mmpz /home/progo/lmms/projects/foobar.mmpz 

Следующий шаг часто заключается в том, чтобы открывать или иным образом манипулировать файлами. В счастливом случае, как выше, я могу это сделать:

 (~) ls `!!` ls `locate foobar.mmpz` /home/progo/lmms/projects/foobar.mmpz 

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

Будет ли способ подключить zsh для хранения stdout в массив для более поздних манипуляций? В конце концов, это задача оболочки перенаправить потоки пользователю. Я думаю, что он может хранить первые N и последние N строк в переменной для немедленного использования позднее, например $? и другие.

Хорошо, так что это довольно круто: https://unix.stackexchange.com/a/59704/5674 . Теперь я спрашиваю о ноу-хау zsh (и переносит код на zsh) для установки такого вида захвата после каждой строки запуска.

2 Solutions collect form web for “Может ли zsh получить доступ к стандартной версии программы последнего запуска?”

Нет никакой функции для захвата вывода с экрана на большинстве эмуляторов терминала. Кажется, я вспоминаю автора xterm («эталонного» эмулятора терминала), заявляющего, что его будет сложно реализовать. Даже если бы это было возможно, оболочке пришлось бы отслеживать, где было последнее приглашение.

Таким образом, вам не удастся снова запустить команду, если только вы не используете ручной механизм, специфичный для терминала, такой как копирование с помощью мыши в xterm или с клавиатуры на экране.

Было бы крайне нецелесообразно, чтобы оболочка автоматически фиксировала вывод команд, потому что не может отличать команды, которые имеют сложные терминальные и пользовательские взаимодействия от команд, которые просто выводят печатные символы.

Вы можете повторно запустить команду и захватить ее выход. Существуют различные способы сделать каждый. Для повторного запуска команды вы можете использовать:

  • !! замена истории – наиболее удобный для ввода;
  • fc -e - , который можно использовать в функции.

Чтобы захватить вывод, вы можете использовать подстановку команд или следующую функцию:

 K () { lines=("${(f@)$(cat)}") } !! |K 

Это задает массив lines для вывода команды, которая поступает в нее.

Вот первый отрезок чего-то, чтобы поместить последнюю строку вывода в переменную с именем $lastline .

 precmd () { exec 2>&- >&- lastline=$(tail -1 ~/.command.out) sleep 0.1 # TODO: synchronize better exec > /dev/tty 2>&1 } preexec() { exec > >(tee ~/.command.out&) } 

Это использует preexec 's preexec hook для запуска exec с tee для хранения копии команды stdout, затем использует precmd для чтения сохраненного вывода и восстановления stdout, чтобы быть только терминалом для отображения приглашения.

Но он все еще нуждается в некоторой работе. Например, поскольку stdout больше не является терминалом, такие программы, как vim и less , не работают должным образом.

В этих вопросах есть полезная информация:

  • Могу ли я настроить оболочку для печати STDERR и STDOUT в разных цветах?
  • Показывать только stderr на экране, но записывать как stdout, так и stderr в файл
  • Присвоение нового значения непосредственно в индекс символа значения в массиве с zsh
  • Использование редактора строк zsh для обтекания подпроцессов
  • ZHH имеет две вкладки для заполнения имен файлов
  • Постоянный каталог стеков через сессии в zsh
  • Передача определений переменных в определенные оболочки в ssh
  • хранить файл с недопустимыми символами
  • Возможно ли иметь привязки клавиш vim в терминале?
  • Заполнение поддельных каталогов avfs в zsh
  • «Команда не найдена», когда функция sudo'ing от ~ / .zshrc
  • Асинхронный RPROMPT?
  • Выполните заданную команду на каждом подпути длинного пути
  • Почему zsh открывает дескриптор файла одним?
  • Interesting Posts

    Сравните файлы и расскажите, насколько они похожи

    Программный брандмауэр с "файлами зоны"

    как объединить разные файлы, имеющие один и тот же заголовок, но немного другое имя файла?

    Как завершить фоновый процесс в Linux, когда pid неизвестен?

    Awk и отбрасывание несовпадающих токенов в строке?

    Использование переменных bash в команде perl в сценарии bash

    Как получить права доступа к файлу в определенном формате?

    Слияние 2 файлов и сохранение одного дубликата

    дата не работает для заданного времени

    Как запустить «fsck -y» при следующей загрузке в Ubuntu

    Как сделать зарегистрированное доменное имя решением для локального / частного IP-адреса

    Как выполнить замену текста в иерархии больших папок?

    Переменная в sed

    Как установить Kali linux на конкретный (существующий) раздел на USB-накопителе

    Не удается подключиться к статическому IP-адресу Virtualbox VM, который находится в другой подсети от IP-адреса хоста, но статически маршрутизирован на хост HW addr

    Linux и Unix - лучшая ОС в мире.