Команда для вставки моей команды и ее вывода

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

Сейчас я запускаю команду, использую screens, C-a C-[чтобы выделить область, enterскопировать ее в этот буфер, вставить в нее vim, записать в файл и затем catв pbcopy. Там должен быть лучший способ.

Есть ли команда, которую я могу запустить, которая будет teeнабираться с префиксом команды $и всем выводом 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-]к своему стандарту.
@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
JRFerguson
источник
set -xэто интересный подход. Хорошо подмечено!
DopeGhoti
Мне бы тоже хотелось, чтобы моя команда тоже была распечатана (желательно еще на 2-х разных потоках), и я бы хотел, +чтобы это было$
Пол Тарджан,
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
DopeGhoti
источник
Это близко Он включал всю мою подсказку, где я просто хочу, $ и он позволяет мне выполнять много команд, где я хочу только одну, и добавляет заголовок и нижний колонтитул, который я не хочу.
Пол Тарьян
1
Я не думаю, что он может подавлять последовательности ANSI (так как он предназначен для захвата всего сеанса), но вы можете подавить заголовок. Проверьте страницу руководства для -q. Вы можете использовать sedдля sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g"
удаления
2
Вы можете использовать, script temp.log env PS1='$ ' bash --norcчтобы получить bash с подсказкой, которую вы хотите. Кроме того, вы можете отредактировать свой, ~/.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в буфер обмена.

Wildcard
источник
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 чтобы он мог работать без проблем.

Аркадиуш Драбчик
источник