Я часто использую 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 строк в переменной для немедленного последующего использования, как $?
и другие.
Итак, это очень круто: /unix//a/59704/5674 . Теперь я спрашиваю о ноу-хау zsh (и переносе кода на zsh) для настройки захвата такого типа после каждой строки выполнения.
screen
или,script
и крюков precmd и preexec.Ответы:
В большинстве эмуляторов терминала отсутствует функция захвата выходных данных с экрана. Кажется, я вспоминаю автора xterm («эталонный» эмулятор терминала), заявляющего, что это будет трудно реализовать. Даже если бы это было возможно, оболочка должна была бы отслеживать, где было последнее приглашение.
Таким образом, вы не избавитесь от необходимости повторного запуска команды, если не используете ручной, зависящий от терминала механизм, такой как вставка копий с помощью мыши в xterm или с клавиатуры на экране.
Было бы крайне непрактично для оболочки автоматически захватывать выходные данные команд, потому что она не может отличить команды, которые имеют сложные взаимодействия терминала и пользователя, от команд, которые просто выводят печатаемые символы.
Вы можете повторно запустить команду и захватить ее вывод. Есть разные способы сделать каждый. Для повторного запуска команды вы можете использовать:
!!
подстановка истории - удобнее всего набирать текст;fc -e -
, который можно использовать в функции.Чтобы захватить вывод, вы можете использовать подстановку команд или функцию, подобную следующей:
Это задает
lines
массив для вывода команды , что - х по конвейеру в него.источник
K
на вашу.Вот первый фрагмент чего-то, чтобы поместить последнюю строку вывода в переменную с именем
$lastline
.Это использует ЗШ - х
preexec
Крючок для запускаexec
сtee
хранить копию стандартного вывода командования, а затем используетprecmd
для чтения сохраненного вывода и восстановить стандартный вывод будет только терминалом для показа подсказки.Но это все еще нуждается в некоторой работе. Например, поскольку stdout больше не является терминалом, такие программы, как
vim
иless
не работают должным образом.В этих вопросах есть полезная информация:
источник
exec
коде много вызовов, команда выполняется несколько раз, или я попал в особую семантику?exec
без имени программы просто устанавливает перенаправления.Вы можете сделать это, просто отправив свои результаты в
tee
архив, который просто сохранит вывод в файл и отобразит его одновременно.Так, например, вы можете сделать это, который показывает ваш вывод как обычно, но также сохраняет его в файл
/tmp/it
locate foobar.mmpz | tee /tmp/it
затем кошка этого файла и grep его, чтобы выбрать вещи, например,
cat /tmp/it | grep progo | grep lms
затем, чтобы использовать его, вы можете просто сделать это:
vi $(!!)
источник
Я придумал это полуготовое решение:
Это позволяет писать
___
в любой точке командной строки. Предыдущая команда будет перезапущена и___
будет заменена последней строкой ее вывода. Пример использования:Последняя команда будет расширена до
vim foo
.У этого есть некоторые острые края!
Если вы включили
___
в команду, но предыдущая команда также включила a___
, оболочка на некоторое время зависнет в каком-то странном состоянии. Вы можете выйти из этого состояния немедленно с Ctrl- C.Вы также не можете нажать, Tabчтобы расширить
___
, как вы можете с!$
другими конструкциями.Некоторые команды будут отображать различный вывод, когда они выполняются «нормально» и когда они присоединены к каналу. (Сравните вывод
ls
иls | cat
.) Если команда, вызванная___
одним из них, может привести к тому, что вы запустите команду, отличную от ожидаемой.И, конечно, если вы хотите что-то сделать с выходной строкой, отличной от последней, это вам не поможет.
Я выбрал имя,
___
потому что это то, что я никогда не хотел включать в качестве слова в командной строке, даже в качестве аргумента. Вы можете выбрать другое имя, но позаботьтесь о том, чтобы не выбрать что-то, что может быть случайно расширено для вас.источник