Может ли 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) для установки такого вида захвата после каждой строки запуска.

  • ANDed условное использование regexp и переменных
  • Как создать привязку ключей для повторного поиска конфигурации оболочки без сохранения новой команды в истории?
  • Липкие записи в истории оболочки
  • Как обновить приглашение на изменение каталога
  • Как написать настраиваемое имя файла для конкретных каталогов в zsh?
  • PS1 = '$ (pwd)' почему это работает и почему это отличается от PS1 = $ (pwd)
  • zsh !! и! $ auto выполняется так же, как и в bash
  • Выполните заданную команду на каждом подпути длинного пути
  • 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 в файл
    Linux и Unix - лучшая ОС в мире.