Lệnh để dán lệnh của tôi và đầu ra của nó


9

Thường thì tôi muốn đăng một cái gì đó lên một lỗi github như

$ 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

Ngay bây giờ tôi chạy lệnh, sử dụng screenC-a C-[để làm nổi bật khu vực, enterđể sao chép nó vào bộ đệm đó, dán nó vào vim, hãy viết nó vào một tập tin và sau đó catđó vào pbcopy. Có phải là một cách tốt hơn.

Có một lệnh tôi có thể chạy mà teelệnh tôi gõ có tiền tố với a $và tất cả đầu ra pbcopykhông? Hay bất cứ điều gì gần gũi? Tôi hình dung

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

và bây giờ điều ban đầu tôi dán là trong bảng tạm mac của tôi.


Đây có thực sự là cụ thể cho OS X?
phk

Không. Bất kỳ tiện ích nào bạn sử dụng để chuyển từ tệp sang bảng tạm trên các nền tảng khác đều có thể được thay thế pbcopyvà đó sẽ là cùng một câu hỏi.
Paul Tarjan

2
Tò mò: tại sao bạn không sử dụng chuột?

2
Bạn có thể bỏ qua toàn bộ phần vim. Đơn giản chỉ cần chạy pbcopyC-a C-]để stdin của nó.

@hop sử dụng chuột rất chậm và không hoạt động tốt khi có nhiều màn hình văn bản có giá trị
Paul Tarjan

Câu trả lời:


10

Một tùy chọn là cho phép theo dõi (với -x) trong một lớp con chạy lệnh. Điều này ghi lệnh vào STDERR và đầu ra tiêu chuẩn thành STDOUT. Thu thập cả hai và đường ống để 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 -xlà một cách tiếp cận thú vị. Cũng phát hiện ra!
DopeGhoti

Tôi cũng rất muốn thấy lệnh của tôi được in ra (tốt nhất là trên 2 luồng khác nhau) và muốn +$
Paul Tarjan

1
@PaulTarjan: sau đó thay đổi PS4 cho phù hợp. Một ví dụ (không phải những gì bạn cần, nhưng hiển thị một số tùy chọn có thể) : PS4='\\$ ${BASH_SOURCE[0]:-inherited}:line ${LINENO}:${FUNCNAME[0]:+${FUNCNAME[0]}(): } '. "\\ $" tạo "$" char đầu tiên và char đó sau đó được lặp lại để hiển thị mức độ cuộc gọi. ($ cho cấp đầu tiên, $$ cho cấp thứ hai, v.v.)
Olivier Dulac

7

Bạn có thể sử dụng scripttiện ích để nắm bắt toàn bộ tương tác bao gồm lời nhắc, lệnh và đầu ra của nó:

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

Sau đó, bạn có thể xem lại tệp và nội dung của tệp sẽ có trong bảng tạm của bạn.

Bạn cũng có thể:

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

Đây là gần. Nó bao gồm toàn bộ lời nhắc của tôi, nơi tôi chỉ muốn một $ và nó cho phép tôi thực hiện nhiều lệnh mà tôi chỉ muốn một, và nó thêm một tiêu đề và chân trang mà tôi không muốn.
Paul Tarjan

1
Tôi không nghĩ rằng nó có thể ngăn chặn các chuỗi ANSI (như thiết kế để có toàn bộ phiên), nhưng bạn có thể chặn tiêu đề. Kiểm tra trang người đàn ông cho -q. Bạn có thể sử dụng sedđể tách mã ANSI: sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g"
DopeGhoti

2
Bạn có thể sử dụng script temp.log env PS1='$ ' bash --norcđể có được một bash với lời nhắc bạn muốn. Ngoài ra, bạn có thể chỉnh sửa ~/.bashrcđể kiểm tra việc sử dụng scriptvà thay đổi lời nhắc:[ $(ps -o command= -p $PPID) = 'script' ] && PS1='$ '
Eric


1

Từ nhận xét của bạn về câu trả lời khác , bạn không muốn toàn bộ lời nhắc của mình được sao chép mà chỉ $.

Cách tôi giải quyết điều này chỉ đơn giản là:

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

Dễ dàng. Sau đó, tôi sử dụng chuột để sao chép và dán lời nhắc, lệnh và đầu ra mà tôi muốn.


Đối với trường hợp sử dụng khác, trong đó tôi chỉ muốn lệnh, không phải đầu ra và không phải lời nhắc, để có thể đưa ra hướng dẫn cho ai đó, tôi đã thiết lập bí danh, zv(gần với "Lệnh V" trên bàn phím) để sao chép lệnh cuối cùng vào clipboard của tôi :

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

Lưu ý việc sử dụng printfvà thay thế lệnh để tránh đưa dòng mới historyvào trong bảng tạm.


0

Ngay bây giờ tôi chạy lệnh, sử dụng màn hình Ca C- [để tô sáng khu vực, nhập để sao chép nó vào bộ đệm đó,

Nếu bạn đã sử dụng, GNU screenbạn có thể sao chép một lựa chọn trực tiếp bằng một công cụ bên ngoài. Ví dụ, tôi đã thêm cái này ~/.screenrcvào Linux:

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

Bây giờ tôi có thể đánh dấu một lựa chọn wih Control- a [, nhấn Spacevà bây giờ nhấn Control- a bđể chạy xsel. Đó không phải là ý tưởng của tôi, nó thực sự khá phổ biến . Lưu ý rằng một số người sử dụng nó pbcopythay vìxsel vậy nó có thể làm việc cho bạn mà không có vấn đề gì.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.