Comando per incollare il mio comando e il suo output


9

Spesso voglio pubblicare qualcosa su un bug github come

$ 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

In questo momento eseguo il comando, uso screen's C-a C-[per evidenziare l'area, enterper copiarlo in quel buffer, incollarlo vim, scriverlo in un file e poi catin pbcopy. Deve esserci un modo migliore.

Esiste un comando che posso eseguire quale sarà teeil comando digitato con il prefisso ae $tutto l'output pbcopy? O qualcosa di vicino? Immagino

$ 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 ora la cosa originale che ho incollato è negli appunti del mio mac.


È davvero specifico per OS X?
phk,

No. Qualunque utilità si usi per passare da un file a un blocco appunti su altre piattaforme potrebbe essere sostituita pbcopye sarebbe la stessa domanda.
Paul Tarjan,

2
Curioso: perché non usi il mouse?

2
Puoi tralasciare l'intera parte di VIM. Basta correre pbcopye C-a C-]al suo stdin.

@hop usando il mouse è lento e non funziona bene quando ci sono più schermate di testo
Paul Tarjan,

Risposte:


10

Un'opzione è abilitare la traccia (con -x) in una subshell che esegue il comando. Questo scrive il comando su STDERR e l'output standard su STDOUT. Raccogli entrambi e pipe per 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è un approccio interessante. Ben individuato!
DopeGhoti,

Mi piacerebbe vedere anche il mio comando stampato (preferibilmente su 2 flussi diversi ancora), e mi piacerebbe +essere$
Paul Tarjan,

1
@PaulTarjan: quindi modificare PS4 di conseguenza. Un esempio (non quello che ti serve, ma mostra alcune possibili opzioni): PS4='\\$ ${BASH_SOURCE[0]:-inherited}:line ${LINENO}:${FUNCNAME[0]:+${FUNCNAME[0]}(): } '. "\\ $" rende "$" il primo carattere e quel carattere viene quindi ripetuto per mostrare il livello di chiamata. ($ per il primo livello, $$ per il secondo livello, ecc.)
Olivier Dulac,

7

È possibile utilizzare l' scriptutilità per acquisire l'intera interazione incluso il prompt, il comando e il relativo output:

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

È quindi possibile rivedere il file e il suo contenuto sarà già negli Appunti.

Puoi anche:

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

Questo è vicino Comprendeva tutto il mio prompt dove volevo solo un $ e mi permette di fare molti comandi dove ne voglio solo uno, e aggiunge un'intestazione e un piè di pagina che non voglio.
Paul Tarjan,

1
Non penso che possa sopprimere le sequenze ANSI (come per progettazione è lì per catturare l'intera sessione), ma puoi sopprimere l'intestazione. Controlla la pagina man per -q. È possibile utilizzare sedper sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g"
rimuovere i

2
È possibile utilizzare script temp.log env PS1='$ ' bash --norcper ottenere un bash con il prompt desiderato. In alternativa puoi modificare il tuo ~/.bashrcper verificare l'uso scripte modificare il prompt:[ $(ps -o command= -p $PPID) = 'script' ] && PS1='$ '
Eric


1

Dal tuo commento su un'altra risposta , non vuoi che l' intero prompt venga copiato, ma solo $.

Come risolvo questo è semplicemente:

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

Facile. Quindi uso il mouse per copiare e incollare il prompt, il comando e l'output desiderati.


Per un caso d'uso diverso in cui voglio solo che il comando, non il suo output e non il prompt, sia in grado di dare istruzioni a qualcuno, ho impostato un alias, zv(vicino a "Comando V" sulla tastiera) per copiare il ultimo comando nei miei appunti :

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

Nota l'uso printfe la sostituzione del comando per evitare di includere la nuova riga finale historynegli appunti.


0

In questo momento eseguo il comando, uso lo schermo Ca C- [per evidenziare l'area, entrare per copiarlo in quel buffer,

Se usi già GNU screenpuoi copiare una selezione direttamente usando uno strumento esterno. Ad esempio, l'ho aggiunto a ~/.screenrcsu Linux:

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

Ora posso contrassegnare una selezione con Control- a [, premere Spacee ora premere Control- a bper eseguire xsel. Non è una mia idea, in realtà è abbastanza comune . Nota che alcune persone lo usano con pbcopyinvece dixsel così può funzionare per te senza problemi.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.