скопировать последнюю команду в терминал

22

Я могу увидеть последнюю команду в терминале, нажав, up arrowкак в следующем примере:

Я набрал cd /:

Makss-Mac:~ maks$ cd /

... нажата enter, команда cd /выполнена, и теперь я могу снова нажать up arrowи увидеть команду cd /:

Makss-Mac:/ maks$ cd /

Я хочу не только увидеть последнюю команду, но и скопировать ее в буфер обмена.

Может быть, существует ярлык, который не только показывает последнюю команду в терминале (как up arrowэто делают), но в то же время копирует ее в буфер обмена.

Или, может быть, есть ярлык для выбора всех из текущей строки терминала. И поэтому я смогу скопировать последнюю команду (после нажатия up arrow), нажав super+c. Конечно, я могу выбрать его с помощью мыши. Но когда команды в 10 раз длиннее, чем cd /это может быть слишком много времени, особенно если вы делаете это каждые 30 секунд.

Или, может быть, есть способ написать плагин для терминала

Максим Ефремов
источник
Здесь может быть проще найти решение, если бы вы могли добавить некоторые подробности о том, что вы собираетесь делать с содержимым буфера обмена впоследствии. Куда ты собираешься вставить его?
nohillside
да, чтобы вставить его в другую вкладку терминала
Максим Ефремов

Ответы:

17

Поместите это в свой ~/.bashrc ~/.bash_profileили где-нибудь, когда вам это нравится:

alias copyLastCmd='fc -ln -1 | awk '{$1=$1}1' | pbcopy '

После открытия нового окна (или запуска source ~/.bash_profile) вы сможете запустить copyLastCmdи сохранить команду в буфере обмена.

Чтобы объяснить, что происходит: вы в основном используете команду «fix command» ( fc), чтобы получить последнюю команду, удалите как начальные, так и завершающие пробелы для более удобного форматирования с помощью, awkа затем скопируйте ее в монтажную панель вашего Mac с помощью pbcopy.

РЕДАКТИРОВАТЬ:

Теперь, когда мы знаем, что вы хотите скопировать, чтобы вставить в другую вкладку терминала, есть еще один вариант: добавьте эти строки в свою ~/.bashrc ~/.bash_profileили где угодно:

shopt -s histappend
PROMPT_COMMAND='$PROMPT_COMMAND; history -a; history -n'

Затем, когда у вас откроются новые вкладки (назовем их «вкладка A» и «вкладка B»):

  1. Выполните любую команду на вкладке A
  2. Перейдите на вкладку B, нажмите ввод на пустой строке, давая вам «новую» новую строку (и, таким образом, переоценивая историю)
  3. используйте стрелку вверх один раз, и у вас должна быть команда, которую вы только что ввели на вкладке А.

РЕДАКТИРОВАТЬ 2: Я заменил использование sedс awkв первоначальном ответе выше, чтобы позаботиться как о начальных и конечных пробелах.

Асмус
источник
Это отличный псевдоним! Чтобы отрезать завершающую новую строку, чтобы вы могли редактировать команду после вставки, я использовал awk:alias copyLastCmd='fc -ln -1 | sed '1s/^[[:space:]]*//' | awk 1 ORS="" | pbcopy '
nwinkler
@nwinkler: О, ты прав, должен был использовать awk: fc -ln -1 | awk '{$1=$1}1'удалит как пробел, так и пробел.
Асмус
1
пришлось изменить псевдоним для специальных символов alias copyLastCmd="fc -ln -1 | awk '{\$1=\$1}1' | pbcopy". до сих пор получает мой голос
Майк D
1
Я использовал это, пока не выполнил «git -reset --hard» на одном терминале, а в другом «ничего не подозревающем git folder» нажал стрелку вверх и поспешно вошел, так как думал, что запускаю скрипт, который использовал раньше. Вы можете себе представить, что произошло, и это был последний раз, когда я использовал эту общую «глобальную» историю
MrGigu
@MrGigu случился со мной с «местной» историей, когда я случайно нажал стрелку «вверх», а не один раз, случайно - уроки усвоились, я полагаю.
Асмус
5

Вот еще один вариант, основанный на ответе @Asmus. Чтобы его псевдоним работал в моем скрипте bash, мне пришлось использовать небольшую кавычку, поскольку одинарные кавычки не работают в псевдониме, заключенном в одинарные кавычки, без каких-либо дополнительных кавычек:

alias copyLastCmd='fc -ln -1 | awk '\''{$1=$1}1'\'' | pbcopy'

В '\''основном закроет текущую цитату, затем добавит экранированную цитату, а затем снова откроет актуальную цитату.

Вышеприведенная версия скопирует последнюю команду в буфер обмена, и после ее вставки она сразу же будет выполнена, поскольку в конце будет новая строка .

Чтобы избавиться от новой строки в конце, чтобы вы могли отредактировать команду перед ее запуском, вы можете сделать следующее:

alias copyLastCmd='fc -ln -1 | awk '\''{$1=$1}1'\'' ORS='\'''\'' | pbcopy'

ORS=''(Это без кавычки) будут сдирать трейлинг символ новой строки, так что вы можете редактировать вставки текста перед его запуском.

nwinkler
источник
5

Это будет использовать расширение истории, чтобы захватить последнюю команду и повторить ее. Вы можете передать, чтобы pbcopyсохранить последнюю команду в буфер обмена.

> echo !! | pbcopy

Если вам нужна команда из вашей истории, которая была не последней , вы можете выполнить:

> history

И ссылаться на нужный номер команды, например:

> echo !5 | pbcopy
Сэм Берри
источник
Это может быть ваш любимый, и он может даже работать, но вам нужно дать небольшое объяснение того, что на самом деле делает команда , и как OP (который принял один из ответов пять лет назад) может эффективно использовать ее.
IconDaemon
@IconDaemon хороший звонок. Я думаю, что это стоит добавить к старому вопросу, потому что он проще, чем принятый ответ, так как не требует никакой настройки профиля.
Сэм Берри
4

Я пришел сюда, поскольку придумал точно такой же ответ Сэма Берри, но он не работает для меня (OSX 10.14.6).

Удалось сделать это с помощью кавычек вокруг !!:

echo "!!" | pbcopy

Крис Гиллатт
источник
3

Вы можете настроить свою историю на игнорирование команд, начинающихся с пробела:

export HISTIGNORE=' *'

А затем выполните следующую команду, чтобы добавить последнюю команду в буфер обмена (убедитесь, что у вас есть пробел в начале):

history 1 | cut -d " " -f 4- | pbcopy

Возможно, вы захотите сохранить команду как псевдоним, чтобы ее было легче запомнить.

kidbrax
источник