6

Предоставляет ли bash способ вставить последнюю строку вывода предыдущей команды в командную строку?

Например, предположим, что я просто запустил ls -1 и результат был

file1
file2
file3

Существует ли комбинация клавиш, которая может вставить текстовый file3 в положение курсора?

(Аналогично Alt + ., Который вставляет последний аргумент предыдущей команды, но здесь я хочу вставить вывод, а не саму команду.)

5 ответов5

7

Я думаю, что ближе всего вы получите:

$ do_something_with "$(!!|tail -1)"
1

http://www.gnu.org/software/bash/manual/bashref.html#Miscellaneous-Commands

оболочка-расширение-линия (MCe)

Разверните строку, как это делает оболочка. Это выполняет расширение псевдонима и истории, а также все расширения слов оболочки (см. Расширения оболочки).

Например:

$ touch one two three four
$ echo `ls | tail -n1` 

Ctrl+Alt+E

$ echo two
1

Вот неполное решение. Я думаю, что это может быть сделано для работы, более или менее.

Сначала мы организуем захват всех выходных данных клавиатуры, выполняя их в среде script . (Есть много проблем с этим; см. Ниже.) Нам нужно передать флаг -f в script чтобы он немедленно сбрасывал вывод в файл машинописи. Мы также выбираем имя файла в /tmp:

script -f /tmp/typescript

Внутри скриптовой среды мы определяем сочетание клавиш для извлечения последней строки файла машинописного текста и помещаем его в историю: (Я связал команды с Ctl+y Ctl+y, предполагая, что вы не печатаете это очень часто , Ошибка в bash не позволяет связывать команды с последовательностями длиннее двух байтов, что исключает, например, все клавиши Fn .)

bind -x '"\C-y\C-y":history -s $(tail -n2 X|head -n1)'

Теперь, чтобы вставить последнюю строку вывода в текущую командную строку, нам просто нужно набрать ctl-y ctl-y ! ! esc ^ который скопирует последнюю строку вывода в историю, затем вставит расширение истории, затем запустит расширение истории. Вероятно, есть лучший способ сделать это, но такого рода работы. Однако клавиш много, поэтому мы назначаем их макросу клавиатуры:

bind '"\eOP":"\C-y\C-y!!\e^"'

До определенного момента, это работает. Однако теперь нам нужно разобраться с уродливостью script , который сохраняет результат точно так, как он был сгенерирован , управляющими кодами VT-102 и всем остальным. Он сохраняет то, что вы ввели, точно так же, как вы его ввели, включая все ошибки, которые вы возвратили, пробелы и новые символы. Сохраняет возврат каретки (ctl-m), который отправляется в конце каждой строки. Короче говоря, это не тот текст, который вы бы хотели вставить в командную строку.

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

1

Я надеюсь, что это то, что вы просили

ls -l | хвост -1 | тройник

0

Решение, которое работает для меня, хотя и не на 100% реальный ответ, основано на ответах Ричи и Гленна Джекмана, а также на привязке ключа к этой команде.

Команда Гленна снова запустит последнюю программу, захватив ее последнюю строку и заменив себя содержимым строки в командной строке:

"$(!!|tail -1)"

Я хочу прояснить: этот прием снова запустит команду, поэтому, в зависимости от случая, он может быть вредным, медленным или просто неправильным - в зависимости от случая.

Последнее, что нужно было связать комбинацию клавиш:

Я использовал Alt+/, так как он похож на комбинацию клавиш, которая дает последний набранный аргумент Alt+.

bind '"^[/":"\"$(!!|tail -1)\""'

(см. здесь, как работает привязка клавиш)

Теперь добавьте команду bind в мой профиль (.bashrc или .profile или что-то).

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .