คำสั่งสำหรับการวางคำสั่งของฉันและเอาท์พุทของมัน


9

บ่อยครั้งที่ฉันต้องการโพสต์สิ่งที่เป็นข้อบกพร่อง GitHub เช่น

$ 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

ตอนนี้ผมใช้คำสั่งการใช้งานscreen's C-a C-[เพื่อเน้นพื้นที่enterเพื่อคัดลอกไปบัฟเฟอร์ที่วางลงvim, เขียนไปยังแฟ้มแล้วที่เป็นcat pbcopyจะต้องมีวิธีที่ดีกว่า

มีคำสั่งที่ฉันสามารถเรียกใช้ซึ่งteeคำสั่งที่ฉันพิมพ์จะนำหน้าด้วย a $และเอาต์พุตทั้งหมดpbcopyหรือไม่ หรืออะไรที่ใกล้เคียง? ฉันจินตนาการ

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

และตอนนี้สิ่งดั้งเดิมที่ฉันวางอยู่ในคลิปบอร์ด mac ของฉัน


นี่เป็นสิ่งเฉพาะเจาะจงสำหรับ OS X หรือไม่
phk

Nope ยูทิลิตี้อะไรก็ตามที่คุณใช้เพื่อย้ายจากไฟล์ไปยังคลิปบอร์ดบนแพลตฟอร์มอื่น ๆ สามารถทดแทนได้pbcopyและมันก็เป็นคำถามเดียวกัน
Paul Tarjan

2
อยากรู้อยากเห็น: ทำไมคุณไม่ใช้เมาส์

2
คุณสามารถปล่อยให้ส่วนที่เป็นกลุ่มทั้งหมด เพียงแค่เรียกใช้pbcopyและC-a C-]ไปที่ stdin ของมัน

@hop การใช้เมาส์ช้าและใช้งานไม่ได้เมื่อมีข้อความหลายหน้าจอ
Paul Tarjan

คำตอบ:


10

ทางเลือกหนึ่งคือการเปิดใช้งานการติดตาม (พร้อม-x) ในเชลล์ย่อยที่รันคำสั่ง สิ่งนี้เขียนคำสั่งไปที่ STDERR และเอาต์พุตมาตรฐานไปยัง STDOUT รวบรวมทั้งสองและไปที่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เป็นวิธีที่น่าสนใจ เห็นดี!
DopeGhoti

ฉันชอบที่จะเห็นคำสั่งของฉันที่พิมพ์ออกมาด้วย (โดยเฉพาะอย่างยิ่งในลำธารที่แตกต่างกัน 2 ยัง) และต้องการ+จะเป็น$
Paul Tarjan

1
@PaulTarjan: จากนั้นเปลี่ยน PS4 ตามลำดับ กันตัวอย่าง (ไม่ใช่สิ่งที่คุณต้องการ PS4='\\$ ${BASH_SOURCE[0]:-inherited}:line ${LINENO}:${FUNCNAME[0]:+${FUNCNAME[0]}(): } 'แต่แสดงให้เห็นว่าตัวเลือกที่เป็นไปได้บางส่วน): "\\ $" ทำให้อักขระ "$" เป็นอักขระตัวแรกและอักขระนั้นจะถูกทำซ้ำเพื่อแสดงระดับการโทร ($ สำหรับระดับแรก, $$ สำหรับระดับที่สองเป็นต้น)
Olivier Dulac

7

คุณสามารถใช้scriptยูทิลิตีนี้เพื่อจับภาพการโต้ตอบทั้งหมดรวมถึงพรอมต์คำสั่งและผลลัพธ์ของมัน:

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

จากนั้นคุณสามารถตรวจสอบไฟล์และเนื้อหาจะอยู่ในคลิปบอร์ดของคุณ

นอกจากนี้คุณยังสามารถ:

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

ใกล้นี้ มันรวมพรอมต์ทั้งหมดของฉันในที่ที่ฉันต้องการ$ และมันทำให้ฉันทำคำสั่งมากมายที่ฉันต้องการเพียงอันเดียวและเพิ่มส่วนหัวและส่วนท้ายที่ฉันไม่ต้องการ
Paul Tarjan

1
ฉันไม่คิดว่ามันจะสามารถระงับการเรียงลำดับ ANSI ได้ (ตามการออกแบบมาเพื่อจับภาพเซสชันทั้งหมด) แต่คุณสามารถระงับส่วนหัวได้ -qตรวจสอบหน้าคนสำหรับ คุณสามารถใช้sedเพื่อตัดรหัส ANSI: sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g"
DopeGhoti

2
คุณสามารถใช้script temp.log env PS1='$ ' bash --norcเพื่อรับทุบตีพร้อมท์ที่คุณต้องการ หรือคุณสามารถแก้ไขของคุณ~/.bashrcเพื่อตรวจสอบการใช้งานscriptและแก้ไขพรอมต์:[ $(ps -o command= -p $PPID) = 'script' ] && PS1='$ '
Eric


1

จากความคิดเห็นในคำตอบอื่นคุณไม่ต้องการของคุณทั้งหมดพร้อมที่จะถูกคัดลอก $แต่เพียง

ฉันจะแก้ปัญหานี้ได้อย่างไร:

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

ง่าย. จากนั้นฉันใช้เมาส์เพื่อคัดลอกและวางพรอมต์คำสั่งและผลลัพธ์ที่ฉันต้องการ


สำหรับกรณีการใช้งานที่แตกต่างกันที่ฉันเพียงแค่ต้องการคำสั่งไม่ออกและไม่ได้ของพรอมต์ที่จะสามารถที่จะให้คำแนะนำใครสักคนฉันได้ตั้งค่านามแฝงzv(ใกล้เคียงกับคำสั่ง "V" บนแป้นพิมพ์) เพื่อคัดลอก คำสั่งสุดท้ายไปยังคลิปบอร์ดของฉัน :

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

จดบันทึกการใช้printfและการทดแทนคำสั่งเพื่อหลีกเลี่ยงการรวมบรรทัดใหม่ต่อท้ายจากhistoryไว้ในคลิปบอร์ด


0

ตอนนี้ฉันรันคำสั่งใช้หน้าจอ Ca C- [เพื่อไฮไลต์พื้นที่ป้อนเพื่อคัดลอกไปยังบัฟเฟอร์นั้น

หากคุณใช้อยู่แล้วGNU screenคุณสามารถคัดลอกส่วนที่เลือกได้โดยตรงโดยใช้เครื่องมือภายนอก ตัวอย่างเช่นฉันเพิ่มลง~/.screenrcใน Linux:

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

ตอนนี้ผมสามารถทำเครื่องหมาย wih เลือกControl- a [กดSpaceและตอนนี้กด Control- เพื่อให้ทำงานได้a b xselมันไม่ได้เป็นความคิดของฉันมันเป็นจริงค่อนข้างบ่อย โปรดทราบว่าบางคนใช้กับมันpbcopyแทนxselดังนั้นมันอาจทำงานให้คุณได้โดยไม่มีปัญหาใด ๆ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.