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


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 секунд.

Або, можливо, є спосіб написати плагін для Terminal


Тут може бути простіше знайти рішення, якщо ви зможете згодом додати деякі подробиці про те, що ви маєте намір робити зі змістом буфера обміну. Куди ви збираєтеся це вставити?
nohillside

так, щоб вставити його на іншу вкладку терміналу
Максим Єфремов

Відповіді:


17

Вставте це у своє ~/.bashrc ~/.bash_profileчи де завгодно:

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

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

Щоб пояснити, що відбувається: ви в основному використовуєте команду "fix fix" ( fc), щоб отримати останню команду, видаліть як провідне, так і зворотне пробіл для кращого форматування, awkа потім скопіюйте його на папку Mac з pbcopy.

Редагувати:

Тепер, коли ми знаємо, що ви хочете скопіювати, щоб вставити їх на іншу вкладку терміналу, є ще один варіант: додайте ці рядки до своєї ~/.bashrc ~/.bash_profileабо де завгодно:

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

Потім, після відкриття нових вкладок (назвемо їх "вкладка A" та "вкладка B"):

  1. Виконайте будь-яку команду на вкладці A
  2. Перейдіть на вкладку B, натисніть клавішу Enter на порожній рядок, даючи новий "новий" рядок (і, таким чином, повторно оцінюючи історію)
  3. використовуйте стрілку вгору один раз, і ви повинні мати команду, яку ви тільки що ввели у вкладці А.

EDIT 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". як і раніше отримує свою підсумку
Mike D

1
Я використовував це, поки не робив "git -reset --hard" на одному терміналі, а в іншому "нічого не підозрюючої папки git" натискав стрілку вгору і вводив поспіхом, як я думав, що запускав сценарій, який я використовував раніше. Ви можете собі уявити, що сталося, і це було востаннє, коли я використовував цю спільну "глобальну" історію
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=''(Це без лапок) будуть здирати трейлинг символ нового рядка, так що ви можете редагувати вставки тексту перед його запуском.


5

Це використовуватиме розширення історії, щоб схопити останню команду та повторити її. Ви можете передати, pbcopyщоб зберегти останню команду у буфер обміну.

> echo !! | pbcopy

Якщо ви хочете, щоб команда з вашої історії не була останньою , ви можете запустити:

> history

І посилайтесь на потрібний номер команди, наприклад:

> echo !5 | pbcopy

Це може бути вашим улюбленим, а може навіть спрацювати, але вам потрібно надати невелике пояснення щодо того, що насправді виконує команда , і як ОП (яка прийняла одну з відповідей п'ять років тому) може ефективно її використовувати.
IconDaemon

@IconDaemon гарний дзвінок. Я думаю, що це варто додати до старого питання, оскільки це простіше, ніж прийнята відповідь, оскільки не потребує будь-якої настройки профілю.
Сем Беррі

4

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

Вдалося це зробити з цитатами навколо !!:

echo "!!" | pbcopy


3

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

export HISTIGNORE=' *'

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

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

Напевно, тоді ви хочете зберегти команду як псевдонім, щоб полегшити запам'ятовування.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.