Как я могу выполнить последнюю строку вывода в Bash?

Я знаю, что могу запустить последнюю команду в bash, с !!, но как мне запустить последнюю строку вывода?

Я думаю о сценарии использования этого вывода:

The program 'git' is currently not installed. You can install it by typing:
sudo apt-get install git

Но я не знаю, как я могу управлять этим. Я имею в виду что-то вроде !!, может быть, @@ или подобное?


У Супер-пользователя тоже есть этот вопрос.

11
задан 20 March 2017 в 13:18

5 ответов

Команда $(!! |& 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')
    
15
ответ дан 20 March 2017 в 23:18
  • 1
    Да, это не присутствует. Вероятно, это было удалено случайно мной или автоматической чисткой. Я сообщаю, будет ли это, решил проблему.Спасибо. – Marco Sulla 9 August 2016 в 22:26

при использовании эмулятора терминала под X, как gnome-terminal, konsole или xterm, можно использовать X выборов для чего-то как копия и вставка:

Использование основной выбор

Выбор целая строка для выполнения с тройной щелкают левой кнопкой .

Затем вставка это к командной строке с помощью щелкает средней кнопкой .

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

2
ответ дан 20 March 2017 в 23:18
  • 1
    Как уменьшить некоторое пространство в левой стороне от/dev/sda7? Я попробовал его, но не могу уменьшить пространство с обеих сторон. – Muhammad Hassan 9 August 2016 в 22:55

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
....
6
ответ дан 20 March 2017 в 23:18

Как 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 ) обновляет экран (иначе, вставляемое содержание не обнаружится, потому что Вы не вводили его сами
1
ответ дан 4 October 2019 в 16:24

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:
...
...
0
ответ дан 21 April 2020 в 15:56

Другие вопросы по тегам:

Похожие вопросы: