Perintah untuk menempelkan perintah saya dan hasilnya


9

Seringkali saya ingin memposting sesuatu ke bug github seperti

$ 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

Saat ini aku menjalankan perintah, penggunaan screen's C-a C-[untuk menyoroti daerah, enteruntuk menyalinnya ke buffer yang, paste ke vim, menulis ke sebuah file dan kemudian catyang menjadi pbcopy. Harus ada cara yang lebih baik.

Apakah ada perintah yang bisa saya jalankan yang akan teesaya ketik perintah awalan dengan $dan semua output untuk pbcopy? Atau sesuatu yang dekat? Saya membayangkan

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

dan sekarang hal asli yang saya tempel ada di clipboard mac saya.


Apakah ini benar-benar khusus untuk OS X?
phk

Nggak. Utilitas apa pun yang Anda gunakan untuk berpindah dari satu file ke clipboard di platform lain bisa diganti pbcopydan itu akan menjadi pertanyaan yang sama.
Paul Tarjan

2
Penasaran: mengapa Anda tidak menggunakan mouse?

2
Anda dapat meninggalkan seluruh bagian vim. Cukup jalankan pbcopydan C-a C-]ke stdin-nya.

@hop menggunakan mouse lambat dan tidak berfungsi dengan baik ketika ada beberapa layar bernilai teks
Paul Tarjan

Jawaban:


10

Salah satu opsi adalah mengaktifkan tracing (with -x) dalam subkulit yang menjalankan perintah. Ini menulis perintah ke STDERR dan output standar ke STDOUT. Kumpulkan keduanya dan pipa ke 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 -xadalah pendekatan yang menarik. Terlihat dengan baik!
DopeGhoti

Saya juga ingin melihat perintah saya dicetak (terutama pada 2 aliran yang berbeda), dan saya ingin +menjadi$
Paul Tarjan

1
@ PaulTarjan: lalu ganti PS4. Sebuah exemple (bukan apa yang Anda butuhkan, tetapi menunjukkan beberapa pilihan yang mungkin): PS4='\\$ ${BASH_SOURCE[0]:-inherited}:line ${LINENO}:${FUNCNAME[0]:+${FUNCNAME[0]}(): } '. "\\ $" menjadikan "$" char pertama, dan char itu kemudian diulang untuk menunjukkan tingkat panggilan. ($ untuk level pertama, $$ untuk level kedua, dll)
Olivier Dulac

7

Anda dapat menggunakan scriptutilitas untuk menangkap seluruh interaksi termasuk permintaan, perintah, dan hasilnya:

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

Anda kemudian dapat meninjau file, dan isinya sudah ada di clipboard Anda.

Anda juga bisa:

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

Ini dekat. Itu termasuk seluruh prompt saya di mana saya hanya ingin $ dan itu memungkinkan saya melakukan banyak perintah di mana saya hanya ingin satu, dan itu menambahkan header dan footer yang saya tidak inginkan.
Paul Tarjan

1
Saya tidak berpikir itu bisa menekan urutan ANSI (karena dengan desain itu ada untuk menangkap seluruh sesi), tetapi Anda dapat menekan header. Periksa halaman manual untuk -q. Anda dapat menggunakan seduntuk menghapus kode ANSI: sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g"
DopeGhoti

2
Anda dapat menggunakan script temp.log env PS1='$ ' bash --norcuntuk mendapatkan bash dengan prompt yang Anda inginkan. Atau Anda dapat mengedit Anda ~/.bashrcuntuk memeriksa penggunaan scriptdan mengubah prompt:[ $(ps -o command= -p $PPID) = 'script' ] && PS1='$ '
Eric


1

Dari komentar Anda pada jawaban lain , Anda tidak ingin seluruh permintaan Anda disalin, tetapi hanya $.

Bagaimana saya menyelesaikannya adalah:

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

Mudah. Kemudian saya menggunakan mouse untuk menyalin dan menempelkan prompt, perintah, dan output yang saya inginkan.


Untuk kasus penggunaan yang berbeda di mana saya hanya ingin perintah, bukan output dan bukan prompt, untuk dapat memberikan instruksi kepada seseorang, saya telah menyiapkan alias, zv(dekat dengan "Command V" pada keyboard) untuk menyalin perintah terakhir ke clipboard saya :

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

Perhatikan penggunaan printfdan perintah substitusi untuk menghindari memasukkan baris baru dari historydalam clipboard.


0

Sekarang saya menjalankan perintah, gunakan Ca C- [layar untuk menyorot area, masukkan untuk menyalinnya ke buffer itu,

Jika sudah menggunakan, GNU screenAnda dapat menyalin pilihan langsung menggunakan alat eksternal. Sebagai contoh, saya menambahkan ini ke ~/.screenrcLinux:

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

Sekarang saya dapat menandai pilihan dengan Control- a [, tekan Spacedan sekarang tekan Control- a buntuk menjalankan xsel. Itu bukan ide saya, itu sebenarnya sangat umum . Perhatikan bahwa beberapa orang menggunakannya dengan pbcopybukannyaxsel sehingga dapat bekerja untuk Anda tanpa masalah.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.