Я знаю, что могу запустить последнюю команду в bash, с !!
, но как мне запустить последнюю строку вывода?
Я думаю о сценарии использования этого вывода:
The program 'git' is currently not installed. You can install it by typing:
sudo apt-get install git
Но я не знаю, как я могу управлять этим. Я имею в виду что-то вроде !!
, может быть, @@
или подобное?
Команда $(!! |& tail -1)
должен сделать:
$ git something
The program 'git' is currently not installed. You can install it by typing:
sudo apt-get install git
$ $(!! |& tail -1)
$(git something |& tail -1)
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following extra packages will be installed:
git-man liberror-perl
Поскольку Вы видите sudo apt-get install git
команда работает.
РЕДАКТИРОВАНИЕ: Разрушение $(!! |& tail -1)
$()
bash
шаблон замены команды
bash
расширится !!
к последней выполняемой команде
|&
часть хитра. Обычно канал |
возьмет STDOUT примкнувшей команды левых и передавать его как STDIN к команде на правой стороне |
, в Вашем случае предыдущая команда печатает свой вывод на STDERR как сообщение об ошибке. Так, выполнение |
не помог бы, мы должны передать и STDOUT и STDERR (или только STDERR) к праву примкнул команда. |&
передаст STDOUT и STDERR оба, поскольку STDIN к праву примкнул команда. Поочередно, лучше можно только передать STDERR:
$(!! 2>&1 >/dev/null | tail -1)
tail -1
как обычно, распечатает последнюю строку от ее входа. Здесь вместо того, чтобы печатать последнюю строку можно быть более точными как печать строки, которая содержит apt-get install
команда:
$(!! 2>&1 >/dev/null | grep 'apt-get install')
при использовании эмулятора терминала под X, как gnome-terminal
, konsole
или xterm
, можно использовать X выборов для чего-то как копия и вставка:
Выбор целая строка для выполнения с тройной щелкают левой кнопкой .
Затем вставка это к командной строке с помощью щелкает средней кнопкой .
Это должно работать в большинстве эмуляторов терминала. Это использует основной выбор, не касаясь буфера обмена - они являются отдельными.
Это выбирает и затем объединило копию и вставку в одной операции, технически.
TL; DR: alias @@='$($(fc -ln -1) |& tail -1)'
Средства взаимодействия истории Bash не предлагают механизма для исследования вывода команд. Оболочка не хранит это, и расширение истории специально для команд, которые Вы самостоятельно выполнили, или части тех команд.
Это оставляет подход повторного выполнения последней команды и передачи по каналу и stdout и stderr (|&
) в замену команды. ответ heemayl достигает этого, но не может использоваться в псевдоним, потому что оболочка выполняет расширение истории прежде, чем развернуть псевдонимы, и не после.
Я не могу заставить расширение истории работать в функции оболочки также, даже путем включения его в функции с set -H
. Я подозреваю !!
в функции никогда не будет расширяться, и я не уверен, что она была бы расширена до того, если бы это было, но прямо сейчас я не уверен точно, почему это не.
Поэтому, если Вы хотите настроить вещи, таким образом, можно сделать это с очень небольшим вводом, необходимо использовать fc
оболочка, встроенная вместо расширения истории для извлечения последней команды из истории. Это имеет дополнительное преимущество, что оно работает, даже когда расширение истории отключено.
Как показано в ответе Gordon Davisson на Создание псевдонима, содержащего расширение истории удара (на Суперпользователе), $(fc -ln -1)
моделирует !!
. Включение этого для !!
в команде heemayl $(!! |& tail -1)
урожаи:
$($(fc -ln -1) |& tail -1)
Это работает как $(!! |& tail -1)
но может войти в определение псевдонима:
alias @@='$($(fc -ln -1) |& tail -1)'
После того, как Вы выполняете то определение или вставляете его .bash_aliases
или .bashrc
и запустите новую оболочку, можно просто ввести @@
(или независимо от того, что Вы назвали псевдоним) попытаться выполнить последнюю строку вывода от последней команды.
ek@Io:~$ alias @@='$($(fc -ln -1) |& tail -1)'
ek@Io:~$ evolution
The program 'evolution' is currently not installed. You can install it by typing:
sudo apt-get install evolution
ek@Io:~$ @@
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following extra packages will be installed:
evolution-common evolution-data-server evolution-data-server-online-accounts
....
Как Eliah Kagan упомянул , оболочка не хранит вывод команды. Однако существует способ получить последнюю строку последней команды вывода, , не выполняя команду снова , если Вы работаете , экран .
Поместил следующие строки в Вас ~/.screenrc
:
register t "^a[k0y$ ^a]^a^L"
bind t process t
Затем можно нажать Ctrl + t для вставки предыдущей строки в текущую подсказку. Было бы возможно заставить это также автоматически нажать Enter, но это - вероятно, лучшая идея проверить его, прежде чем Вы выполните и просто нажмете Enter вручную.
, Как это работает:
register t
регистры строка в буфер, названный t
. Строка после этого является сочетанием клавиш. bind t
связывает с ключом t (т.е. выполните использование Ctrl + t ), process t
средства оценивают содержание буфера, названного t
. ^a[
(= Ctrl [): перейдите к режиму копии k
, идут, каждый выстраивается в линию, 0
переходят к началу строки, y$
копия, пока конец строки, (пространство) не завершают команду ^a]
(= Ctrl ] ): скопированное содержание вставки ^a^L
(= Ctrl Ctrl L ) обновляет экран (иначе, вставляемое содержание не обнаружится, потому что Вы не вводили его сами TL; DR: Если вам нужно запустить строку secondlast
вывода последней команды:
alias @@='$($(fc -ln -1) |& tail -2 | head -1)'
В Ubuntu 19.10, когда команда не найдено и отображается команда sudo apt install
, перед следующей командной строкой есть пустая строка, поэтому при использовании: псевдоним @@ = '$ ($ (fc -ln -1) | & tail -1) '
net@net:~$ pip install -e ".[uvloop]"
Command 'pip' not found, but can be installed with:
sudo apt install python-pip
net@net:~$ @@
net@net:~$
В этом случае вам нужно получить вторую
строку вывода последней команды:
псевдоним @@ = '$ ($ (fc -ln -1) | & tail -2 | head -1)'
net@net:~$ pip install -e ".[uvloop]"
Command 'pip' not found, but can be installed with:
sudo apt install python-pip
net@net:~$ @@
[sudo] password for net:
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following additional packages will be installed:
...
...