Команда для вставки моєї команди та її виводу


9

Часто я хочу щось додати до помилки github

$ ping google.com
PING google.com (216.58.195.238): 56 data bytes
Request timeout for icmp_seq 0
64 bytes from 216.58.195.238: icmp_seq=0 ttl=53 time=1064.747 ms

Зараз я запускаю команду, використовую screen, C-a C-[щоб виділити область, enterскопіювати її в цей буфер, вставити в неї vim, записати її у файл, а потім catу pbcopy. Має бути кращий спосіб.

Чи є команда, до якої я можу запустити teeкоманду, яку я введу з префіксом a $і весь вихід pbcopy? Або щось близьке? Я передбачу

$ demo ping google.com
PING google.com (216.58.195.238): 56 data bytes
Request timeout for icmp_seq 0
64 bytes from 216.58.195.238: icmp_seq=0 ttl=53 time=1064.747 ms
^C
$

і тепер оригінальна річ, яку я вставив, знаходиться в буфері обміну для Mac.


Це дійсно специфічно для OS X?
phk

Ні. Яку б утиліту ви не використовували для переміщення з файлу в буфер обміну на інших платформах, це може бути замінено, pbcopyі це було б те саме питання.
Пол Тарджан

2
Цікаво: чому ви не користуєтеся мишкою?

2
Ви можете залишити всю частину vim. Просто біжіть pbcopyі C-a C-]до його stdin.

@hop за допомогою миші відбувається повільно і не працює добре, коли в тексті є кілька екранів
Пол Тарджан

Відповіді:


10

Один із варіантів полягає в тому, щоб увімкнути відстеження (з -x) в підклітині, яка виконує команду. Це записує команду в STDERR і стандартний вихід на STDOUT. Зберіть обидва та передайте pbcopy:

$ ( set -x; ping -c 3 google.com ) 2>&1 | pbcopy

$ pbpaste
+ ping -c 3 google.com
PING google.com (173.194.217.138): 56 data bytes
64 bytes from 173.194.217.138: icmp_seq=0 ttl=44 time=37.436 ms
64 bytes from 173.194.217.138: icmp_seq=1 ttl=44 time=38.891 ms
64 bytes from 173.194.217.138: icmp_seq=2 ttl=44 time=39.329 ms
--- google.com ping statistics ---
3 packets transmitted, 3 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 37.436/38.552/39.329/0.809 ms

set -xцікавий підхід. Добре помічений!
DopeGhoti

Я хотів би також побачити, як моя команда надрукована (бажано, щоб у двох різних потоках все ще були), і я хотів би +бути$
Пол Тарджан

1
@PaulTarjan: тоді відповідно змініть PS4. Exemple (не те , що вам потрібно, але показує деякі можливі варіанти): PS4='\\$ ${BASH_SOURCE[0]:-inherited}:line ${LINENO}:${FUNCNAME[0]:+${FUNCNAME[0]}(): } '. Значення "\\ $" робить "$" першим символом, а потім цей символ повторюється, щоб показати рівень виклику. ($ для першого рівня, $$ для другого рівня тощо)
Олів'є Дулак

7

Ви можете скористатися scriptутилітою для зйомки всієї взаємодії, включаючи підказку, команду та її вихід:

script temp.log; cat temp.log | pbcopy
[ do stuff ]
[ end the interaction with ^D or logging out of the shell ]

Потім ви можете переглянути файл, і його вміст вже буде у вашому буфері обміну.

Ви також можете:

script temp.log 'somecommand'; cat temp.log | pbcopy

Це близько. Він містив весь мій підказки, де я просто хочу, $ і це дозволяє мені робити багато команд, де я хочу лише одну, і це додає заголовок і колонтитул, я не хочу.
Пол Тарджан

1
Я не думаю, що це може придушити послідовності ANSI (як за задумом, це там, щоб захопити весь сеанс), але ви можете придушити заголовок. Перевірте сторінку чоловіка -q. Ви можете sedзняти коди ANSI: sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g"
DopeGhoti

2
Ви можете використовувати, script temp.log env PS1='$ ' bash --norcщоб отримати баш з потрібним підказкою. Крім того, ви можете відредагувати свій документ, ~/.bashrcщоб перевірити його на використання scriptта змінити:[ $(ps -o command= -p $PPID) = 'script' ] && PS1='$ '
Ерік


1

З вашого коментаря до іншої відповіді ви не хочете, щоб весь ваш запит було скопійовано, але тільки $.

Як я це вирішую, просто:

16:54:53 [myname mydirectory] 535 $ bash
bash-3.2$ PS1='\$ '
$ echo some command
some command
$ exit
exit
16:57:17 [myname mydirectory] 536 $

Легко. Потім я використовую мишу, щоб скопіювати та вставити потрібний рядок, команду та вихід.


Для іншого випадку використання, коли я просто хочу, щоб команда, а не її вихід і не підказка, могли дати комусь інструкції, я створив псевдонім zv(близький до "Command V" на клавіатурі) для копіювання остання команда в мій буфер обміну :

alias zv='printf %s "$(history -p \!\!)" | pbcopy'

Зверніть увагу на використання printfта заміну команд, щоб уникнути включення нового букву historyв буфер обміну.


0

Зараз я запускаю команду, використовую Ca C- [, щоб виділити область, введіть, щоб скопіювати її в цей буфер,

Якщо ви вже використовуєте, GNU screenви можете скопіювати виділення безпосередньо за допомогою зовнішнього інструменту. Наприклад, я додав це до ~/.screenrcLinux:

bind b eval writebuf 'exec /bin/sh -c " xsel -i </tmp/screen-exchange"' 'exec /bin/sh -c "killall xsel"'

Тепер я можу відзначити вибір Жека Control- a [натисніть Spaceі тепер прес Control- a bбігти xsel. Це не моя ідея, це насправді досить поширене . Зауважте, що деякі люди використовують його pbcopyзамість цього,xsel щоб він працював у вас без проблем.

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