Comando para colar meu comando e sua saída

9

Muitas vezes eu 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

Agora, executo o comando, use screen ' C-a C-[ para destacar a área, enter para copiá-lo para esse buffer, cole-o em vim , grave em um arquivo e, em seguida, cat em pbcopy . Tem que haver um jeito melhor.

Existe um comando que eu posso executar, que será tee do comando que eu digite prefixado com um $ e toda a saída para pbcopy ? Ou qualquer coisa perto? 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.

    
por Paul Tarjan 20.10.2016 / 19:28

5 respostas

10

Uma opção é ativar o rastreio (com -x ) em uma subshell que executa o comando. Isso grava o comando para STDERR e a saída padrão para STDOUT. Colete ambos 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
    
por 20.10.2016 / 20:13
7

Você pode usar o utilitário script 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
    
por 20.10.2016 / 20:00
1

iterm2 tem integração de shell que permite selecionar (e copiar automaticamente) a saída do último comando com o comando cmd-shift-A.

    
por 20.10.2016 / 22:08
1

Do seu comentário sobre outra resposta , você não quer que o seu prompt inteiro seja copiado, mas somente $ .

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, o comando e a saída que eu quero.

Para um caso de uso diferente em que apenas queremos que o comando, não sua saída e não o prompt, possa fornecer instruções a alguém, configurei um alias, zv ( perto de "Command 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 printf e a substituição de comando para evitar incluir a nova linha à direita de history na área de transferência.

    
por 21.10.2016 / 01:59
0

Right now I run the command, use screen's C-a C-[ to highlight the area, enter to copy it to that buffer,

Se você já usa GNU screen , pode copiar uma seleção diretamente usando uma ferramenta externa. Por exemplo, adicionei isso a ~/.screenrc no Linux:

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

Agora eu posso marcar uma seleção com Controle - a [, pressione Espaço e pressione Controle - a b para executar xsel . Não é meu idéia, é realmente bastante comum . Observe que algumas pessoas o usam com pbcopy em vez de xsel , por isso, trabalhar para você sem problemas.

    
por 21.10.2016 / 11:03