Comando para colar meu comando e sua saída

9

Muitas vezes, quero postar algo em um bug do github como

$ 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

No momento, eu executo o comando, use screens C-a C-[para destacar a área, entercopiá-lo para esse buffer, colá-lo vim, gravá-lo em um arquivo e depois catem pbcopy. Tem que haver uma maneira melhor.

Existe um comando que eu possa executar e teeo comando que eu digitar prefixo com ae $toda a saída para pbcopy? Ou algo próximo? Eu imagino

$ 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
$

e agora a coisa original que colei está na minha área de transferência do mac.

Paul Tarjan
fonte
Isso é realmente específico para o OS X?
Phd #
Não. Qualquer utilidade usada para mover de um arquivo para uma área de transferência em outras plataformas poderia ser substituída pbcopye seria a mesma pergunta.
Paul Tarjan
2
Curioso: por que você não usa o mouse?
2
Você pode deixar de fora toda a parte do vim. Simplesmente corra pbcopye C-a C-]ao seu estilo.
@hop usando o mouse é lenta e não funciona bem quando há várias telas valor de texto
Paul Tarjan

Respostas:

10

Uma opção é ativar o rastreio (com -x) em um subshell que executa o comando. Isso grava o comando em STDERR e a saída padrão em STDOUT. Colete os dois e canalize para 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
fonte
set -xé uma abordagem interessante. Bem manchado!
DopeGhoti
Eu adoraria ver também meu comando impresso com muito (de preferência em 2 fluxos diferentes ainda), e gostaria +de ser$
Paul Tarjan
1
@PaulTarjan: altere o PS4 de acordo. Um exemple (não o que você precisa, mas mostra algumas possíveis opções): PS4='\\$ ${BASH_SOURCE[0]:-inherited}:line ${LINENO}:${FUNCNAME[0]:+${FUNCNAME[0]}(): } '. O "\\ $" torna "$" o primeiro caractere, e esse caractere é repetido para mostrar o nível da chamada. ($ para o primeiro nível, $$ para o segundo nível, etc.)
Olivier Dulac
7

Você pode usar o scriptutilitário para capturar toda a interação, incluindo seu prompt, comando e sua saída:

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

Você pode revisar o arquivo e seu conteúdo já estará na sua área de transferência.

Você também pode:

script temp.log 'somecommand'; cat temp.log | pbcopy
DopeGhoti
fonte
Está perto. Ele incluía todo o meu prompt, onde eu só queria um $ e ele me permite executar muitos comandos, onde eu quero apenas um, e adiciona um cabeçalho e rodapé que eu não quero.
Paul Tarjan
1
Eu não acho que ele pode suprimir seqüências ANSI (como por design existe para capturar a sessão inteira), mas você pode suprimir o cabeçalho. Verifique a página de manual para -q. Você pode usar sedpara remover os códigos ANSI: sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g"
DopeGhoti
2
Você pode usar script temp.log env PS1='$ ' bash --norcpara obter um bash com o prompt que deseja. Como alternativa, você pode editar o seu ~/.bashrcpara verificar o uso scripte alterar o prompt:[ $(ps -o command= -p $PPID) = 'script' ] && PS1='$ '
Eric
1

Do seu comentário sobre outra resposta , você não deseja que todo o prompt seja copiado, mas apenas $.

Como eu resolvo isso é simplesmente:

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

Fácil. Então eu uso o mouse para copiar e colar o prompt, comando e saída que eu quero.


Para um caso de uso diferente, no qual eu apenas quero que o comando, não sua saída e não o prompt, seja capaz de dar instruções a alguém, configurei um alias zv(perto de "Comando V" no teclado) para copiar o último comando para minha área de transferência :

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

Observe o uso de printfe substituição de comando para evitar a inclusão da nova linha à direita historyna área de transferência.

Curinga
fonte
0

No momento, eu executo o comando, use Ca C- da tela [para destacar a área, digite para copiá-lo para esse buffer,

Se você já usa, GNU screenpode copiar uma seleção diretamente usando uma ferramenta externa. Por exemplo, eu adicionei isso ~/.screenrcno Linux:

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

Agora posso marcar uma seleção com Control- a [, pressione Spacee agora pressione Control- a bpara executar xsel. Não é minha ideia, é realmente bastante comum . Observe que algumas pessoas o usam com ele em pbcopyvez dexsel fazê-lo funcionar sem problemas.

Arkadiusz Drabczyk
fonte