Comando para pegar mi comando y su salida

9

A menudo quiero publicar algo en un error de 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

En este momento ejecuto el comando, uso screen's C-a C-[para resaltar el área, entercopiarlo en ese búfer, pegarlo vim, escribirlo en un archivo y luego cateso pbcopy. Tiene que haber una mejor manera.

¿Hay un comando que se puede ejecutar el cual será teeel tipo de comando que con el prefijo $y la salida entera pbcopy? ¿O algo cercano? Me 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
$

y ahora lo original que pegué está en mi portapapeles mac.

Paul Tarjan
fuente
¿Es esto realmente específico para OS X?
phk
No Cualquier utilidad que use para pasar de un archivo a un portapapeles en otras plataformas podría sustituirse pbcopyy sería la misma pregunta.
Paul Tarjan
2
Curioso: ¿por qué no usas el mouse?
2
Puede omitir toda la parte vim. Simplemente ejecute pbcopyya C-a C-]su stdin.
@hop usando el mouse es lento y no funciona bien cuando hay múltiples pantallas de texto
Paul Tarjan

Respuestas:

10

Una opción es habilitar el rastreo (con -x) en una subshell que ejecuta el comando. Esto escribe el comando en STDERR y la salida estándar en STDOUT. Recoge ambos y canaliza a 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
fuente
set -xEs un enfoque interesante. ¡Bien descrito!
DopeGhoti
También me encantaría ver mi comando impreso (preferiblemente en 2 transmisiones diferentes todavía), y me gustaría +estar$
Paul Tarjan
1
@PaulTarjan: luego cambia la PS4 en consecuencia. Un exemple (no lo necesita, pero muestra algunas posibles opciones): PS4='\\$ ${BASH_SOURCE[0]:-inherited}:line ${LINENO}:${FUNCNAME[0]:+${FUNCNAME[0]}(): } '. El "\\ $" convierte a "$" en el primer carácter, y ese carácter se repite para mostrar el nivel de la llamada. ($ para el primer nivel, $$ para el segundo nivel, etc.)
Olivier Dulac
7

Puede usar la scriptutilidad para capturar toda la interacción, incluido su indicador, comando y su salida:

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

Luego puede revisar el archivo y su contenido ya estará en su portapapeles.

Tú también puedes:

script temp.log 'somecommand'; cat temp.log | pbcopy
DopeGhoti
fuente
Esto esta cerca. Incluyó todo mi mensaje donde solo quiero un $ y me permite hacer muchos comandos donde solo quiero uno, y agrega un encabezado y pie de página que no quiero.
Paul Tarjan
1
No creo que pueda suprimir secuencias ANSI (ya que por diseño está ahí para capturar toda la sesión), pero puede suprimir el encabezado. Consulte la página del manual para -q. Puede usar sedpara quitar los códigos ANSI: sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g"
DopeGhoti
2
Puede usar script temp.log env PS1='$ ' bash --norcpara obtener una fiesta con el mensaje que desee. Alternativamente, puede editar su ~/.bashrcpara verificar el uso scripty modificar la solicitud:[ $(ps -o command= -p $PPID) = 'script' ] && PS1='$ '
Eric
1

De su comentario en otra respuesta , no desea que se copie toda su solicitud, sino solo $.

Cómo resuelvo esto es simplemente:

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. Luego uso el mouse para copiar y pegar la solicitud, el comando y la salida que quiero.


Para un caso de uso diferente donde solo quiero que el comando, no su salida y no la solicitud, pueda dar instrucciones a alguien, he configurado un alias zv(cerca de "Comando V" en el teclado) para copiar el último comando a mi portapapeles :

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

Tenga en cuenta el uso printfy la sustitución de comandos para evitar incluir la nueva línea final desde historyel portapapeles.

Comodín
fuente
0

En este momento ejecuto el comando, uso Ca C- de la pantalla [para resaltar el área, ingresar para copiarlo en ese búfer,

Si ya lo usa GNU screen, puede copiar una selección directamente con una herramienta externa. Por ejemplo, agregué esto a ~/.screenrcLinux:

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

Ahora puedo marcar una selección con Control- a [, presionar Spacey ahora presionar Control- a bpara ejecutar xsel. No es mi idea, en realidad es bastante común . Tenga en cuenta que algunas personas lo usan en pbcopylugar de hacerlo, porxsel lo que puede funcionar para usted sin ningún problema.

Arkadiusz Drabczyk
fuente