Я знаю, что могу запустить последнюю команду в bash !!
, но как я могу запустить последнюю строку вывода?
Я думаю о случае использования этого вывода:
The program 'git' is currently not installed. You can install it by typing:
sudo apt-get install git
Но я не знаю, как я могу это запустить. Я думаю о чем-то похожем !!
, может быть @@
или похожем?
command_not_found_handle
функции оболочки или сценария, который она запускает (обычно просто/usr/lib/command-not-found
). Я думаю, вы могли бы сделать это так, чтобы вам предлагали интерактивную подсказку с опцией автоматической установки пакета или (возможно, лучше), чтобы имя пакета где-то сохранялось и могло быть установлено с помощью короткой команды. Это достаточно отличается от того, что вы спросили здесь, вы можете рассмотреть возможность размещения отдельного вопроса об этом.Ответы:
Команда
$(!! |& tail -1)
должна сделать:Как видите,
sudo apt-get install git
команда запущена.РЕДАКТИРОВАТЬ: ломать
$(!! |& tail -1)
$()
этоbash
шаблон подстановки командbash
расширится!!
до последней выполненной команды|&
часть хитрая. Обычно pipe|
принимает STDOUT левой команды и передает ее как STDIN команде справа|
, в вашем случае предыдущая команда выводит свой вывод на STDERR в виде сообщения об ошибке. Таким образом, выполнение|
не поможет, нам нужно передать как STDOUT, так и STDERR (или только STDERR) команде с правой стороны.|&
передаст STDOUT и STDERR как STDIN для правой команды. С другой стороны, лучше вы можете только передать STDERR:tail -1
как обычно, напечатает последнюю строку из своего ввода. Здесь вместо того, чтобы печатать последнюю строку, вы можете быть более точным, как печатать строку, содержащуюapt-get install
команду:источник
TL; DR:
alias @@='$($(fc -ln -1) |& tail -1)'
Средства взаимодействия с историей Bash не предлагают никакого механизма для проверки вывода команд. Оболочка не хранит это , и расширение истории специально для команд, которые вы сами запускаете, или частей этих команд.
Это оставляет подход повторного запуска последней команды и передачи как stdout, так и stderr (
|&
) в подстановку команд. Ответ Heemayl достигает этого, но не может использоваться в псевдониме, потому что оболочка выполняет расширение истории до расширения псевдонимов, а не после.Я не могу заставить расширение истории работать в функции оболочки, даже включив его в функцию с помощью
set -H
. Я подозреваю,!!
что функция никогда не будет расширена, и я не уверен, что она будет расширена, если бы она была, но сейчас я точно не знаю, почему это не так.Поэтому, если вы хотите настроить все так, чтобы вы могли делать это с минимальным набором текста, вы должны использовать
fc
встроенную оболочку вместо расширения истории, чтобы извлечь последнюю команду из истории. Это имеет дополнительное преимущество, заключающееся в том, что оно работает, даже если расширение истории отключеноКак показано в Гордоном Дэвиссоне «s ответа на создание псевдонима , содержащее расширение истории Баша (на Super User ),
$(fc -ln -1)
симулирует!!
. Подключив это в течение!!
в командных heemayl по$(!! |& tail -1)
урожайности:Это работает как,
$(!! |& tail -1)
но может идти в определении псевдонима:После того, как вы запустите это определение или вставите его в
.bash_aliases
или.bashrc
и запустите новую оболочку, вы можете просто напечатать@@
(или как бы вы ни назвали псевдоним), чтобы попытаться выполнить последнюю строку вывода из последней команды.источник
./script
, не то, что вы используете исходный код.
илиsource
встроенный - я не уверен. Bash добавляет к файлу при выходе из оболочки или при запускеhistory
с помощью-a
или-w
(см.help history
). В противном случае команды в нескольких интерактивных оболочках будут чередоваться (отображаются в порядке их запуска). Вы можете добавить его немедленно. , Но я думаю, что есть еще что-то, чтобы сделатьfc
работу в сценарии. Я предлагаю опубликовать новый вопрос по этому поводу. Если вы это сделаете, пожалуйста, не стесняйтесь комментировать здесь со ссылкой на него.Если вы используете эмулятор терминала под X, например
gnome-terminal
,konsole
илиxterm
, вы можете использовать выбор X для чего-то вроде копирования и вставки:Используйте основной выбор
Выберите всю строку для запуска с тройным щелчком левой кнопки .
Затем вставьте его в командную строку , используя среднюю кнопку .
Это должно работать в большинстве терминальных эмуляторов. Он использует первичный выбор, не касаясь буфера обмена - они раздельные.
Он выбирает, а затем объединяет копирование и вставку в одной операции, технически.
источник
Как отметил Элия Каган , оболочка не хранит вывод команды. Тем не менее, есть способ получить последнюю строку вывода последней команды, без повторного запуска команды , если вы запускаете screen .
Вставьте в вас следующие строки
~/.screenrc
:Затем вы можете нажать Ctrl+, atчтобы вставить предыдущую строку в текущее приглашение. Можно было бы сделать это также автоматически, нажав клавишу ввода, но, вероятно, лучше проверить это перед запуском и просто нажать клавишу ввода вручную.
Как это устроено:
register t
регистрирует строку в буфер с именемt
. Последующая строка является ключевой последовательностью.bind t
привязывается к ключу t(т. е. выполняется с использованием Ctrl+ at),process t
означает оценку содержимого буфера с именемt
.^a[
(= Ctrla[): войти в режим копированияk
перейти на одну строку вверх,0
перейти к началу строки,y$
скопировать до конца строки (пробел) завершить команду^a]
(= Ctrla]): вставить скопированный контент^a^L
(= CtrlaCtrlL) обновить экран (иначе вставленный контент не будет отображаться, потому что вы его не печатали самиисточник